diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 142fe13ebf..fd79f6a258 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -50,7 +50,7 @@ jobs: cd ../Mindustry - name: Create artifacts run: | - ./gradlew desktop:dist server:dist core:mergedJavadoc -Pbuildversion=${RELEASE_VERSION:1} + ./gradlew desktop:dist server:dist core:depsJar core:mergedJavadoc -Pbuildversion=${RELEASE_VERSION:1} - name: Update docs run: | cd ../ @@ -90,3 +90,10 @@ jobs: file: server/build/libs/server-release.jar tag: ${{ github.ref }} + - name: Upload dependency JAR + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: core/build/libs/core-release-deps.jar + asset_name: dependencies.jar + tag: ${{ github.ref }} \ No newline at end of file diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 0b1641ab17..d9d254383e 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -41,6 +41,18 @@ jobs: git commit -m "Automatic bundle update" git push fi + - name: Update scripts and class mappings + if: ${{ github.repository == 'Anuken/Mindustry' }} + run: | + ./gradlew updateScripts + + if [ -n "$(git status --porcelain)" ]; then + git config --global user.name "Github Actions" + git config --global user.email "actions@github.com" + git add core/assets/scripts/* core/src/mindustry/mod/ClassMap.java + git commit -m "Automatic class mapping update" + git push + fi - name: Update JITpack repo if: ${{ github.repository == 'Anuken/Mindustry' }} run: | diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 4078c59538..868acaa1aa 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -14,7 +14,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:isGame="true" android:theme="@style/ArcTheme" - android:usesCleartextTraffic="true" android:appCategory="game" android:label="@string/app_name" android:fullBackupContent="@xml/backup_rules" diff --git a/android/build.gradle b/android/build.gradle index 7e66a790f1..ce3a5d4374 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -16,7 +16,7 @@ configurations{ natives } repositories{ mavenCentral() - maven{ url "https://maven.google.com" } + maven{ url = "https://maven.google.com" } } task deploy(type: Copy){ @@ -71,7 +71,7 @@ android{ } props.store(file('../core/assets/version.properties').newWriter(), null) - multiDexEnabled true + multiDexEnabled = true } compileOptions{ @@ -114,7 +114,7 @@ android{ if(project.hasProperty("RELEASE_STORE_FILE") || System.getenv("CI") == "true"){ buildTypes{ release{ - signingConfig signingConfigs.release + signingConfig = signingConfigs.release } } } diff --git a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java index d13d4bae3c..88f3e78818 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/CallGenerator.java @@ -56,6 +56,15 @@ public class CallGenerator{ packet.addMethod(writeHandleMethod(ent, true)); } + if(!(ent.where.isClient && ent.where.isServer)){ + packet.addMethod( MethodSpec.methodBuilder("allow") + .addModifiers(Modifier.PUBLIC) + .addParameter(boolean.class, "server") + .addAnnotation(Override.class) + .returns(boolean.class) + .addCode("return " + (ent.where.isClient ? "server" : "!server") + ";").build()); + } + //register packet register.addStatement("mindustry.net.Net.registerPacket($L.$L::new)", packageName, ent.packetClassName); diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 0c04c4de0b..24e21b4060 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -19,6 +19,7 @@ mindustry.entities.comp.DecalComp=8 mindustry.entities.comp.EffectStateComp=9 mindustry.entities.comp.FireComp=10 mindustry.entities.comp.LaunchCoreComp=11 +mindustry.entities.comp.LocationPingComp=48 mindustry.entities.comp.PlayerComp=12 mindustry.entities.comp.PosTeam=27 mindustry.entities.comp.PosTeamDef=28 diff --git a/build.gradle b/build.gradle index 25ea07ad30..166ec7fd2f 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ buildscript{ mavenLocal() mavenCentral() google() - maven{ url 'https://jitpack.io' } + maven{ url = 'https://jitpack.io' } } dependencies{ @@ -27,8 +27,8 @@ buildscript{ } plugins{ - id "org.jetbrains.kotlin.jvm" version "2.1.10" - id "org.jetbrains.kotlin.kapt" version "2.1.10" + id "org.jetbrains.kotlin.jvm" version "2.3.20" + id "org.jetbrains.kotlin.kapt" version "2.3.20" } allprojects{ @@ -180,8 +180,8 @@ allprojects{ repositories{ mavenLocal() mavenCentral() - maven{ url "https://central.sonatype.com/repository/maven-snapshots" } - maven{ url 'https://jitpack.io' } + maven{ url = "https://central.sonatype.com/repository/maven-snapshots" } + maven{ url = 'https://jitpack.io' } } task clearCache{ @@ -302,6 +302,27 @@ project(":core"){ } } + task depsJar(type: Jar, dependsOn: [classes, ":server:dist"]){ + archiveClassifier = 'deps' + from files(sourceSets.main.output.classesDirs) + from{ configurations.runtimeClasspath.collect{ it.isDirectory() ? it : zipTree(it) } } + from zipTree("../server/build/libs/server-release.jar") + from files("src/") + from files("../../Arc/arc-core/src/") + from files("../../Arc/extensions/arcnet/src/") + from files("../../Arc/extensions/g3d/src/") + from files("../../Arc/extensions/flabel/src/") + from files("../../Arc/extensions/freetype/src/") + from files("../server/src/") + + exclude("META-INF/**") + exclude("vfxshaders/**") + exclude("maps/**") + exclude("baseparts/**") + exclude("vfxshaders/**") + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } + task sourcesJar(type: Jar, dependsOn: classes){ archiveClassifier = 'sources' from sourceSets.main.allSource @@ -394,6 +415,7 @@ project(":tests"){ testImplementation arcModule("backends:backend-headless") testImplementation "org.json:json:20230618" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.7.1" + testRuntimeOnly "org.junit.platform:junit-platform-launcher" } tasks.withType(JavaCompile){ @@ -405,6 +427,7 @@ project(":tests"){ test{ //fork every test so mods don't interact with each other forkEvery = 1 + jvmArgs = ["-XX:+HeapDumpOnOutOfMemoryError"] useJUnitPlatform() workingDir = new File("../core/assets") testLogging{ @@ -448,10 +471,6 @@ configure([":core", ":server"].collect{project(it)}){ publications{ maven(MavenPublication){ from components.java - //TODO: uncomment this once the jitpack packing is fixed (currently depends on a newer glibc version) - //if(project.name == "core"){ - // artifact(tasks.named("assetsJar")) - //} } } } @@ -472,7 +491,6 @@ task deployAll{ dependsOn cleanDeployOutput dependsOn "desktop:packrLinux64" dependsOn "desktop:packrWindows64" - dependsOn "desktop:packrWindows32" dependsOn "desktop:packrMacOS" if(versionModifier != "steam"){ dependsOn "server:deploy" diff --git a/core/assets-raw/sprites/blocks/logic/large-canvas-corner1.png b/core/assets-raw/sprites/blocks/logic/large-canvas-corner1.png new file mode 100644 index 0000000000..58f54ed6bc Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-canvas-corner1.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-canvas-corner2.png b/core/assets-raw/sprites/blocks/logic/large-canvas-corner2.png new file mode 100644 index 0000000000..2c33d06652 Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-canvas-corner2.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-canvas-side1.png b/core/assets-raw/sprites/blocks/logic/large-canvas-side1.png new file mode 100644 index 0000000000..8070b5f929 Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-canvas-side1.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-canvas-side2.png b/core/assets-raw/sprites/blocks/logic/large-canvas-side2.png new file mode 100644 index 0000000000..e6680543e2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-canvas-side2.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-canvas.png b/core/assets-raw/sprites/blocks/logic/large-canvas.png new file mode 100644 index 0000000000..ab09c2aa1f Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-canvas.png differ diff --git a/core/assets-raw/sprites/ui/sectors/sector-craters.png b/core/assets-raw/sprites/ui/sectors/sector-crateredBattleground.png similarity index 100% rename from core/assets-raw/sprites/ui/sectors/sector-craters.png rename to core/assets-raw/sprites/ui/sectors/sector-crateredBattleground.png diff --git a/core/assets-raw/sprites/ui/sectors/sector-littoralShipyard.png b/core/assets-raw/sprites/ui/sectors/sector-littoralShipyard.png new file mode 100644 index 0000000000..dc67961140 Binary files /dev/null and b/core/assets-raw/sprites/ui/sectors/sector-littoralShipyard.png differ diff --git a/core/assets-raw/sprites/ui/sectors/sector-planetaryTerminal.png b/core/assets-raw/sprites/ui/sectors/sector-planetaryTerminal.png index b9477855c0..dfd4d8dd3d 100644 Binary files a/core/assets-raw/sprites/ui/sectors/sector-planetaryTerminal.png and b/core/assets-raw/sprites/ui/sectors/sector-planetaryTerminal.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 98a86da1a5..a1a0806b9a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -15,6 +15,7 @@ link.wiki.description = Official Mindustry wiki link.suggestions.description = Suggest new features link.bug.description = Found one? Report it here linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Failed to open link!\nThe URL has been copied to your clipboard. screenshot = Screenshot saved to {0} screenshot.invalid = Map too large, potentially not enough memory for screenshot. @@ -124,6 +125,8 @@ maps.none = [lightgray]No maps found! invalid = Invalid pickcolor = Pick Color color = Color +import = Import +export = Export preparingconfig = Preparing Config preparingcontent = Preparing Content uploadingcontent = Uploading Content @@ -212,6 +215,10 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nMore difficult. Higher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended, more content.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\n\ +Sector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\n\ +For a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Researched techtree = Tech Tree techtree.select = Tech Tree Selection @@ -354,11 +361,12 @@ save.mode = Gamemode: {0} save.date = Last Saved: {0} save.playtime = Playtime: {0} dontshowagain = Don't show again -warning = Warning. +warning = Warning! confirm = Confirm delete = Delete view.workshop = View In Workshop workshop.listing = Edit Workshop Listing +hide = Hide ok = OK open = Open customize = Customize Rules @@ -370,7 +378,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +388,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Open Link @@ -428,6 +437,7 @@ saveimage = Save Image unknown = Unknown custom = Custom builtin = Built-In +modded = Modded map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! map.random = [accent]Random Map map.nospawn = This map does not have any cores for the player to spawn in! Add a {0} core to this map in the editor. @@ -488,10 +498,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +541,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -748,7 +763,8 @@ objective.buildunit = [accent]Build Unit: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] -objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyairunits = [accent]Enemy air unit production begins in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]\u26A0 Missile launch detected: [lightgray]{0} @@ -835,7 +851,8 @@ sector.changeicon = Change Icon sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector -sector.foundationrequired = [lightgray] Core: Foundation Required +sector.foundationrequired = [lightgray] Core: Foundation Required Nearby +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +860,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +883,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +911,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Mace units. Destroy it. @@ -1045,6 +1067,7 @@ stat.boosteffect = Boost Effect stat.maxunits = Max Active Units stat.health = Health stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Build Time stat.maxconsecutive = Max Consecutive stat.buildcost = Build Cost @@ -1179,8 +1202,8 @@ bullet.splashdamage = [stat]{0}[lightgray] area dmg ~ [stat]{1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor pierce bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0}[lightgray] seconds of repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1283,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animated Surfaces setting.animatedshields.name = Animated Shields setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Enemy Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls (Experimental) @@ -1269,6 +1294,8 @@ setting.fpscap.none = None setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Always Diagonal Placement setting.screenshake.name = Screen Shake setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1309,6 @@ setting.saveinterval.name = Save Interval setting.seconds = {0} seconds setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Show FPS & Ping setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1327,6 @@ setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound -setting.crashreport.name = Send Anonymous Crash Reports setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1357,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Clear Building @@ -1357,13 +1382,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1509,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Infinite Enemy Team Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier @@ -1526,6 +1553,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2005,8 +2033,8 @@ block.radar.name = Radar block.build-tower.name = Build Tower block.regen-projector.name = Regen Projector block.shockwave-tower.name = Shockwave Tower -block.shield-projector.name = Shield Projector -block.large-shield-projector.name = Large Shield Projector +block.shield-projector.name = Barrier Projector +block.large-shield-projector.name = Large Barrier Projector block.armored-duct.name = Armored Duct block.overflow-duct.name = Overflow Duct block.underflow-duct.name = Underflow Duct @@ -2058,6 +2086,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2149,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional :core-shard: [accent]Cores[] may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2180,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2546,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at enemy targets. unit.mace.description = Fires streams of flame at enemy targets. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 335407684e..125fddb46e 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -15,6 +15,7 @@ link.wiki.description = Афіцыйная вікі link.suggestions.description = Прапанаваць новыя функцыі link.bug.description = Знайшлі памылку? Паведаміць пра яе тут linkopen = Гэты сервер адправіў вам спасылку. Ці жадаеце адкрыць я?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Не атрымалася адкрыць спасылку!\nURL-адрэс быў скапіяваны ў буфер абмена. screenshot = Cкрыншот захаваны ў {0} screenshot.invalid = Карта занадта вялікая, магчыма, не хапае памяці для скрыншота. @@ -124,6 +125,8 @@ maps.none = [lightgray]Карты не знойдзены! invalid = Недапушчальны pickcolor = Выбраць колер color = Color +import = Import +export = Export preparingconfig = Падрыхтоўка канфігурацыі preparingcontent = Падрыхтоўка змесціва uploadingcontent = Выгрузка змесціва @@ -212,6 +215,8 @@ campaign.none = [lightgray]Выберыце з якой планеты пача campaign.erekir = Навей, больш удасканаленага кантэнту. Больш лінейнае праходжанне кампаніі.\n\nБольш якасныя карты і агульны вопыт. campaign.serpulo = Старэйшы кантэнт; класічны вопыт. Больш адкрытая.\n\nЗусім не збалансаваныя карты і механікі кампаніі. Менш удасканаленага. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Завершаны techtree = Дрэва\n Тэхналогій techtree.select = Выбар Дрэва Тэхналогій @@ -359,6 +364,7 @@ confirm = Пацверджанне delete = Выдаліць view.workshop = Прагледзець у майстэрні workshop.listing = Змяніць інфармацыю ў майстэрні +hide = Hide ok = ОК open = Адкрыць customize = наладзіць правілы @@ -370,7 +376,6 @@ command.repair = Рамантаваць command.rebuild = Перабудоўваць command.assist = Следаваць За Гульцом command.move = Рухацца -command.boost = Узляцець command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = адкрыць спасылку @@ -428,6 +435,7 @@ saveimage = Захаваць малюнак unknown = Невядома custom = Карыстацкая builtin = Убудаваная +modded = Modded map.delete.confirm = Вы сапраўды жадаеце выдаліць гэтую карту? Гэта дзеянне не можа быць адменена! map.random = [accent]Выпадковая карта map.nospawn = Гэтая карта не мае ні аднаго ядра, у якім гулец можа з’явіцца! Дадайце {0} ядро на гэтую карту ў рэдактары. @@ -488,10 +496,14 @@ editor.center = Цантраваць editor.search = Пошук мапаў... editor.filters = Фільтраваць Мапы editor.filters.mode = Гульнявыя Рэжымы: +editor.filters.priorities = Priorities: editor.filters.type = Тып Мапы: editor.filters.search = Шукаць У: editor.filters.author = Аўтар editor.filters.description = Апісанне +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Майстэрня @@ -527,6 +539,7 @@ waves.search = Пошук хваль... waves.filter = Фільтраваць Юнітав waves.units.hide = Схаваць Усё waves.units.show = Паказаць Усё +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = колькацсь адзінак @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Знішчыць: [][lightgray]{0}[]x Адзі objective.enemiesapproaching = [accent]Ворагі зявяцца праз [lightgray]{0}[] objective.enemyescelating = [accent]Павышэнне скорасці варожай вытворчасці праз [lightgray]{0}[] objective.enemyairunits = [accent]Вытворчасць варожых паветранных адзінкаў пачынаецца праз [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Знішчыць Варожае Ядро objective.command = [accent]Кантраляваць Адзінкі objective.nuclearlaunch = [accent]⚠ Ядзерны запуск выяўлены: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Немагчыма Пераключыцца на Сек sector.noswitch = Вы не можаце пераключацца на сектары калі гэты сектар атакуецца.\n\nСектар: [accent]{0}[] у [accent]{1}[] sector.view = Праглядзець Сектар sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Нізкая threat.medium = Сярэдняя @@ -843,6 +858,10 @@ threat.high = Высокая threat.extreme = Экстрымальная threat.eradication = Вынішчэнне +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Сонца sector.impact0078.name = Аварыя 0078 sector.groundZero.name = Пачатковая Кропка -sector.craters.name = Кратары +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Ледзяны Лес sector.ruinousShores.name = Берагавыя Руіны sector.stainedMountains.name = Афарбаваныя Горы @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Аптымальнае месца каб пачаць. Нізкая варожая пагроза. Мала рэсурсаў.\nВазімце як мага болей свінца і медзі.\nІ рухайцеся далей. sector.frozenForest.description = Нават тут, бліжэй да гор, распаўсюдзіліся споры. Ледзяныя тэмпературы не могуць утрымліваць іх заўсёды.\n\nПачніце выкарыстоўваць энергію. Пабудуйце генератары на цвёрдым паліве. Даведайцеся як выкарыстоуваць рэгенератары. sector.saltFlats.description = На ўскраінах пустыні ляжаць Саланчакі. Мала рэсурсаў знаходзіцца ў гэтым месцы.\n\nВораг стварыў тут комплекс захавання рэсурсаў. Знішчыце іх ядро. Нічога не застаўце на месцы. -sector.craters.description = Вада сабралася ў гэтым кратары, рэліквіі старых войн. Захапіце вобласць. Збярыце пясок. Выплаўце меташкло. Вадзяныя помпы каб ахладжваць турэлі буры. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Ператварыўшаяся ў мусар, берагавая лінія. Раней, гэта лакацыя была раёнам берагавой абароны. Мала што ад яе засталося. Толькі самыя простыя абарончыя структуры засталіся непашкоджанымі, усё яшчэ ператвораныя ў металалом.\nПрацягніце пашырэнне па-за гэты сектар. Адкрыйце нанава гэту тэхналогію. sector.stainedMountains.description = Далей ідзе востраў на якім ляжаць горы, яшчэ не заплямлены спорамі.\nДабудзьце багата тытану ў гэтым сектары. Даведайцеся як выкарыстоуваць яго.\n\nВарожая прысутнасць тут мацней. Не дайце ім часу каб адправіць іх мацнейшыя адзінкі. sector.overgrowth.description = Гэты сектар зарос, бліжэйшы да крыніцы спораў.\nВораг заснаваў тутThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Эфект паскарэння stat.maxunits = Максімальная колькасць актыўных адзінак stat.health = Здароўе stat.armor = Браня +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Час будаўніцтва stat.maxconsecutive = Максімальны Запар stat.buildcost = Кошт будаўніцтва @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat] {0} [lightgray]страты ў радыусе ~ [st bullet.incendiary = [stat] запальны bullet.homing = [stat] саманаводных bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Адключыць Мадыфікацыі Пры setting.animatedwater.name = Аніміраваныя вада setting.animatedshields.name = Аніміраваныя шчыты setting.playerindicators.name = Індыкатары Гульцоў +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Індыкатары размяшчэння саюзнікаў і ворагаў setting.autotarget.name = Автозахват мэты setting.keyboard.name = Мыш + Упраўленне з клавіятуры @@ -1269,6 +1292,8 @@ setting.fpscap.none = Неабмежаваны setting.fpscap.text = {0} FPS setting.uiscale.name = Маштаб карыстальніцкага інтэрфейсу [lightgray] (перазапусьціцца)[] setting.uiscale.description = Каб змены ўжыліся патрабуецца перазапуск. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Заўсёды дыяганальнае размяшчэнне setting.screenshake.name = Трасяніна экрана setting.bloomintensity.name = Інтэнсіўнасць Цвету @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Інтэрвал захавання setting.seconds = {0} секунд setting.milliseconds = {0} мілісекунд setting.fullscreen.name = Поўнаэкранны рэжым -setting.borderlesswindow.name = Бязрамачнае акно [lightgray] (можа спатрэбіцца перазапуск) -setting.borderlesswindow.name.windows = Бязрамачны Поўны Экран -setting.borderlesswindow.description = Каб ужыць змены можа патрабавацца перазапуск. setting.fps.name = Паказваць FPS і пінг setting.console.name = Уключыць Тэрмінал setting.smoothcamera.name = Павольная Камера @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Гучнасць акружэння setting.mutemusic.name = Заглушыць музыку setting.sfxvol.name = Гучнасць эфектаў setting.mutesound.name = Заглушыць гук -setting.crashreport.name = Адпраўляць ананімныя справаздачы аб вылетах setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Аўтаматычнае стварэнне захаванняў setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Сеткавая гульня category.blocks.name = Выбар Блока placement.blockselectkeys = \n[lightgray]Клавіша: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Перазяўленне keybind.control.name = Кантраляваць Адзінку keybind.clear_building.name = Ачысціць план будаўніцтва @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Бясконцыя рэсурсы ІІ (чырвоная каманда) rules.blockhealthmultiplier = Множнік здароўя блокаў rules.blockdamagemultiplier = Множнік Пашкоджання Блокам +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Множнік хуткасці вытворчасці баяв. адз. rules.unitcostmultiplier = Множыцель Кошту Адзінак rules.unithealthmultiplier = Множнік здароўя баяв. адз. @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Агонь rules.anyenv = <Любы> rules.explosions = Падрыўныя пашкоджанні Блока/Адзінкі @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Узмоцнены Выгрузачны block.payload-mass-driver.name = Выгрузачны Кіроўца Масс block.small-deconstructor.name = Маленькі Дэканструктар block.canvas.name = Палатно +block.large-canvas.name = Large Canvas block.world-processor.name = Працэсар Свету block.world-cell.name = Клетка Свету block.tank-fabricator.name = Фабрыкатар Танкаў @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Націсніце і утрымайце[] hint.payloadDrop = Націсніце [accent]][] каб збросіць груз. hint.payloadDrop.mobile = [accent]Націсніце і ўтрымайце[] пустое месца каб збросіць груз тут. hint.waveFire = Турэлі [accent]Хваля[] заражаныя вадой будуць тушыць полымя побач. -hint.generator = :combustion-generator: [accent]Генератары Згарання[] падпальваюць вугаль і перанакіраванне энергію суседнім блокам.\n\nРадыюс перадачы энергіі можа быць пашыраны з дапамогай :power-node: [accent]Энергетычных Вузлоў[]. hint.guardian = Адзінкі [accent]Вартаўнік[] браніраваныя. Слабыя патроны такія як [accent]Медзь[] і [accent]Свінец[] [scarlet]не эфетўныя[].\n\nВыкарыстоўвайце больш моцныя турэлі або :graphite: [accent]Графіт[] у :duo:Двайных Турэлях/:salvo:Залпах каб знішчыць Вартаўніка. hint.coreUpgrade = Ядра могуць быць палепшаны [accent]размяшчэннем больш моцных паверх другіх[].\n\nРазмясціце ядро :core-foundation: [accent]Штаб[] паверх ядра :core-shard: [accent]Аскепак[]. Пераканайцеся, што гэта свабодна ад канструкцый побач. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Усё што пастроена ў гэтай вобласцт бу gz.zone3 = Хваля амаль пачалася.\nПрыгатуйцеся. gz.finish = Пабудуйце больш турэляў, дабудзьце больш рэсурсаў,\nі вытрывайце ад усе хвалі каб [accent]захапіць гэты сектар[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index 6a47c656f9..b0e5188eeb 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -15,6 +15,7 @@ link.wiki.description = Официално Mindustry ръководство link.suggestions.description = Предложете Вашата идея link.bug.description = Намерихте грешка? Съобщете тук linkopen = Този сървър Ви изпрати линк. Сигурни ли сте, че искате да го отворите?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Неуспех при отваряне на връзка!\nURL адресът е копиран в клипборда ви. screenshot = Записана екранна снимка в {0} screenshot.invalid = Картата е твърде голяма, възможно е да не достига памет за екранната снимка. @@ -124,6 +125,8 @@ maps.none = [lightgray]Няма намерени карти! invalid = Невалидно pickcolor = Избери цвят color = Color +import = Import +export = Export preparingconfig = Подготовка на Настройки preparingcontent = Подготовка на Съдържание uploadingcontent = Качване на Съдържание @@ -212,6 +215,8 @@ campaign.none = [lightgray]Изберете на коя планета да за campaign.erekir = По-ново полирано съдържание. Напредъкът в кампанията е линеен.\n\nКартите са с по-високо качество за по-добро изживяване. campaign.serpulo = По-старо съдържание; класическото преживяване. По-отворена игра.\n\nВъзможно е картите и механиките на кампанията да са небалансирани и с по-ниско качество. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Завършено techtree = Технологичен план techtree.select = Избиране на технологичен план @@ -359,6 +364,7 @@ confirm = Потвърди delete = Изтрий view.workshop = Отвори в Работилницата workshop.listing = Редактирай в Работилницата +hide = Hide ok = OK open = Отвори customize = Персонализирай правилата @@ -370,7 +376,6 @@ command.repair = Ремонт command.rebuild = Възстановяване command.assist = Помогни на играч command.move = Движение -command.boost = Ускоряване command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Отвори Линк @@ -428,6 +435,7 @@ saveimage = Запази Изображение unknown = Неизвестно custom = Персонализирано builtin = Вградено +modded = Modded map.delete.confirm = Сигурни ли сте, че искате да изтриете тази карта? Това действие не може да бъде отменено! map.random = [accent]Случайна Карта map.nospawn = Тази карта няма позиция за ядро на играча! Добавете поне едно {0} ядро от редактора на карти. @@ -488,10 +496,14 @@ editor.center = Център editor.search = Търсене на карти... editor.filters = Фелтриране на карти editor.filters.mode = Режими на игра: +editor.filters.priorities = Priorities: editor.filters.type = Тип карта: editor.filters.search = Търсене в: editor.filters.author = Автор editor.filters.description = Описание +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Работилница @@ -527,6 +539,7 @@ waves.search = Търсене на вълни... waves.filter = Филтър за единици waves.units.hide = Скриване на всички waves.units.show = Показване на всички +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = бройки @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Унищожете: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Враговете наближават след [lightgray]{0}[] objective.enemyescelating = [accent]Вражеската продукция се увеличава след [lightgray]{0}[] objective.enemyairunits = [accent]Вражеското производство на въздушни сили започва след [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Унищожете вражеско ядро objective.command = [accent]Командвайте единици objective.nuclearlaunch = [accent]⚠ Засечен е ядрен изстрел: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Невъзможно е превключването н sector.noswitch = Не можете да смените секторите, докато вече съществуващ сектор е под нападение.\nСектор: [accent]{0}[] на [accent]{1}[] sector.view = Виж сектор sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Ниска threat.medium = Средна @@ -843,6 +858,10 @@ threat.high = Висока threat.extreme = Екстремна threat.eradication = Унищожителна +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Слънце sector.impact0078.name = Сблъсък 0078 sector.groundZero.name = Епицентър -sector.craters.name = Кратерите +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Замръзнала гора sector.ruinousShores.name = Брегови руини sector.stainedMountains.name = Зацапаните планини @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Перфектното място за започване отначало. Ниска заплаха. Малко ресурси.\nСъберете колкото се може повече мед и олово.\nПродължете напред. sector.frozenForest.description = Дори тук, близо до планините, спорите са се разпространили. Мразовитите температури не могат да ги задържат вечно.\n\nОвладейте електричеството. Постройте горивни генератори. Научете се да ползвате възстановители. sector.saltFlats.description = На покрайнините на пустинята лежат Солените равнини. Няма много ресурси на това място.\n\nВрагът е издигнал комплекс за съхранение на ресурси тук. Изкоренете ядрото му. Сравнете всичко със земята. -sector.craters.description = В този кратер се е събрала вода, спомен от забравени войни. Възстановете региона. Съберете пясък. Помиришете метастъклото. Използвайте вода за да охлаждате вашите оръдия и свредели. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Сред отпадъците е и бреговата линия. Някога тук е стояла бреговата защитна линия. Няма много следи от нея. Останали са само някои елементарни защитни механизми, всичко останало е сведено до скрап.\nПродължете разширяването навън. Преоткрийте технологията. sector.stainedMountains.description = По-навътре в континента се намират планините, все още незамърсени от спорите.\nИзвлечете изоставеният титан в тази зона. Научете се да го използвате.\n\nПрисъствието на врагове тук е по-високо. Не им оставяйте време да изпратят тежката артилерия. sector.overgrowth.description = Обладана от висока растителност, тази зона се намира изключително близо до източника на спорите. Врагът е установил военен лагер тук. Постройте единици модел 'Боздуган' и унищожете вражеската база. @@ -1045,6 +1065,7 @@ stat.boosteffect = Ефект на усилване stat.maxunits = Максимални активни единици stat.health = Точки живот stat.armor = Броня +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Време за построяване stat.maxconsecutive = Максимално последователни stat.buildcost = Разходи за изграждане @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] щети на площ ~[stat] {1}[li bullet.incendiary = [stat]Подпалване bullet.homing = [stat]Самонасочване bullet.armorpierce = [stat]Пробождане на броня -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] ограничена щета bullet.suppression = [stat]{0} сек[lightgray] възпиране на поправки ~ [stat]{1}[lightgray] плочки @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Забрани Модовете При Старт setting.animatedwater.name = Анимирани повърхности setting.animatedshields.name = Анимирани щитове setting.playerindicators.name = Индикатори за играчите +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Индикатори за враговете setting.autotarget.name = Автоматичен прицел setting.keyboard.name = Управление: мишка/клавиатура @@ -1269,6 +1292,8 @@ setting.fpscap.none = Няма setting.fpscap.text = {0} FPS setting.uiscale.name = Размер на интерфейса[lightgray] (изисква рестарт)[] setting.uiscale.description = Нужен е рестарт, за да се приложат промените. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Винаги диагонално поставяне setting.screenshake.name = Клатене на екрана setting.bloomintensity.name = Интензитет на сиянията @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Време между автоматичен зап setting.seconds = {0} секунди setting.milliseconds = {0} милисекунди setting.fullscreen.name = Цял екран -setting.borderlesswindow.name = Прозорец без рамка[lightgray] (може да изисква рестарт) -setting.borderlesswindow.name.windows = Цял екран без рамка -setting.borderlesswindow.description = Може да е нужен рестарт, за да се приложат промените. setting.fps.name = Показвай FPS & пинг setting.console.name = Включване на конзолата setting.smoothcamera.name = Гладка камера @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Сила на звука на околната сре setting.mutemusic.name = Заглуши музиката setting.sfxvol.name = Сила на звуковите ефекти setting.mutesound.name = Заглуши звука -setting.crashreport.name = Изпращай анонимни отчети за сривове setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматични записи setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Управление на единици category.multiplayer.name = Мрежова игра category.blocks.name = Избор на блок placement.blockselectkeys = \n[lightgray]Клавиш: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Връщане при ядрото keybind.control.name = Управляване на единица keybind.clear_building.name = Изчистване на строежен план @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Поведение: Не стреляй keybind.unit_stance_pursue_target.name = Поведение: Преследвай целта keybind.unit_stance_patrol.name = Поведение: Патрул keybind.unit_stance_ram.name = Поведение: Забий се +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Команда: Движение keybind.unit_command_repair.name = Команда: Поправка keybind.unit_command_rebuild.name = Команда: Ремонт keybind.unit_command_assist.name = Команда: Съдействие keybind.unit_command_mine.name = Команда: Копаене -keybind.unit_command_boost.name = Команда: Подсилване keybind.unit_command_load_units.name = Команда: Натовари единици keybind.unit_command_load_blocks.name = Команда: Натовари блокове keybind.unit_command_unload_payload.name = Команда: Разтовари @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Безкрайни ресурси за компютъра (Червеният отбор) rules.blockhealthmultiplier = Множител на точките живот на блокове rules.blockdamagemultiplier = Множител на щетите на блокове +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Множител на скоростта на производство на единици rules.unitcostmultiplier = Множител на цената за единици rules.unithealthmultiplier = Множител на точките живот на единици @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Огън rules.anyenv = rules.explosions = Блокирай/Единици вреда от експлозия @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Подсилен рутер за това block.payload-mass-driver.name = Масиран двигател за товари block.small-deconstructor.name = Малък разглобител block.canvas.name = Платно +block.large-canvas.name = Large Canvas block.world-processor.name = Световен процесор block.world-cell.name = Световна клетка block.tank-fabricator.name = Фабрикатор за танкове @@ -2120,7 +2147,6 @@ 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]Пазителите[] са единици с повече броня. Слаби боеприпаси като [accent]Мед[] и [accent]Олово[] са [scarlet]неподходящи[] срещу тях.\n\nИзползвайте по-мощни оръдия или заредете Вашите \uf861Дуо/\uf859Салво с \uf835 [accent]Графит[], за да ги повалите. hint.coreUpgrade = Ядрата могат да бъдат подобрявани като [accent]поставите по-добро ядро върху тях[].\n\nПоставете \uf868 [accent]Фондация[] върху \uf869 ядрото [accent]Частица[]. Уверете се че няма други препятствия там, където поставяте ядрото. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Всичко построено в нейния радиус ще б gz.zone3 = Сега ще започне една такава вълна.\nПригответе се. gz.finish = Издигнете още оръдия, изкопайте повече ресурси\nи се защитете от всички прииждащи вълни, за да [accent]завладеете този сектор[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Поправя всички единици block.radar.description = Постепенно разкрива терена и вражески единици в широк радиус. Нуждае се от електричество. block.shockwave-tower.description = Поврежда и унищожава вражески снаряди в обхвата си. Нуждае се от цианоген. block.canvas.description = Показва просто изображение с предзададена палитра. Може да се редактира. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Изстрелва стандартни боеприпаси по всички близки врагове. unit.mace.description = Изстрелва поток от пламък по всички близки врагове. diff --git a/core/assets/bundles/bundle_ca.properties b/core/assets/bundles/bundle_ca.properties index 36bb53f6d6..5858be1dfc 100644 --- a/core/assets/bundles/bundle_ca.properties +++ b/core/assets/bundles/bundle_ca.properties @@ -15,6 +15,7 @@ link.wiki.description = Viquipèdia oficial del Mindustry link.suggestions.description = Suggereix canvis link.bug.description = Heu trobat un error. Informeu-ne aquí! linkopen = Aquest servidor us ha enviat un enllaç. Esteu segur que el voleu obrir?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = No s’ha pogut obrir l’enllaç!\nLa direcció URL s’ha copiat al porta-retalls. screenshot = S’ha desat la captura de pantalla a {0}. screenshot.invalid = El mapa és massa gran. No hi ha prou memòria per a fer la captura de pantalla. @@ -124,6 +125,8 @@ maps.none = [lightgray]No s’ha trobat cap mapa! invalid = No vàlid pickcolor = Tria un color color = Color +import = Import +export = Export preparingconfig = Es prepara la configuració… preparingcontent = Es prepara el contingut… uploadingcontent = Es puja el contingut… @@ -212,6 +215,8 @@ campaign.none = [lightgray]Trieu en quin planeta voleu començar.\nEs pot canvia campaign.erekir = [accent]Recomanat per a jugadors novells.[]\n\nContingut revisat nou. Una campanya de progressió més o menys lineal.\n\nMapes de qualitat més alta i experiència més satisfactòria. campaign.serpulo = [scarlet]No recomanat per a jugadors novells.[]\n\nContingut antic: l’experiència clàssica. Campanya més oberta.\n\nPotser els mapes i mecàniques de la campanya no estan massa equilibrats. Contingut en general menys polit que el d’Erekir. campaign.difficulty = Dificultat +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Completat techtree = Arbre tecnològic techtree.select = Selecció de l’arbre tecnològic @@ -359,6 +364,7 @@ confirm = Confirmació delete = Esborra view.workshop = Mostra-ho al Workshop workshop.listing = Edita el llistat del Workshop +hide = Hide ok = D’acord open = Obre customize = Personalitza les regles @@ -370,7 +376,6 @@ command.repair = Repara command.rebuild = Reconstrueix command.assist = Assisteix al jugador command.move = Mou -command.boost = Sobrevola command.enterPayload = Entra bloc command.loadUnits = Carrega unitats command.loadBlocks = Carrega blocs @@ -381,7 +386,9 @@ stance.shoot = Comportament: Dispara stance.holdfire = Comportament: Mantén el foc stance.pursuetarget = Comportament: Persegueix l’objectiu stance.patrol = Comportament: Patrulla el camí +stance.holdposition = Stance: Hold Position stance.ram = Comportament: Senzill\n[lightgray]Mou-te en línia recta, sense encaminador +stance.boost = Boost stance.mineauto = Extracció automàtica stance.mine = Extrau l’element: {0} openlink = Obre l’enllaç @@ -428,6 +435,7 @@ saveimage = Desa la imatge unknown = Desconegut custom = Personalitzat builtin = *Integrat* +modded = Modded map.delete.confirm = Esteu segur que voleu esborrar aquest mapa? Aquesta acció no es pot desfer! map.random = [accent]Mapa aleatori map.nospawn = Aquest mapa no té cap nucli per tal que el jugador hi pugui aparèixer! Afegiu-hi un nucli {0} amb l’editor. @@ -488,10 +496,14 @@ editor.center = Centra editor.search = Cerca mapes editor.filters = Filtra els mapes editor.filters.mode = Modes de partida: +editor.filters.priorities = Priorities: editor.filters.type = Tipus de mapa: editor.filters.search = Cerca a: editor.filters.author = Autor editor.filters.description = Descripció +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Desplaça en l’eix X editor.shifty = Desplaça en l’eix Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Es busquen onades… waves.filter = Filtre d'unitats waves.units.hide = Amaga-les totes waves.units.show = Mostra-les totes +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = comptades @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destruïu [][lightgray]{0}[] unitats. objective.enemiesapproaching = [accent]Arribaran enemics d’aquí [lightgray]{0}[]. objective.enemyescelating = [accent]La producció enemiga augmentarà d’aquí [lightgray]{0}[] objective.enemyairunits = [accent]L’enemic començarà a produir unitats aèries d’aquí [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destruïu el nucli enemic. objective.command = [accent]Dirigiu les unitats. objective.nuclearlaunch = [accent]⚠ S’ha detectat un llançament nuclear: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Els sectors no es poden canviar. sector.noswitch = Potser no podeu canviar de sector perquè n’ataquen un altre.\n\nSector: [accent]{0}[] de [accent]{1}[] sector.view = Veure el sector sector.foundationrequired = [lightgray] Nucli: Calen fonaments +sector.shielded = [lightgray] Shielded threat.low = Baixa threat.medium = Mitjana @@ -843,6 +858,10 @@ threat.high = Alta threat.extreme = Extrema threat.eradication = Erradicació +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Molt fàcil difficulty.easy = Fàcil difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sol sector.impact0078.name = Impacte 0078 sector.groundZero.name = Zona zero -sector.craters.name = Els cràters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = El bosc gelat sector.ruinousShores.name = Costes en ruïnes sector.stainedMountains.name = Muntanyes tacades @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Bastió micelial sector.frontier.name = La frontera sector.sunkenPier.name = Moll afonat +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscapada sector.geothermalStronghold.name = Fortalesa geotèrmica sector.groundZero.description = El lloc adequat per a començar de nou. Amenaça enemiga baixa. Pocs recursos.\nRecolliu tot el coure i plom que pugueu.\nDesprés, continueu en un altre sector. sector.frozenForest.description = Les espores han arribat fins aquí, prop de les muntanyes. Les temperatures baixes no les podran contenir per sempre.\n\nComenceu el camí del poder. Construïu generadors a combustió. Apreneu a fer servir els reparadors. sector.saltFlats.description = Als límits del desert hi ha les Salines. Aquesta regió té pocs recursos.\n\nL’enemic hi ha aixecat un complex d’emmagatzematge de recursos. Elimineu el seu nucli i no en deixeu cap rastre. -sector.craters.description = L’aigua s’ha acumulat en aquest cràter, relíquia de les guerres passades. Reclameu l’àrea, recolliu sorra i foneu metavidre. Bombegeu aigua per a refredar les torretes i les perforadores. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Més enllà dels erms, hi ha la costa. En el seu temps, hi havia una línia de defensa costera. No en queda molt. Només hi queden intactes les estructures de defensa més bàsiques; de la resta només en queda ferralla.\nContinueu l’expansió i redescobriu tecnologies perdudes. sector.stainedMountains.description = Terra endins, hi ha muntanyes que no han estat contaminades per les espores.\nExtraieu el titani que abunda a l’àrea. Apreneu a usar-lo.\n\nEn aquesta zona hi ha més presència enemiga. No els deixeu temps per a enviar-vos les unitats més fortes. sector.overgrowth.description = En aquesta àrea s’ha produït un creixement desmesurat i està a prop de la font de les espores.\nL’enemic hi ha establit un post avançat. Construïu unitats [accent]Maça[] i destruïu-lo. @@ -1045,6 +1065,7 @@ stat.boosteffect = Efecte del potenciador stat.maxunits = Unitats actives màximes stat.health = Salut stat.armor = Armadura +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Temps de construcció stat.maxconsecutive = Màxim consecutiu stat.buildcost = Cost de construcció @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] de dany a l’àrea ~[stat] {1}[light bullet.incendiary = [stat]incendiari bullet.homing = [stat]munició guiada bullet.armorpierce = [stat]perforador d’armadures -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] de dany límit bullet.suppression = [stat]Supressió de reparacions cada {0} s[lightgray] ~ [stat]{1}[lightgray] caselles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Desactiva els mods quan no es pugui iniciar el jo setting.animatedwater.name = Animacions del terreny setting.animatedshields.name = Animacions dels escuts setting.playerindicators.name = Indicadors de jugadors +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicadors d’enemics setting.autotarget.name = Apunta automàticament setting.keyboard.name = Controls amb ratolí i teclat @@ -1269,6 +1292,8 @@ setting.fpscap.none = Cap setting.fpscap.text = {0} FPS setting.uiscale.name = Escala de la interfície setting.uiscale.description = Cal reiniciar perquè s’apliquin els canvis. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Permet sempre construir en diagonal setting.screenshake.name = Sacseig de pantalla setting.bloomintensity.name = Intensitat de l’efecte «bloom» @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Interval de les desades automàtiques setting.seconds = {0} s setting.milliseconds = {0} ms setting.fullscreen.name = Pantalla completa -setting.borderlesswindow.name = Finestra sense vora -setting.borderlesswindow.name.windows = Pantalla completa sense vora -setting.borderlesswindow.description = Potser caldrà reiniciar el joc per a aplicar els canvis. setting.fps.name = Mostra els FPS i el ping setting.console.name = Activa la consola setting.smoothcamera.name = Moviment de càmera suau @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volum del so ambiental setting.mutemusic.name = Silencia la música setting.sfxvol.name = Volums dels efectes de so setting.mutesound.name = Silencia el so -setting.crashreport.name = Envia informes d’error anònims setting.communityservers.name = Cerca la llista de servidors de la comunitat setting.savecreate.name = Desa automàticament la partida setting.steampublichost.name = Visibilitat de la partida pública @@ -1334,6 +1355,8 @@ category.command.name = Ordre d’unitat category.multiplayer.name = Multijugador category.blocks.name = Selecció d’estructures per construir placement.blockselectkeys = \n[lightgray]Tecles: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Reapareix keybind.control.name = Controla una unitat keybind.clear_building.name = Desmunta una estructura @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Comportament: Mantén el foc keybind.unit_stance_pursue_target.name = Comportament: Persegueix l’objectiu keybind.unit_stance_patrol.name = Comportament: Patrulla keybind.unit_stance_ram.name = Comportament: Senzill +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Ordre d’unitat: Mou keybind.unit_command_repair.name = Ordre d’unitat: Repara keybind.unit_command_rebuild.name = Ordre d’unitat: Reconstrueix keybind.unit_command_assist.name = Ordre d’unitat: Assisteix keybind.unit_command_mine.name = Ordre d’unitat: Extrau -keybind.unit_command_boost.name = Ordre d’unitat: Sobrevola keybind.unit_command_load_units.name = Ordre d’unitat: Carrega unitats keybind.unit_command_load_blocks.name = Ordre d’unitat: Carrega blocs keybind.unit_command_unload_payload.name = Ordre d’unitat: Descarrega blocs @@ -1483,6 +1507,7 @@ rules.checkplacement.info = Mentre estigui desactivat, les estructures d’aques rules.enemyCheat = Recursos infinits per a la IA (equip vermell) rules.blockhealthmultiplier = Multiplicador de la salut dels blocs rules.blockdamagemultiplier = Multiplicador del dany dels blocs +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Multiplicador de la velocitat de producció d’unitats rules.unitcostmultiplier = Multiplicador del cost de les unitats rules.unithealthmultiplier = Multiplicador de la salut de les unitats @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Permet fer servir plataformes de llançament sense landingpad.legacy.disabled = [scarlet]\ue815 Desactivat[lightgray] (plataformes de llançament antigues activades) rules.showspawns = Mostra l’aparició d’enemics rules.randomwaveai = IA d’onades immprevisible +rules.pauseDisabled = Disable Pausing rules.fire = Foc rules.anyenv = rules.explosions = Dany de les explosions als blocs/unitats @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Encaminador de blocs reforçat block.payload-mass-driver.name = Transportador a distància de blocs block.small-deconstructor.name = Desconstructor petit block.canvas.name = Llenç +block.large-canvas.name = Large Canvas block.world-processor.name = Processador integrat block.world-cell.name = Cel·la de memòria integrada block.tank-fabricator.name = Fabricadora de tancs @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Manteniu premut[] un bloc petit per a recoll hint.payloadDrop = Premeu [accent]][] per a deixar el bloc o la unitat. hint.payloadDrop.mobile = [accent]Manteniu premuda[] una posició buida per a deixar-hi un bloc o una unitat. hint.waveFire = Les torretes de tipus [accent]Wave[] que usin aigua com munició apagaran els focs propers automàticament. -hint.generator = Els :combustion-generator: [accent]Generadors a combustió[] cremen carbó i transmeten energia als blocs adjacents.\n\nL’abast de la transmissió d’energia es pot expandir amb :power-node: [accent]node d’energia[]. hint.guardian = Les unitats de tipus [accent]Guardià[] són unitats blindades. La munició dèbil com ara el [accent]Coure[] i el [accent]Plom[] [scarlet]no és efectiva[].\n\nEmpreu torretes de nivell més alt o carregueu torretes :duo:Duo/:salvo:Salvo amb :graphite: [accent]Grafit[] per a destruir-los. hint.coreUpgrade = Els nuclis es poden millorar [accent]construint-hi a sobre nuclis amb millors característiques[].\n\nSitueu un nucli de tipus [accent]Fonament[] a sobre del nucli [accent]Estella[]. Assegureu-vos que no hi hagin obstruccions properes. hint.serpuloCoreZone = Additional :core-shard: [accent]Cores[] may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Tot el que es construeixi a dins es destruirà quan comenci la proper gz.zone3 = Ara comença una onada.\nPrepareu-vos. gz.finish = Construïu més torretes, extraieu més recursos \ni defense-vos contra totes les onades per a [accent]capturar el sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repara totes les unitats a prop. Necessita block.radar.description = Escaneja el terreny gradualment i localitza unitats enemigues a gran distància. Necessita energia. block.shockwave-tower.description = Danya i destrueix projectils enemics dintre del seu abast. Requereix cianogen. block.canvas.description = Mostra una imatge senzilla amb una paleta predefinida. Es pot editar. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Dispara munició estàndard a tots els enemics propers. unit.mace.description = Dispara flames a tots els enemics propers. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 20775311e4..f31e7b3823 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -15,6 +15,7 @@ link.wiki.description = Oficiální Wiki Mindustry link.suggestions.description = Doporučit nové funkce link.bug.description = Našel jsi nějaký? Nahlas ho zde linkopen = Tento server vám poslal odkaz. Jste si jist s jeho otevřením?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky. screenshot = Snímek obrazovky uložen {0} screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky. @@ -124,6 +125,8 @@ maps.none = [lightgray]Mapy nebyly nalezeny.[] invalid = Neplatné pickcolor = Vyber barvu color = Barva +import = Import +export = Export preparingconfig = Připravuji konfiguraci preparingcontent = Připravuji obsah hry uploadingcontent = Nahrávám obsah hry @@ -212,6 +215,8 @@ campaign.none = [lightgray]Vyberte planetu, na které chcete začít.\nToto lze campaign.erekir = Novější, uhlazenější obsah. Většinou lineární průběh kampaně.\n\nObtížnější. Vyšší kvalita map a celkový zážitek. campaign.serpulo = Starší obsah; klasický zážitek. Otevřenější konec, více obsahu.\n\nPotenciálně nevyvážené mapy a mechanismy kampaní. Méně leštěné. campaign.difficulty = Obtížnost +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Dokončeno[] techtree = Technologie techtree.select = Výběr Výzkumného Stromu @@ -359,6 +364,7 @@ confirm = Potvrdit delete = Smazat view.workshop = Prohlédnout ve Workshopu na Steamu workshop.listing = Upravit popis ve Workshopu na Steamu +hide = Hide ok = OK open = Otevřít customize = Přizpůsobit pravidla @@ -370,7 +376,6 @@ command.repair = Opravovat command.rebuild = Přestavět command.assist = Asistovat hráči command.move = Pohyb -command.boost = Posílení command.enterPayload = Zadejte blok užitečného zatížení command.loadUnits = Nahrát jednotky command.loadBlocks = Nahrát bloky @@ -381,7 +386,9 @@ stance.shoot = Postoj: Střílejte stance.holdfire = Postoj: Přestaň střílet stance.pursuetarget = Postoj: Sleduj cíl stance.patrol = Postoj: Hlídej +stance.holdposition = Stance: Hold Position stance.ram = Postoj: Ram\n[lightgray]Přímý pohyb, žádné hledání cesty +stance.boost = Boost stance.mineauto = Automatická těžba stance.mine = Těžit předmět: {0} openlink = Otevřít odkaz @@ -428,6 +435,7 @@ saveimage = Uložit obrázek unknown = Neznámý custom = Upraveno builtin = Vestavěno +modded = Modded map.delete.confirm = Jsi si jistý, že chceš tuto mapu smazat? Tato akce je nevratná! map.random = [accent]Náhodná mapa[] map.nospawn = Na této mapě nejsou jádra, u kterých by se mohli zrodit hráči. Přidej v editoru do této mapy aspoň jedno {0} jádro. @@ -488,10 +496,14 @@ editor.center = Vycentrovat editor.search = Hledat mapy... editor.filters = Filtrovat mapy editor.filters.mode = Herní režimy: +editor.filters.priorities = Priorities: editor.filters.type = Typ Mapy: editor.filters.search = Hledat V: editor.filters.author = Autor editor.filters.description = Popis +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop na Steamu @@ -527,6 +539,7 @@ waves.search = Hledat vlny... waves.filter = Filtr jednotek waves.units.hide = Schovat vše waves.units.show = Zobrazit vše +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = počty @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Zničeno: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Nepřátelé se blíží [lightgray]{0}[] objective.enemyescelating = [accent]Produkce nepřátel eskaluje [lightgray]{0}[] objective.enemyairunits = [accent]Začátek výroby nepřátelských leteckých jednotek [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Znič nepřátelské Jádro objective.command = [accent]Velitelské jednotky objective.nuclearlaunch = [accent]⚠ Zjištěna nukleární bomba: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Nelze Vyměnit Sektor sector.noswitch = Sektory nelze přepnut, pokud je stávající sektor pod útokem.\n\nSektor: [accent]{0}[] na [accent]{1}[] sector.view = Prohlédnout Sektor sector.foundationrequired = [lightgray] Je vyžadováno Jádro: Základ. +sector.shielded = [lightgray] Shielded threat.low = Nízké threat.medium = Střední @@ -843,6 +858,10 @@ threat.high = Velké threat.extreme = Extrémní threat.eradication = Vyhlazující +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Odpočinková difficulty.easy = Lehká difficulty.normal = Střední @@ -862,7 +881,7 @@ planet.sun.name = Sol sector.impact0078.name = Dopad 78 sector.groundZero.name = Základní tábor -sector.craters.name = Krátery +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Zamrzlý les sector.ruinousShores.name = Zničené pobřeží sector.stainedMountains.name = Skvrnité pohoří @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Pevnost podhoubí sector.frontier.name = Fronta sector.sunkenPier.name = Potopené molo +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geotermální pevnost sector.groundZero.description = Optimální místo, kde znovu začít. Nízký výskyt nepřátel. Několik málo surovin.\nPosbírej co nejvíce olova a mědi.\nBěž dál. sector.frozenForest.description = Dokonce až sem, blízko hor, se dokázaly spóry rozrůst. Mráz je však nemůže zadržet navěky.\n\nPusť se do práce za pomocí energie. Stav spalovací generátory. Nauč se, jak používat opravovací věže. sector.saltFlats.description = Na okraji pouště leží Solné nížiny. V této lokaci se nachází jen několik málo surovin.\n\nNepřítel zde vybudoval zásobovací komplex. Znič jádro v jeho základně. Nenechej kámen na kameni. -sector.craters.description = V těchto relikviích starých válek se nahromadilo velké množství vody. Znovu získej tuto oblast. Sbírej písek. Vyrob z něj metasklo. Použij vodu k chlazení svých vrtů a střílen. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Za pustinou se nachází pobřeží. Kdysi zde stál obranný pobřežní systém. Moc z něj už dneska nezbylo. Jen základní konstrukce zůstaly ušetřeny, zbytek se rozpadl na šrot.\nPokračuj ve své expanzi hlouběji. Objev ztracenou technologii. sector.stainedMountains.description = Dále ve vnitrozemí leží hory, dosud neposkvrněny spórami.\nVytěž titan, kterým tato oblast oplývá. Nauč se jej používat.\n\nPřítomnost nepřátelských jednotek je zde větší. Radši jim nedej moc času na vyslání jejich nejsilnějších jednotech. sector.overgrowth.description = Tato přerostlá džungle se nachází blíže ke zdroji spór.\nNepřítel zde zbudoval předsunutou hlídku. Stav jednotky Palcát a znič s jejich pomocí jádro základny. @@ -1045,6 +1065,7 @@ stat.boosteffect = Účinek posílení stat.maxunits = Nejvýše aktivních jednotek stat.health = Životy stat.armor = Pancíř +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Čas konstrukce stat.maxconsecutive = Nejvýše po sobě stat.buildcost = Cena konstrukce @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] plošného poškození ~[stat] {1}[li bullet.incendiary = [stat]zápalný bullet.homing = [stat]samonaváděcí bullet.armorpierce = [stat]proražení brnění -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] limit poškození bullet.suppression = [stat]{0} sek[lightgray] potlačení opravy ~ [stat]{1}[lightgray] kostek @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Vypnout Modifikace Při Pádovém Spuštění setting.animatedwater.name = Animované povrchy setting.animatedshields.name = Animované štíty setting.playerindicators.name = Indikátor pro hráče +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indikátor pro nepřátele setting.autotarget.name = Automaticky zaměřovat setting.keyboard.name = Ovládání myší a klávesnicí @@ -1269,6 +1292,8 @@ setting.fpscap.none = Žádný setting.fpscap.text = {0} FPS setting.uiscale.name = Škálování uživatelského rozhraní[lightgray] (je vyžadován restart)[] setting.uiscale.description = Pro aplikování změn, je potřeba restart. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Vždy pokládat úhlopříčně setting.screenshake.name = Chvění obrazovky setting.bloomintensity.name = Intenzita Bloom @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Interval automatického ukládání setting.seconds = {0} sekund setting.milliseconds = {0} milisekund setting.fullscreen.name = Celá obrazovka -setting.borderlesswindow.name = Bezokrajové okno [lightgray](může být vyžadován restart) -setting.borderlesswindow.name.windows = Celá obrazovka bez okrajů -setting.borderlesswindow.description = Pro aplikování změn je potřeba restart. setting.fps.name = Ukázat FPS a ping setting.console.name = Povolit Konzoli setting.smoothcamera.name = Plynulá kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Hlasitost prostředí setting.mutemusic.name = Ztišit hudbu setting.sfxvol.name = Hlasitost efektů setting.mutesound.name = Ztišit zvuk -setting.crashreport.name = Poslat anonymní hlášení o spadnutí Mindustry setting.communityservers.name = Aktualizovat Seznam Komunitních Serverů setting.savecreate.name = Automaticky ukládat hru setting.steampublichost.name = Veřejná viditelnost hry @@ -1334,6 +1355,8 @@ category.command.name = Velení jednotkám category.multiplayer.name = Hra více hráčů category.blocks.name = Výběr bloků placement.blockselectkeys = \n[lightgray]Klávesa:[] [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Znovuzrození keybind.control.name = Ovládací jednotka keybind.clear_building.name = Vyčistit stavění @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Postoj jednotky: Zastavit palbu keybind.unit_stance_pursue_target.name = Postoj jednotky: Pronásleduj cíl keybind.unit_stance_patrol.name = Postoj jednotky: Hlídej keybind.unit_stance_ram.name = Postoj jednotky: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Příkaz jednotce: Hýbej se keybind.unit_command_repair.name = Příkaz jednotce: Opravuj keybind.unit_command_rebuild.name = Příkaz jednotce: Znovu stav keybind.unit_command_assist.name = Příkaz jednotce: Asistuj keybind.unit_command_mine.name = Příkaz jednotce: Těž -keybind.unit_command_boost.name = Příkaz jednotce: Posiluj keybind.unit_command_load_units.name = Příkaz jednotce: Nakládej jednotky keybind.unit_command_load_blocks.name = Příkaz jednotce: Nakládej bloky keybind.unit_command_unload_payload.name = Příkaz jednotce: Vykládej náklad @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Neomezeně surovin pro umělou inteligenci rules.blockhealthmultiplier = Násobek zdraví bloků rules.blockdamagemultiplier = Násobek poškození bloků +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Násobek rychlosti výroby jednotek rules.unitcostmultiplier = Násobek ceny jednotek rules.unithealthmultiplier = Násobek zdraví jednotek @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Výstřel rules.anyenv = rules.explosions = Výbušné poškození bloku/jednotky @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Vyztužený zátěžový dopravník block.payload-mass-driver.name = Zátěžová ústředna block.small-deconstructor.name = Malý ničitel block.canvas.name = Plátno +block.large-canvas.name = Large Canvas block.world-processor.name = Řídící procesor block.world-cell.name = Světová Buňka block.tank-fabricator.name = Tanková dílna @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Ťupni a podrž[] na malém bloku nebo jedno hint.payloadDrop = Zmáčkni [accent]][] pro položení nákladu. hint.payloadDrop.mobile = [accent]Ťupni a drž[] na prázdném místě pro položení nákladu. hint.waveFire = [accent]Naplň[] věže vodou místo munice pro automatické hašení okolních požárů. -hint.generator = \uf879 [accent]Spalovací generátory[] pálí uhlí a přenášení energii do sousedících bloků.\n\nPřenos energie na delší vzdálenost se provádí pomocí \uf87f [accent]Energetických uzlů[]. hint.guardian = Jednotky [accent]Strážce[] jsou obrněné. Měkká munice, jako je například [accent]měď[] a [accent]olovo[] je [scarlet]neefektivní[].\n\nPoužij vylepšené věže nebo \uf835 [accent]grafitovou[] munici pro \uf861 Střílnu Duo/\uf859 Salvu, abys Strážce sejmul. hint.coreUpgrade = Jádro může být vylepšeno [accent]překrytím jádrem vyšší úrovně[].\n\nUmísti jádro typu [accent]Základ[] přes jádro typu [accent]Odštěpek[]. Ujisti se, že v okolí nejsou žádné překážky. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Vše, postaveno v tomto okruhu bude zničeno při začátku příět gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Střílí základní střely na všechny okolní nepřátele. unit.mace.description = Střílí proudy ohně na všechny okolní nepřátele. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index 006360e914..5f6489e8f2 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -15,6 +15,7 @@ link.wiki.description = Det officielle Mindustry-wiki link.suggestions.description = Foreslå nye ændringer link.bug.description = Found one? Report it here linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Kunne ikke åbne link!\n Linkets URL er kopieret til din udklipsholder. screenshot = Screenshot gemt i {0} screenshot.invalid = Banen er for stor; der er ikke nok hukommelse til et skærmbillede. @@ -124,6 +125,8 @@ maps.none = [lightgray]Ingen baner fundet! invalid = Ugyldig pickcolor = Vælg farve color = Color +import = Import +export = Export preparingconfig = Klargører konfiguration preparingcontent = Klargører indhold uploadingcontent = Uploading indhold @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Færdiggjort techtree = Teknologi træ techtree.select = Tech Tree Selection @@ -359,6 +364,7 @@ confirm = Bekræft delete = Slet view.workshop = Se på Workshop workshop.listing = Ændr Workshop-indlæg +hide = Hide ok = Okay open = Åben customize = Customize Rules @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Åben Link @@ -428,6 +435,7 @@ saveimage = Gem billede unknown = Ukendt custom = Brugerdefineret builtin = Indbygget +modded = Modded map.delete.confirm = Er du sikker på, at du vil slette dette spil? Dette kan ikke blive genskabt! map.random = [accent]Tilfældig bane map.nospawn = Denne bane har ikke nogen kerne, spillere kan opstå fra! Tilføj en {0} kerne til denne bane via bane-editoren. @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = tal @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Solen sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = Kraterne +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Den Frosne Skov sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Boost-effekt stat.maxunits = Max aktive enheder stat.health = Helbred stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Bygge-tid stat.maxconsecutive = Max fortløbende stat.buildcost = Bygge-pris @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] områdeskade ~[stat] {1}[lightgray] f bullet.incendiary = [stat]brændfarlig bullet.homing = [stat]målsøgende bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animeret vand setting.animatedshields.name = Animeret skjold setting.playerindicators.name = Player-indikatorer +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Fjende-/venne-indikatorer setting.autotarget.name = Auto-mål setting.keyboard.name = Mus- og Tasatur-styring @@ -1269,6 +1292,8 @@ setting.fpscap.none = None setting.fpscap.text = {0} FPS setting.uiscale.name = UI-skalering[lightgray] (genstart kræves)[] setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Altid diagonal placering setting.screenshake.name = Skærm-ryst setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Gemme-interval setting.seconds = {0} sekunder setting.milliseconds = {0} millesekunder setting.fullscreen.name = Fuldskærm -setting.borderlesswindow.name = Kantløst vindue[lightgray] (kræver nok genstart) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Vis FPS & Ping setting.console.name = Enable Console setting.smoothcamera.name = Blødt kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Stemningslyde-volumen setting.mutemusic.name = Forstum musik setting.sfxvol.name = SFX-volumen setting.mutesound.name = Forstum lyde -setting.crashreport.name = Send anonyme fejlrapporter setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Gem automatisk setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Spil med andre category.blocks.name = Blokvalg placement.blockselectkeys = \n[lightgray]Tast: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Genopstå keybind.control.name = Kontroller enhed keybind.clear_building.name = Ryd bygning @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Uendelig AI (rødt hold) resurser. rules.blockhealthmultiplier = Blok-helbreds-forstærker. rules.blockdamagemultiplier = Blok-skade-forstærker. +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Enheds-produktionshastigheds-forstærker rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Enheds-helbreds-forstærker @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Ild rules.anyenv = rules.explosions = Blok/Enheds-eksplosionsskade @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index a5c921f2a7..c11d0c8542 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -15,6 +15,7 @@ link.wiki.description = Offizielles Mindustry-Wiki link.suggestions.description = Neue Ideen vorschlagen link.bug.description = Hast du einen Bug gefunden? Melde ihn hier! linkopen = Dieser Server hat dir einen Link geschickt. Möchtest du ihn öffnen?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Fehler beim Öffnen des Links!\nDie URL wurde in die Zwischenablage kopiert. screenshot = Screenshot gespeichert unter {0} screenshot.invalid = Karte zu groß! Eventuell nicht ausreichend Arbeitsspeicher für Screenshot. @@ -124,6 +125,8 @@ maps.none = [lightgray]Keine Karten gefunden! invalid = Ungültig pickcolor = Farbe wählen color = Color +import = Import +export = Export preparingconfig = Konfiguration vorbereiten preparingcontent = Inhalt vorbereiten uploadingcontent = Inhalt hochladen @@ -212,6 +215,8 @@ campaign.none = [lightgray]Wähle einen Planeten, auf dem du starten möchtest.\ campaign.erekir = Neuerer, besserer Inhalt. Größtenteils linearer Fortschritt.\n\nSchwieriger. Höhere Karten- und Spielqualität. campaign.serpulo = Älterer Inhalt; das klassische Spiel. Offener, mehr Inhalt. \n\nKarten und Spielmechanismen möglicherweise qualitativ schlechter und ohne Balance. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Abgeschlossen techtree = Forschungsbaum techtree.select = Forschungsbaum auswählen @@ -359,6 +364,7 @@ confirm = Bestätigen delete = Löschen view.workshop = Im Workshop ansehen workshop.listing = Workshop-Auflistung bearbeiten +hide = Hide ok = OK open = Öffnen customize = Anpassen @@ -370,7 +376,6 @@ command.repair = Reparieren command.rebuild = Wiederaufbauen command.assist = Spieler unterstützen command.move = Bewegen -command.boost = Boost command.enterPayload = Frachtblock betreten command.loadUnits = Einheiten laden command.loadBlocks = Blöcke laden @@ -381,7 +386,9 @@ stance.shoot = Stellung: schießen stance.holdfire = Stellung: nicht schießen stance.pursuetarget = Stellung: Ziel verfolgen stance.patrol = Stellung: Pfad patroullieren +stance.holdposition = Stance: Hold Position stance.ram = Stellung: rammen[lightgray]in einer geraden Linie bewegen, gegen Wände laufen +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Link öffnen @@ -428,6 +435,7 @@ saveimage = Bild speichern unknown = Unbekannt custom = Benutzerdefiniert builtin = Enthalten +modded = Modded map.delete.confirm = Bist du sicher, dass du diese Karte löschen willst? Dies kann nicht rückgängig gemacht werden! map.random = [accent]Zufällige Karte map.nospawn = Diese Karte hat keine Kerne, in denen die Spieler beginnen können! Füge einen {0} Kern zu dieser Karte im Editor hinzu. @@ -488,10 +496,14 @@ editor.center = Zur Mitte editor.search = Karten durchsuchen... editor.filters = Karten filtern editor.filters.mode = Spielmodi: +editor.filters.priorities = Priorities: editor.filters.type = Kartentyp: editor.filters.search = Suchen nach: editor.filters.author = Autor editor.filters.description = Beschreibung +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Verschieben X editor.shifty = Verschieben Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Wellen durchsuchen... waves.filter = Einheiten Filter waves.units.hide = Alle verstecken waves.units.show = Alle anzeigen +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = Menge @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Zerstöre: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Gegner in [lightgray]{0}[] objective.enemyescelating = [accent]Gegnerische Einheit-Produktion steigert sich in [lightgray]{0}[] objective.enemyairunits = [accent]Gegnerische Lufteinheit-Produktion startet in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Gegnerischen Kern zerstören objective.command = [accent]Einheiten Steuern objective.nuclearlaunch = [accent]⚠ Atomraketenstart festgestellt: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Kann Sektoren nicht wechseln sector.noswitch = Du kannst nicht zwischen Sektoren wechseln, wenn ein anderer angegriffen wird.\n\nSektor: [accent]{0}[] auf [accent]{1}[] sector.view = Sektor ansehen sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Niedrig threat.medium = Mittel @@ -843,6 +858,10 @@ threat.high = Hoch threat.extreme = Extrem threat.eradication = Zerstörung +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sonne sector.impact0078.name = Einschlag 0078 sector.groundZero.name = Nullpunkt -sector.craters.name = Die Krater +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Gefrorener Wald sector.ruinousShores.name = Trümmerstrände sector.stainedMountains.name = Beflecktes Gebirge @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Myzel-Festung sector.frontier.name = Frontlinie sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Der optimale Ort, um anzufangen. Schwache Gegner und weniger Ressourcen.\nSammele so viel Kupfer und Blei wie möglich.\nGeh weiter. sector.frozenForest.description = Auch hier, näher an den Bergen, sind die Sporen. Sogar die niedrigen Temperaturen können sie nicht zurückhalten.\n\nLerne, Strom zu verwenden. Baue Verbrennungsgeneratoren und Reparateure. sector.saltFlats.description = Du befindest dich in der Nähe der Wüste. Hier gibt es nur wenige Ressourcen.\n\nDer Gegner hat hier ein Lager aufgestellt. Zerstöre es. Lasse nichts stehen. -sector.craters.description = Wasser hat sich hier, in diesem Überbleibsel aus dem alten Krieg, versammelt. Sammele Sand. Stelle Metaglas her. Benutze Wasser, um Bohrer und Geschütze zu kühlen. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Hinter der Wüste ist das Ufer. Es gab hier vor langer Zeit ein Uferabwehrsystem. Heute sind nur noch die einfachsten Abwehrgeschütze vorhanden, der Rest wurde verschrottet.\nBreite dich weiter aus. Finde die verlorenen Technologien wieder. sector.stainedMountains.description = Im Landesinneren sind die Berge, noch unversehrt von den Sporen.\nNutze das reichliche vorhandene Titan und lerne, es zu benutzen.\n\nDie Gegner hier sind stärker. Gib ihnen keine Zeit, um ihre stärksten Einheiten zu schicken. sector.overgrowth.description = Dieser Bereich ist überwuchert, näher an die Quelle der Sporen.\nDer Gegner hat hier einen Außenposten errichtet. Baue Mace-Einheiten. Zerstöre ihn. @@ -1045,6 +1065,7 @@ stat.boosteffect = Verstärkungseffekt stat.maxunits = Max. aktive Einheiten stat.health = Lebenspunkte stat.armor = Rüstung +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Baudauer stat.maxconsecutive = Max. Konsekutive stat.buildcost = Baukosten @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] Flächenschaden ~[stat] {1}[lightgray bullet.incendiary = [stat]entzündend bullet.homing = [stat]zielsuchend bullet.armorpierce = [stat]panzerbrechend -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] Heilungsunterdrückung ~ [stat]{1}[lightgray] Kacheln @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Mods bei Absturz deaktivieren setting.animatedwater.name = Animierte Oberflächen setting.animatedshields.name = Animierte Schilde setting.playerindicators.name = Spieler-Indikatoren +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Verbündeten-Indikatoren setting.autotarget.name = Auto-Zielauswahl setting.keyboard.name = Maus+Tastatur-Steuerung @@ -1269,6 +1292,8 @@ setting.fpscap.none = Kein(e) setting.fpscap.text = {0} FPS setting.uiscale.name = UI-Skalierung setting.uiscale.description = Neustart erforderlich. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Immer diagonale Platzierung setting.screenshake.name = Wackeleffekt setting.bloomintensity.name = Bloomstärke @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Autosave-Häufigkeit setting.seconds = {0} Sekunden setting.milliseconds = {0} Millisekunden setting.fullscreen.name = Vollbild -setting.borderlesswindow.name = Randloses Fenster -setting.borderlesswindow.name.windows = Randloses Vollbild -setting.borderlesswindow.description = Neustart vielleicht erforderlich. setting.fps.name = FPS anzeigen setting.console.name = Konsole freigeben setting.smoothcamera.name = Sanfte Kamerabewegungen @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Ambient-Lautstärke setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke setting.mutesound.name = Audioeffekte stummschalten -setting.crashreport.name = Anonyme Absturzberichte senden setting.communityservers.name = Community-Server-Liste abrufen setting.savecreate.name = Automatisch speichern setting.steampublichost.name = Spiel öffentlich sichtbar @@ -1334,6 +1355,8 @@ category.command.name = Einheitenbefehle category.multiplayer.name = Mehrspieler category.blocks.name = Blockauswahl placement.blockselectkeys = \n[lightgray]Taste: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Einheit steuern keybind.clear_building.name = Bauplan löschen @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Stellung: nicht schießen keybind.unit_stance_pursue_target.name = Stellung: Ziel verfolgen keybind.unit_stance_patrol.name = Stellung: patroullieren keybind.unit_stance_ram.name = Stellung: rammen +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Befehl: bewegen keybind.unit_command_repair.name = Befehl: reparieren keybind.unit_command_rebuild.name = Befehl: wiederaufbauen keybind.unit_command_assist.name = Befehl: Spieler helfen keybind.unit_command_mine.name = Befehl: Ressourcen abbauen -keybind.unit_command_boost.name = Befehl: Boost keybind.unit_command_load_units.name = Befehl: Einheiten aufnehmen keybind.unit_command_load_blocks.name = Befehl: Blöcke aufnehmen keybind.unit_command_unload_payload.name = Befehl: Last abladen @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Unbegrenzte gegnerische Ressourcen rules.blockhealthmultiplier = Block-Lebenspunkte-Multiplikator rules.blockdamagemultiplier = Block-Schaden-Multiplikator +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Einheiten-Baugeschwindigkeit Multiplikator rules.unitcostmultiplier = Einheit-Baukosten Multiplikator rules.unithealthmultiplier = Einheit-Lebenspunkte-Multiplikator @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Launchpads können ohne Landepads benutzt werden, landingpad.legacy.disabled = [scarlet]\ue815 Deaktiviert[lightgray] (Legacy Launch Pads aktiviert) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unvorhersehbare Wellen-KI +rules.pauseDisabled = Disable Pausing rules.fire = Feuer rules.anyenv = rules.explosions = Explosionsschaden @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Verstärkter Frachtverteiler block.payload-mass-driver.name = Frachtmassenbeschleuniger block.small-deconstructor.name = Dekonstruktor block.canvas.name = Kanvas +block.large-canvas.name = Large Canvas block.world-processor.name = Weltprozessor block.world-cell.name = Weltzelle block.tank-fabricator.name = Panzerhersteller @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Halte deinen Finger[] auf eine kleine Einhei hint.payloadDrop = Drücke [accent]][], um etwas fallen zu lassen. hint.payloadDrop.mobile = [accent]Halte deinen Finger[] auf einen freien Ort, um eine Einheit oder einen Block da fallen zu lassen. hint.waveFire = [accent]Wellen[]-Geschütze mit Wassermunition löschen automatisch Feuer. -hint.generator = :combustion-generator: [accent]Verbrennungsgeneratoren[] verbrennen Kohle und übertragen diesen Strom in angrenzende Blöcke.\n\nDie Reichweite der Stromübertragung kann mit :power-node: [accent]Stromknoten[] erweitert werden. hint.guardian = [accent]Boss[]-Einheiten sind gepanzert. Schwache Munition wie [accent]Kupfer[] und [accent]Blei[] sind [scarlet]nicht effektiv[].\n\nBenutze bessere Geschütze oder :graphite: [accent]Graphit[] als :duo:Duo-/:salvo:Salvenmunition um einen Boss zu besiegen. hint.coreUpgrade = Kerne können aufgerüstet werden, indem man [accent]bessere Kerne über sie platziert[].\n\nPlatziere einen :core-foundation: [accent]Fundament[]-Kern über einen :core-shard: [accent]Scherben[]-Kern. Stelle sicher, dass ausreichend Platz verfügbar ist. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Alle Blöcke in der Zone werden zerstört, wenn eine Welle kommt. gz.zone3 = Jetzt kommt eine Welle.\nBereite dich vor. gz.finish = Baue mehr Geschütze, sammele mehr Ressourcen\nund besiege alle Wellen, um den [accent]Sektor zu erobern[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Heilt alle Einheiten in der Nähe. Benöti block.radar.description = Entdeckt schrittweise die Umgebung und gegnerische Einheiten in einem großen Radius. Benötigt Strom. block.shockwave-tower.description = Beschädigt und zerstört gegnerische Projektile in der Nähe. block.canvas.description = Zeigt ein einfaches Bild mit einer vordefinierten Farbpalette. Bearbeitbar. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Schießt normale Kugeln auf nahe feindliche Ziele. unit.mace.description = Schießt Feuer auf nahe feindliche Ziele. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index f3e2c31583..5e74bf37de 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki oficial de Mindustry link.suggestions.description = Sugerir nuevas características link.bug.description = ¿Encontraste un error? Puedes reportarlo aquí linkopen = Este servidor te ha enviado un enlace. ¿Estás seguro de que quieres abrirlo?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = ¡Error al abrir el enlace!\nLa URL se ha copiado al portapapeles. screenshot = Captura de pantalla guardada en {0} screenshot.invalid = El mapa es demasiado grande, no hay suficiente memoria para la captura de pantalla. @@ -124,6 +125,8 @@ maps.none = [lightgray]¡No se han encontrado mapas! invalid = No es válido pickcolor = Selección de color color = Color +import = Import +export = Export preparingconfig = Preparando configuración preparingcontent = Preparando contenido uploadingcontent = Subiendo contenido @@ -212,6 +215,8 @@ campaign.none = [lightgray]Elige un planeta donde empezar.\nPuedes cambiar en cu campaign.erekir = [accent]Recomendado para nuevos jugadores.[]\n\nContenido más reciente y pulido. Progresión de campaña lineal.\n\nNiveles y experiencia de mayor calidad. campaign.serpulo = [scarlet]No recomendado para jugadores novatos.[]\n\nContenido más antiguo; La experiencia clásica. More open-ended.\n\nNiveles y mecánicas de juego potencialmente desequilibrados. campaign.difficulty = Dificultad +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Completado techtree = Investigaciones tecnológicas techtree.select = Selección de esquemas de tecnologías @@ -359,6 +364,7 @@ confirm = Confirmar delete = Borrar view.workshop = Ver en Steam Workshop workshop.listing = Editar el listado del Worshop +hide = Hide ok = OK open = Abrir customize = Personalizar reglas @@ -370,7 +376,6 @@ command.repair = Reparar command.rebuild = Reconstruir command.assist = Asistir al jugador command.move = Moverse -command.boost = Sobrevolar command.enterPayload = Entrar a bloque de carga command.loadUnits = Cargar unidades command.loadBlocks = Cargar bloques @@ -381,7 +386,9 @@ stance.shoot = Acción: Disparar stance.holdfire = Acción: No disparar stance.pursuetarget = Acción: Seguir al objetivo stance.patrol = Acción: Patrullar ruta +stance.holdposition = Stance: Hold Position stance.ram = Acción: Embestir\n[lightgray]Movimiento en linea recta, sin pathfinding +stance.boost = Boost stance.mineauto = Minar automáticamente stance.mine = Minar objeto: {0} openlink = Abrir enlace @@ -428,6 +435,7 @@ saveimage = Guardar imagen unknown = Desconocido custom = Personalizado builtin = Incorporado +modded = Modded map.delete.confirm = ¿Quieres borrar este mapa? ¡Esta acción no se puede deshacer! map.random = [accent]Mapa aleatorio map.nospawn = ¡Este mapa no tiene ningún núcleo para que aparezca el jugador! Agrega un núcleo {0} al mapa desde el editor. @@ -488,10 +496,14 @@ editor.center = Centrar editor.search = Buscar mapas... editor.filters = Filtrar mapas editor.filters.mode = Modos de juego: +editor.filters.priorities = Priorities: editor.filters.type = Tipo de mapa: editor.filters.search = Buscar en: editor.filters.author = Autor editor.filters.description = Descripción +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Trasladar X editor.shifty = Trasladar Y workshop = Steam Workshop @@ -527,6 +539,7 @@ waves.search = Buscar oleadas... waves.filter = Filtro de unidades waves.units.hide = Ocultar todo waves.units.show = Mostrar todo +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = limitadas @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destruye: [][lightgray]{0}[]x Unidades objective.enemiesapproaching = [accent]Se aproximan enemigos a [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destruye el núcleo enemigo objective.command = [accent]Dirige unidades objective.nuclearlaunch = [accent]⚠ Lanzamiento nuclear detectado: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = No se pueden cambiar los sectores sector.noswitch = Tal vez no puedas cambiar de sector mientras se encuentre bajo ataque.\n\nSector: [accent]{0}[] en [accent]{1}[] sector.view = Ver sector sector.foundationrequired = [lightgray] Núcleo: Foundation requerido +sector.shielded = [lightgray] Shielded threat.low = Baja threat.medium = Media @@ -843,6 +858,10 @@ threat.high = Alta threat.extreme = Extrema threat.eradication = Erradicación +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Facil difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sol sector.impact0078.name = Impacto 0078 sector.groundZero.name = Zona de Impacto -sector.craters.name = Los Cráteres +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Bosque Congelado sector.ruinousShores.name = Costas Ruinosas sector.stainedMountains.name = Montañas Manchadas @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Bastión Infestado sector.frontier.name = Frontera sector.sunkenPier.name = Muelle Hundido +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Fortaleza Geotérmica sector.groundZero.description = La ubicación adecuada para empezar una vez más. Baja amenaza enemiga. Pocos recursos.\nReúne la mayor cantidad de plomo y cobre posible y sigue adelante. sector.frozenForest.description = Incluso aquí, cerca de las montañas, se han extendido las esporas. Las gélidas temperaturas no las contendrán para siempre.\nDescubre la energía eléctrica. Construye generadores de combustión. Aprende a usar reparadores. sector.saltFlats.description = En los límites del desierto se encuentran las Salinas. No hay muchos recursos en esta ubicación.\n\nEl enemigo ha creado un complejo de almacenamiento de recursos aquí. Erradica su núcleo. No dejes nada en pie. -sector.craters.description = El agua se ha acumulado en este cráter, reliquia de las antiguas guerras. Recupera la zona. Procesa la arena. Funde metacristal. Bombea agua para enfriar torretas y taladros. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Más allá de los páramos, se encuentra la costa. Antaño, esta ubicación albergó todo un sistema de defensa costera. Ya no queda mucho de aquello. Solo las estructuras de defensa más básicas han quedado ilesas, todo lo demás está reducido a chatarra.\nContinúa la expansión. Redescubre la tecnología. sector.stainedMountains.description = Más allá se encuentran las montañas, aún intactas por las esporas.\nExtrae el titanio que abunda en esta zona. Aprende a usarlo.\n\nLa presencia enemiga es mayor aquí. No les des tiempo para enviar sus unidades más fuertes. sector.overgrowth.description = El área está cubierta de maleza, próxima a la fuente de las esporas.\nEl enemigo ha establecido un puesto de avanzada aquí. Construye unidades Mace. Destrúyelo. @@ -1045,6 +1065,7 @@ stat.boosteffect = Efecto de potenciador stat.maxunits = Máximo de unidades activas stat.health = Vida stat.armor = Armadura +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Tiempo de construcción stat.maxconsecutive = Máximo consecutivo stat.buildcost = Coste de construcción @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] daño en área ~[stat] {1}[lightgray] bullet.incendiary = [stat]incendiaria bullet.homing = [stat]rastreadora bullet.armorpierce = [stat]perforación de armadura -bullet.armorweakness = [red]{0}%[lightgray] debilidad contra armadura -bullet.armorpiercing = [stat]{0}%[lightgray] perforación de armadura +bullet.armorweakness = [red]{0}x[lightgray] debilidad contra armadura +bullet.partialarmorpierce = [stat]{0}%[lightgray] perforación de armadura bullet.antiarmor = [stat]{0}x[lightgray] anti-armadura bullet.maxdamagefraction = [stat]{0}%[lightgray] daño límite bullet.suppression = [stat]{0} seg[lightgray] supresión de reparación ~ [stat]{1}[lightgray] casillas @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Desactivar mods si el juego no puede iniciarse setting.animatedwater.name = Animaciones de terreno setting.animatedshields.name = Animación de escudos setting.playerindicators.name = Indicadores de jugadores +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicadores de enemigos setting.autotarget.name = Auto-apuntado setting.keyboard.name = Controles de teclado y ratón @@ -1268,8 +1291,10 @@ setting.fpscap.name = Límite de FPS setting.fpscap.none = No setting.fpscap.text = {0} FPS setting.uiscale.name = Escala de interfaz -setting.uiscale.description = Es necesario reiniciar para aplicar los cambios. -setting.swapdiagonal.name = Construir siempre en diagonal +setting.uiscale.description = Se requiere reiniciar para aplicar los cambios. +setting.uiEdgePadding.name = Espaciado de bordes de UI +setting.uiEdgePadding.description = Añade espaciado a los bordes de la UI. Útil para pantallas con esquinas redondeadas o muescas. +setting.swapdiagonal.name = Colocación siempre diagonal setting.screenshake.name = Vibración de pantalla setting.bloomintensity.name = Intensidad de desenfoque de Bloom setting.bloomblur.name = Difuminado de puntos de luz (Bloom) @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Intervalo de autoguardado setting.seconds = {0} segundos setting.milliseconds = {0} milisegundos setting.fullscreen.name = Pantalla completa -setting.borderlesswindow.name = Ventana sin bordes -setting.borderlesswindow.name.windows = Ventana a pantalla completa -setting.borderlesswindow.description = Aplicar los cambios podría requerir un reinicio. setting.fps.name = Mostrar FPS y ping setting.console.name = Activar consola setting.smoothcamera.name = Movimiento de cámara suave @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volumen del ambiente setting.mutemusic.name = Silenciar música setting.sfxvol.name = Volumen del sonido setting.mutesound.name = Silenciar sonido -setting.crashreport.name = Enviar registros de errores anónimos setting.communityservers.name = Buscar lista de servidores de la comunidad setting.savecreate.name = Guardado automático setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Comandar unidades category.multiplayer.name = Multijugador category.blocks.name = Seleccionar bloque placement.blockselectkeys = \n[lightgray]Teclas: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Reaparecer keybind.control.name = Controlar unidad keybind.clear_building.name = Eliminar construcción @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Acción de unidad: No disparar keybind.unit_stance_pursue_target.name = Acción de unidad: Seguir objetivo keybind.unit_stance_patrol.name = Acción de unidad: Patrullar keybind.unit_stance_ram.name = Acción de unidad: Embestir +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Comando de unidad: Moverse keybind.unit_command_repair.name = Comando de unidad: Reparar keybind.unit_command_rebuild.name = Comando de unidad: Reconstruir keybind.unit_command_assist.name = Comando de unidad: Asistir al jugador keybind.unit_command_mine.name = Comando de unidad: Minar -keybind.unit_command_boost.name = Comando de unidad: Sobrevolar keybind.unit_command_load_units.name = Comando de unidad: Cargar unidades keybind.unit_command_load_blocks.name = Comando de unidad: Cargar bloques keybind.unit_command_unload_payload.name = Comando de unidad: Soltar carga @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = La IA (Equipo Rojo) tiene recursos infinitos rules.blockhealthmultiplier = Multiplicador de vida de estructuras rules.blockdamagemultiplier = Multiplicador de daño de estructuras +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Multiplicador de velocidad de producción de unidades rules.unitcostmultiplier = Multiplicador de costo de unidades rules.unithealthmultiplier = Multiplicador de vida de unidades @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Mostrar puntos de aparición de unidades enemigas rules.randomwaveai = Oleada impredecible de IA +rules.pauseDisabled = Disable Pausing rules.fire = Fuego rules.anyenv = rules.explosions = Daño de explosiones a bloques/unidades @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Enrutador de carga reforzado block.payload-mass-driver.name = Catapulta electromagnética de carga block.small-deconstructor.name = Deconstructor pequeño block.canvas.name = Lienzo +block.large-canvas.name = Large Canvas block.world-processor.name = Procesador estático block.world-cell.name = Unidad de memoria estática block.tank-fabricator.name = Fabricador de tanques @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Mantén[] sobre un bloque o unidad para reco hint.payloadDrop = Pulsa [accent]][] para soltar la carga. hint.payloadDrop.mobile = [accent]Mantén[] sobre un lugar vacío para soltar la carga. hint.waveFire = Cuando las torretas [accent]Wave[] usen agua como munición, apagarán fuego e incendios cercanos automáticamente. -hint.generator = Los [accent]Generadores de combustión[] querman carbón para transmitir energía a bloques adyacentes.\n\nEl alcance de transmisión de energía se puede extender usando [accent]Nodos de energía[]. hint.guardian = Los [accent]Guardianes[] poseen una robusta armadura. Municiones débiles como el [accent]Cobre[] o el [accent]Plomo[] no son [scarlet]effectivas[] contra él.\n\nUsa torretas de mayor categoría o por ejemplo, munición de [accent]Grafito[] en torretas [accent]Salvo[] para derribar a los Guardianes con más facilidad. hint.coreUpgrade = Los núcleos se pueden mejorar [accent]construyendo núcleos de mayor calidad encima[].\n\nColoca un núcleo [accent]Foundation[] sobre el núcleo [accent]Shard[]. Asegúrate de que no hay obstáculos cerca. hint.serpuloCoreZone = :core-shard: [accent]Núcleos[] Adicionales pueden ser construidos en: Casillas de[accent]Núcleo[]. @@ -2152,6 +2178,16 @@ gz.zone2 = Cualquier estructura en el área será destruida al comenzar una olea gz.zone3 = Ahora comenzará una oleada.\nPrepárate. gz.finish = Construye más torretas, extrae más recursos,\ny defiéndete de todas las oleadas para [accent]capturar este sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Usa [accent]unidades[] para defender construcciones y atacar al enemigo.\nInvestiga y construye una :ground-factory: [accent]fábrica terrestre[]. fungalpass.tutorial2 = Selecciona unidades :dagger: [accent]Dagger[] en la fábrica.\nProduce 3 unidades. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repara todas las unidades en su área. Req block.radar.description = Descubre gradualmente el terreno y las unidades enemigas en un amplio radio. Requiere energía. block.shockwave-tower.description = Daña y destruye proyectiles enemigos dentro de su radio de acción. Requiere cianógeno. block.canvas.description = Muestra una imagen simple con una paleta predefinida. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Dispara proyectiles básicos a enemigos cercanos. unit.mace.description = Ataca con llamaradas a enemigos cercanos. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index 6a8fb1d598..e98ebd9239 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -15,6 +15,7 @@ link.wiki.description = Mängu ametlik viki link.suggestions.description = Anna soovitusi link.bug.description = Leidsid vea? Kirjuta siia linkopen = See server saatis sulle lingi. Oled kindel, et tahad avada?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Lingi avamine ebaõnnestus!\nVeebiaadress kopeeriti. screenshot = Kuvatõmmis salvestati: {0} screenshot.invalid = Maailm on liiga suur: kuvatõmmise salvestamiseks ei pruugi olla piisavalt mälu. @@ -124,6 +125,8 @@ maps.none = [lightgray]Ühtegi maailma ei leitud! invalid = Kehtetu pickcolor = Vali Värv color = Color +import = Import +export = Export preparingconfig = Konfiguratsiooni Ettevalmistamine preparingcontent = Sisu Ettevalmistamine uploadingcontent = Sisu Üleslaadimine @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Olemas techtree = Uurimispuu techtree.select = Tech Tree Selection @@ -359,6 +364,7 @@ confirm = Kinnita delete = Kustuta view.workshop = Vaata Workshop'is workshop.listing = Edit Workshop Listing +hide = Hide ok = OK open = Ava customize = Kohanda reegleid @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Ava link @@ -428,6 +435,7 @@ saveimage = Salvesta pilt unknown = custom = Mängija loodud builtin = Sisse-ehitatud +modded = Modded map.delete.confirm = Oled kindel, et soovid maailma kustutada? Seda ei saa tagasi võtta! map.random = [accent]Suvaline maailm map.nospawn = Selles maailmas ei ole mängijate tuumikuid!\nLisa redaktoris sellele maailmale {0} tuumik. @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Kiirendaja mõju stat.maxunits = Maks. aktiivseid väeüksuseid stat.health = Elud stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Ehitamise aeg stat.maxconsecutive = Max Consecutive stat.buildcost = Ehitamise maksumus @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] hävituspunkti ~[stat] {1}[lightgray] bullet.incendiary = [stat]süttiv bullet.homing = [stat]isesihtiv bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animeeritud vesi setting.animatedshields.name = Animeeritud kilbid setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Vaenlaste/Liitlaste osutid setting.autotarget.name = Automaatne sihtimine setting.keyboard.name = Hiire ja klaviatuuri juhtnupud @@ -1269,6 +1292,8 @@ setting.fpscap.none = Puudub setting.fpscap.text = {0} kaadrit/s setting.uiscale.name = Kasutajaliidese suurus[lightgray] (vajab mängu taaskäivitamist)[] setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Paiguta alati diagonaalselt setting.screenshake.name = Ekraani värisemine setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Salvestamise intervall setting.seconds = {0} sekundit setting.milliseconds = {0} milliseconds setting.fullscreen.name = Täisekraan -setting.borderlesswindow.name = Äärteta ekraan[lightgray] (võib vajada mängu taaskäivitamist) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Näita kaadrite arvu sekundis setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Taustahelide tugevus setting.mutemusic.name = Vaigista muusika setting.sfxvol.name = Heliefektide tugevus setting.mutesound.name = Vaigista heli -setting.crashreport.name = Saada automaatseid veateateid setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Loo automaatseid salvestisi setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Mitmikmäng category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Clear Building @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = [scarlet]Vaenlastel[] on lõputult ressursse rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Väeüksuste tootmiskiiruse kordaja rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Väeüksuste elude kordaja @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 4d64ed9f1c..03c908b110 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -15,6 +15,7 @@ link.wiki.description = Mindustry wiki ofiziala link.suggestions.description = Proposatu ezaugarri berriak link.bug.description = Akatsen bat aurkitu duzu? Eman berri hemen linkopen = Zerbitzari honek esteka bat bidali dizu. Ziur ireki nahi duzula?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Huts egin du esteka irekitzean!\nURL-a zure arbelera kopiatu da. screenshot = Pantaila-argazkia {0} helbidean gorde da screenshot.invalid = Mapa handiegia, baliteke pantaila-argazkirako memoria nahiko ez egotea. @@ -124,6 +125,8 @@ maps.none = [lightgray]Ez da maparik aurkitu! invalid = Baliogabea pickcolor = Hautatu kolorea color = Kolorea +import = Import +export = Export preparingconfig = Konfigurazioa prestatzen preparingcontent = Edukia prestatzen uploadingcontent = Edukia igotzen @@ -212,6 +215,8 @@ campaign.none = [lightgray]hautatu hasteko planeta.\nHau edonoiz aldatu daiteke. campaign.erekir = [accent]Jokalari berrientzak aholkatua.[]\n\nEduki berriagoa eta landuagoa. Kanpaina aurreratze lineala.\n\nKalitate hobeko mapak eta esperientzia orokorra. campaign.serpulo = [scarlet]Ez aholkatua jokalari berrientzat.[]\n\nEduki zaharra; esperientzia klasikoa. Irekiagoa.\n\nAgian desorekatuak dauden mapak eta kanpainaren mekanikak. Ez horren landua. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Ikertua techtree = Teknologia zuhaitza techtree.select = Teknologia zuhaitzeko hautaketa @@ -359,6 +364,7 @@ confirm = Baieztatu delete = Ezabatu view.workshop = Ikusi tailerrean workshop.listing = Editatu tailerreko zerrenda +hide = Hide ok = Ados open = Ireki customize = Aldatu arauak @@ -370,7 +376,6 @@ command.repair = Konpondu command.rebuild = Berreraiki command.assist = Jokalaria lagundu command.move = Mugitu -command.boost = Bultzatu command.enterPayload = Karga erabilgarriko blokea sartu command.loadUnits = Unitateak kargatu command.loadBlocks = Blokeak kargatu @@ -381,7 +386,9 @@ stance.shoot = Jarrera: Tiro egin stance.holdfire = Jarrera: Su-etena stance.pursuetarget = Jarrera: Objetiboa jarraitu stance.patrol = Jarrera: Patruila bidea +stance.holdposition = Stance: Hold Position stance.ram = Jarrera: Ram\n[lightgray]Mugimendua lerro zuzenean, biderik bilatu gabe +stance.boost = Boost stance.mineauto = Meatzaritza automatikoa stance.mine = Minatutako objektua: {0} openlink = Ireki esteka @@ -428,6 +435,7 @@ saveimage = Gorde irudia unknown = Ezezaguna custom = Pertsonalizatua builtin = Jolas barnekoa +modded = Modded map.delete.confirm = Ziur mapa hau ezabatu nahi duzula? Ekintza hau ezin da desegin! map.random = [accent]Ausazko mapa map.nospawn = Mapa honek ez du muinik jokalaria sortu dadin! Gehitu muin {0} bat mapa honi editorean. @@ -488,10 +496,14 @@ editor.center = Zentroa editor.search = Bilatu mapak... editor.filters = Filtratu mapak editor.filters.mode = Joko moduak: +editor.filters.priorities = Priorities: editor.filters.type = Mapa mota: editor.filters.search = Bilatu: editor.filters.author = Egilea editor.filters.description = Deskripzioa +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Lantegia @@ -527,6 +539,7 @@ waves.search = Olatuak bilatu... waves.filter = Unitate-iragazkia waves.units.hide = Ezkutatu denak waves.units.show = Erakutsi denak +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = zenbaketak @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Suntsitu: [][lightgray]{0}[]x Unitate objective.enemiesapproaching = [accent]Etsaiak gerturatzen [lightgray]{0}[] objective.enemyescelating = [accent]Etsaien ekoizketa eskalatzen [lightgray]{0}[] objective.enemyairunits = [accent]Etsaien aire unitateen ekoizketaren hasiera [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Suntsitu etsai nukleoa objective.command = [accent]Unitateak agindu objective.nuclearlaunch = [accent]⚠ Jaurtiketa nuklearra detektatuta: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Sektoreak ezin dira aldatu. sector.noswitch = Ezin duzu sektorez aldatu lehendik dagoen sektore bat erasopean dagoen bitartean.\n\nSektorea: [accent]{0}[] [accent]{1}[]-n sector.view = Ikusi sektorea sector.foundationrequired = [lightgray] Nukleoa: Fundazioa beharrezkoa +sector.shielded = [lightgray] Shielded threat.low = Txikia threat.medium = Ertaina @@ -843,6 +858,10 @@ threat.high = Handia threat.extreme = Sekulakoa threat.eradication = Desagerrarazpena +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Kasuala difficulty.easy = Erraza difficulty.normal = Normala @@ -862,7 +881,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Kokapen ezin hobea berriro hasteko. Etsaiaren mehatxu txikia. Baliabide gutxi.\nAhalik eta berun eta kobre gehien bildu.\nAurrera. sector.frozenForest.description = Hemen ere, mendietatik hurbilago, esporak zabaldu dira. Tenperatura hotzek ezin dituzte betiko eduki.\n\nHasi agintea lortzen. Eraiki errekuntza-sorgailuak. Konpontzaileak erabiltzen ikasi. sector.saltFlats.description = Basamortuaren kanpoaldean Gatz Etxeak daude. Leku honetan baliabide gutxi aurki daitezke.\n\nEtsaiak baliabideak gordetzeko gune bat eraiki du hemen. Nukleoa desagerrarazi. Ez utzi ezer zutik. -sector.craters.description = Krater honetan ura metatu da, gerra zaharren erlikia. Eremua erreklamatu. Bildu hondarra. Metaglasa usaintsua. Ponpatu ura dorreak eta zulagailuak hozteko. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Hondakinak pasatuta, itsasertza dago. Behin, leku horretan kostaldeko defentsa bat zegoen. Ez da asko geratzen. Defentsa-egitura oinarrizkoenak bakarrik geratu dira zutik, gainerako guztia hondatuta.\nJarraitu kanpora zabaltzen. Teknologia berraurkitu. sector.stainedMountains.description = Barrurago daude mendiak, baina esporarik gabe.\nAtera hemen dagoen titanio ugaria. Ikasi erabiltzen.\n\nEtsaien presentzia handiagoa da hemen. Ez eman denborarik unitate indartsuenak bidaltzeko. sector.overgrowth.description = Eremu hau landarez gainezka dago, esporen jatorritik gertuago.\nEtsaiak postu bat ezarri du hemen. Titan unitateak eraiki. Suntsitu. Galdutakoa erreklamatu. @@ -1045,6 +1065,7 @@ stat.boosteffect = Indartze-efektua stat.maxunits = Gehieneko unitate aktiboak stat.health = Osasuna stat.armor = Armadura +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Eraikitze-denbora stat.maxconsecutive = Elkarren segidako maximoa stat.buildcost = Eraikitze-kostua @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] ingurune-kaltea ~[stat] {1}[lightgray bullet.incendiary = [stat]su-eragilea bullet.homing = [stat]gidatua bullet.armorpierce = [stat]armadura zulatzea -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] kalteen muga bullet.suppression = [stat]{0} seg[lightgray] konponketa kentzea ~ [stat]{1}[lightgray] teilak @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Modak desgaitu hasierako istripuan setting.animatedwater.name = Animatutako ura setting.animatedshields.name = Animatutako ezkutuak setting.playerindicators.name = Jokalariaren adierazleak +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Etsai/Aliatu adierazleak setting.autotarget.name = Punteria automatikoa setting.keyboard.name = Sagu+Teklatu kontrolak @@ -1269,6 +1292,8 @@ setting.fpscap.none = Bat ere ez setting.fpscap.text = {0} FPS setting.uiscale.name = Interfaze-eskala[lightgray] (berrabiarazi behar da)[] setting.uiscale.description = Berrabiarazi egin behar da aldaketak aplikatzeko. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Kokatu beti diagonalean setting.screenshake.name = Pantailaren astindua setting.bloomintensity.name = Bloom intentsitatea @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Gordetzeko tartea setting.seconds = {0} segundo setting.milliseconds = {0} milisegundo setting.fullscreen.name = Pantaila osoa -setting.borderlesswindow.name = Ertzik gabeko leihoa[lightgray] (berrabiaraztea behar lezake) -setting.borderlesswindow.name.windows = Ertzik gabeko pantaila osoa -setting.borderlesswindow.description = Berrabiarazi egin behar da aldaketak aplikatzeko. setting.fps.name = Erakutsi FPS setting.console.name = Gaitu kontsola setting.smoothcamera.name = Kamera leuna @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Giroaren bolumena setting.mutemusic.name = Isilarazi musika setting.sfxvol.name = Efektuen bolumena setting.mutesound.name = Isilarazi soinua -setting.crashreport.name = Bidali kraskatze txosten automatikoak setting.communityservers.name = Eskuratu komunitate zerbitzarien zerrenda setting.savecreate.name = Gorde automatikoki setting.steampublichost.name = Jokoaren ikusgarritasun publikoa @@ -1334,6 +1355,8 @@ category.command.name = Unitateko Agintea category.multiplayer.name = Hainbat jokalari category.blocks.name = Blokea aukeratu placement.blockselectkeys = \n[lightgray]Giltza: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Berpizte puntua keybind.control.name = Kontrol unitatea keybind.clear_building.name = Garrbitu eraikina @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unitatearen jarrera: Eutsi sua keybind.unit_stance_pursue_target.name = Unitatearen jarrera: Helburua jarraitu keybind.unit_stance_patrol.name = Unitatearen jarrera: Patruila keybind.unit_stance_ram.name = Unitatearen jarrera: Aharia +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unitateko agindua: Mugitu keybind.unit_command_repair.name = Unitateko agindua: Konponketa keybind.unit_command_rebuild.name = Unitateko agindua: Berreraiki keybind.unit_command_assist.name = Unitateko agindua: Laguntza keybind.unit_command_mine.name = Unitateko agindua: Minatu -keybind.unit_command_boost.name = Unitateko agindua: Bultzatu keybind.unit_command_load_units.name = Unitateko agindua: Karga unitateak keybind.unit_command_load_blocks.name = Unitateko agindua: Kargatu blokeak keybind.unit_command_unload_payload.name = Unitateko agindua: Deskargatu karga erabilgarria @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = AI-k (talde gorriak) baliabide amaigabeak ditu rules.blockhealthmultiplier = Blokeen osasun biderkatzailea rules.blockdamagemultiplier = Blokeen kalte biderkatzailea +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unitateen sorrerarako abiadura-biderkatzailea rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unitateen osasun-biderkatzailea @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = 7.0 bertsioan bezala, lurreratze-plataformarik gab landingpad.legacy.disabled = [scarlet]\ue815 Desgaituta[lightgray] (Oinordetzan hartutako jaurtiketa plataforma gaitu) rules.showspawns = Etsaien spawn-ak erakutsi rules.randomwaveai = Olatu aurreikusezinen AI +rules.pauseDisabled = Disable Pausing rules.fire = Sua rules.anyenv = rules.explosions = Blokea/Unitateko leherketa kalteak @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Karga erabilgarriaren bideratzaile indart block.payload-mass-driver.name = Karga erabilgarriaren masa-gidaria block.small-deconstructor.name = Deseraikitzaile txikia block.canvas.name = Oihala +block.large-canvas.name = Large Canvas block.world-processor.name = Munduko prozesadorea block.world-cell.name = Munduko zelula block.tank-fabricator.name = Tanke fabrikatzailea @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Sakatu eta eutsi[] bloke edo unitate txikia hint.payloadDrop = Sakatu [accent]][] karga erabilgarria botatzeko. hint.payloadDrop.mobile = [accent]Sakatu eta eutsi[] hutsik dagoen kokaleku bat karga erabilgarria hor botatzeko. hint.waveFire = Munizio gisa ura duten [accent]Olatu[] dorreak automatikoki itzaliko dituzte inguruko suteak. -hint.generator = :combustion-generator: [accent]Errekuntza sorgailuak[] ikatza erre eta energia ondoko blokeetara garraiatzen dute.\n\nPotentziatransmisioaren irismena zabaldu daiteke :power-node: [accent]Potentzia nodoekin[]. hint.guardian = [accent]Zaindari[] unitateak blindatuta daude. Munizio ahula, hala nola [accent]Kobrea[] edo [accent]Beruna[] [scarlet]ez eraginkorra[] da.\n\nErabili maila handiagoko dorreak edo :graphite: [accent]Grafitozko[] :duo:Duo/:salvo:Salba munizioa. hint.coreUpgrade = Nukleoak hobetzeko [accent]maila handiagoko nukleoak jar daitezke haien gainean[].\n\nKokatu :core-foundation: [accent]Fundazio[] nukleoa :core-shard: [accent]Shard[] nukleoaren gainean. Ziurtatu inguruko oztopoetatik libre dagoela. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Erradioan eraikitako edozer suntsitzen da olatu bat hasten denean. gz.zone3 = Bolada bat hasiko da orain\nPrestatu. gz.finish = Eraiki dorre gehiago, atera baliabide gehiago,\neta defendatu olatu guztien aurka [accent]sektorea konkistatzeko[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 93b0083d19..27b87c51f9 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -15,6 +15,7 @@ link.wiki.description = Virallinen Mindustry wiki link.suggestions.description = Ehdota uusia ominaisuuksia link.bug.description = Löysitkö bugin? Ilmoita se täällä linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Linkin avaaminen epäonnistui!\nOsoite on kopioitu leikepöydällesi. screenshot = Kuvankaappaus tallennettu sijaintiin {0} screenshot.invalid = Kartta liian laaja, levytila voi olla liian vähissä kuvankaappausta varten. @@ -124,6 +125,8 @@ maps.none = [lightgray]Karttoja ei löytynyt! invalid = Virheellinen pickcolor = Valitse väri color = Color +import = Import +export = Export preparingconfig = Valmistellaan asetuksia preparingcontent = Valmistellaan sisältöä uploadingcontent = Julkaistaan sisältöä @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Suoritettu techtree = Edistyspuu techtree.select = Edistyspuun valinta @@ -359,6 +364,7 @@ confirm = Vahvista delete = Poista view.workshop = Näytä Workshopissa workshop.listing = Muokkaa Workshop-listausta +hide = Hide ok = Ok open = Avaa customize = Muokkaa sääntöjä @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Avaa linkki @@ -428,6 +435,7 @@ saveimage = Tallenna kuva unknown = Tuntematon custom = Mukautettu builtin = Sisäänrakennettu +modded = Modded map.delete.confirm = Oletko varma että haluat poistaa tämän kartan? Poistoa ei voi peruuttaa! map.random = [accent]Satunnainen kartta map.nospawn = Tässä kartassa ei ole ytimiä joihin syntyä! Lisää {0} ydin karttaan editorissa. @@ -488,10 +496,14 @@ editor.center = Keskitä editor.search = Hae karttoja... editor.filters = Rajaa karttoja editor.filters.mode = Pelitilat: +editor.filters.priorities = Priorities: editor.filters.type = Kartan tyyppi: editor.filters.search = Search in: editor.filters.author = Tekijä editor.filters.description = Kuvaus +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Siirrä X-akselin suunnassa editor.shifty = Siirrä Y-akselin suunnassa workshop = Työpaja @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Piilota kaikki waves.units.show = Näytä kaikki +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = lukumäärä @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Tuhoa: [][lightgray]{0}[]x yksikköä objective.enemiesapproaching = [accent]Vihollinen lähestyy ajassa [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Tuhoa vihollisydin objective.command = [accent]Komenna yksikköjä objective.nuclearlaunch = [accent]⚠ Ydinaseen laukaisu havaittu: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Sektoria ei voida vaihtaa sector.noswitch = Et voi vaihtaa sektoria, kun olemassaoleva sektori on hyökkäyksen kohteena.\n\nSektori: [accent]{0}[] planeetalla [accent]{1}[] sector.view = Näytä sektori sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Matala threat.medium = Kohtalainen @@ -843,6 +858,10 @@ threat.high = Korkea threat.extreme = Äärimmäinen threat.eradication = Täystuho +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Aurinko sector.impact0078.name = Törmäys 0078 sector.groundZero.name = Tapahtumahorisontti -sector.craters.name = Kraatterit +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Jäätyneet metsät sector.ruinousShores.name = Taistelujen ranta sector.stainedMountains.name = Kalliovuoret @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Optimaalinen sijainti aloittaa jälleen kerran. Matala vihollisuhka. Vähän resursseja.\nKerää niin paljon kuparia ja lyijyä, kuin mahdollista.\nJatka matkaa. sector.frozenForest.description = Itiöt ovat levittäytyneet jopa tänne, lähemmäs vuoria. Jäätävät lämpötilat eivät voi torjua niitä ikuisesti.\n\nAloita seikkailusi virtaan. Rakenna polttogeneraattoreita. Opi käyttämään korjaajia. sector.saltFlats.description = Aavikon reunamilla sijaitsevat suolatasangot. Tässä sijainnissa resurssit ovat vähäisiä.\n\nVihollinen on pystyttänyt tänne varastokompleksin. Hävitä heidän ytimensä. Älä jätä mitään jäljelle. -sector.craters.description = Vesi on kerääntynyt tähän kraatteriin, jäännökseen vanhoista sodista. Kunnosta alue. Kerää hiekkaa. Sulata metalasia. Pumppaa vettä jäähdyttääksesi tykkitorneja ja poria. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Autiomaiden jälkeen seuraa rantaviiva. Kerran tällä alueella oli rannikkopuolustusrivi. Vain vähän siitä on säilynyt. Vain kaikkein yksinkertaisimmat puolustusrakennukset ovat säilyneet vahingoittumattomina, ja kaikki muu on hävitetty romuksi.\nJatka laajenemista ulospäin. Tutki teknologia uudelleen. sector.stainedMountains.description = Kauempana sisämaassa sijaitsevat vuoret, jotka eivät vielä ole itiöiden saastuttamia.\nKaiva tällä alueella runsasta titaania. Opi, kuinka käyttää sitä.\n\nVihollisen läsnäolo on täällä suurempaa. Älä anna heille aikaa lähettää vahvimpia joukkojaan. sector.overgrowth.description = Tämä alue on umpeenkasvanut, ja on lähempänä itiöiden lähdettä.\nVihollinen on perustanut tänne vartioaseman. Rakenna Mace-yksikköjä. Tuho se. Ota takaisin se, mikä oli menetettyä. @@ -1045,6 +1065,7 @@ stat.boosteffect = Tehostamisem vaikutus stat.maxunits = Maksimimäärä yksikköjä stat.health = Elämäpisteet stat.armor = Haarniska +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Rakentamisaika stat.maxconsecutive = Max. peräkkäisiä stat.buildcost = Rakentamishinta @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] Aluevahinko ~[stat] {1}[lightgray] pa bullet.incendiary = [stat]sytyttävä bullet.homing = [stat]itseohjautuva bullet.armorpierce = [stat]haarniskan läpäisevä -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Poista lisäosat käytöstä käynnistyskaatumisi setting.animatedwater.name = Animoitu vesi setting.animatedshields.name = Animoidut kilvet setting.playerindicators.name = Pelaajaindikaattorit +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Vihollis/Puolulais Indikaattorit setting.autotarget.name = Automaatinen Tähtäys setting.keyboard.name = Hiiri+Näppäimistö -ohjaus @@ -1269,6 +1292,8 @@ setting.fpscap.none = Ei Mitään setting.fpscap.text = {0} FPS setting.uiscale.name = UI Koko[lightgray] (vaatii uudelleenkäynnistyksen)[] setting.uiscale.description = Muutosten toteuttaminen vaatii uudelleenkäynnistyksen +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Aina vino korvaus setting.screenshake.name = Näytön keikkuminen setting.bloomintensity.name = Bloom-intensiteetti @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Tallennuksen Aikaväli setting.seconds = {0} Sekuntia setting.milliseconds = {0} millisekuntia setting.fullscreen.name = Täysnäyttö -setting.borderlesswindow.name = Reunaton Ikkuna[lightgray] (vaatii uudelleenkäynnistyksen) -setting.borderlesswindow.name.windows = Reunaton koko näytön tila -setting.borderlesswindow.description = Uudelleenkäynnistys saatetaan vaatia muutosten toteuttamiseksi. setting.fps.name = Näytä FPS setting.console.name = Salli konsoli setting.smoothcamera.name = Pehmeä kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Taustaäänet setting.mutemusic.name = Mykistä musiikki setting.sfxvol.name = SFX-voimakkuus setting.mutesound.name = Mykistä äänet -setting.crashreport.name = Lähetä anonyymejä kaatumisilmoituksia setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Luo tallenuksia automaattisesti setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Moninpeli category.blocks.name = Palikan Valinta placement.blockselectkeys = \n[lightgray]Näppäin: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Synny Uudelleen keybind.control.name = Käytä Yksikköä keybind.clear_building.name = Tyhjennä rakennus @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Loputtomat AI:n (punaisen joukkueen) resurssit rules.blockhealthmultiplier = Palikkojen elämäpistekerroin rules.blockdamagemultiplier = Palikkojen vahinkokerroin +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Yksikköjen tuotantonopeuskerroin rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Yksikköjen elämäpistekerroin @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Tuli rules.anyenv = rules.explosions = Palikkojen/Yksikköjen räjähdysvahinko @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Vahvistettu lastireititin block.payload-mass-driver.name = Lastimassalinko block.small-deconstructor.name = Pieni hajottaja block.canvas.name = Kanvaasi +block.large-canvas.name = Large Canvas block.world-processor.name = Maailmaprosessori block.world-cell.name = Maailmasolu block.tank-fabricator.name = Tankkirakentaja @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Paina ja pidä pohjassa[] pientä palikkaa t hint.payloadDrop = Paina [accent]][] pudottaaksesi lastin. hint.payloadDrop.mobile = [accent]Paina ja pidä pohjassa[] tyhjässä kohdassa pudottaaksesi lastin sinne. hint.waveFire = [accent]Aalto[]-tykit, jotka on ladattu vedellä, sammuttavat kantamalla olevia tulipaloja automaattisesti. -hint.generator = :combustion-generator: [accent]Aggregaatit[] polttavat hiiltä ja lähettävät energiaa viereisille palikoille.\n\nEnergiansiirtokantamaa voi laajentaa :power-node:[accent]Sähkötolpilla[]. hint.guardian = [accent]Vartija[]yksiköt ovat haarniskoituja. Heikot ammukset kuten [accent]kupari[] ja [accent]lyijy[][scarlet]eivät ole tehokkaita[].\n\nKäytä korkeamman tason tykkejä tai :graphite:[accent]Grafiittia[] :duo:Duon/:salvo:Salvon ammuksena voittaaksesi vartijan. hint.coreUpgrade = Ytimen voi päivittää [accent]sijoittamalla suuremman tason ytimen niiden päälle[].\n\nSijoita :core-foundation:[accent]Pohjaus[]-ydin :core-shard:[accent]Siru[]-ytimen päälle. Varmista, että tiellä ei ole esteitä. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Ampuu normaaleja ammuksia kaikkiin läheisiin vihollisiin. unit.mace.description = Ampuu liekkisuihkuja kaikkiin läheisiin vihollisiin. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index c11a66054b..66e762bbaa 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -15,6 +15,7 @@ link.wiki.description = Opsiyal na ensiklopedya ng Mindustry. link.suggestions.description = Magmungkahi ng mga bagong feature. link.bug.description = Nakahanap ng isang sira? Ipaulat dito! linkopen = Ang server na ito ay nagbigay ng isang link. Gusto mo ba na ibuksan?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Hindi mabuksan ang link!\nKinopya na sa iyong clipboard ang URL. screenshot = Kinunan na ang screenshot sa {0} screenshot.invalid = Masiyadong malaki ang lugar, maaaring kulang ang espasyo para sa screenshot. @@ -124,6 +125,8 @@ maps.none = [lightgray]Walang lugar na nahanap! invalid = Hindi Puwede pickcolor = Pumili ng Kulay color = Color +import = Import +export = Export preparingconfig = Inihahanda ang Konpigurasyon preparingcontent = Inihahanda ang mga Nilalaman uploadingcontent = Pinag-uupload ang Nilalaman @@ -212,6 +215,8 @@ campaign.none = [lightgray]Pumili ng planetang sisimulan.\nMaaari itong palitan campaign.erekir = Mas bago, mas pinakintab na content. Kadalasan ay linear na pag-unlad ng kampanya.\n\nMas mahirap. Mas mataas na kalidad at pangkalahatang karanasan. campaign.serpulo = Mas lumang nilalaman; ang klasikong karanasan. Mas open-ended.\n\nPotensyal na hindi balanseng mga mapa at mekaniko ng campaign. Hindi gaanong tapos. campaign.difficulty = Kahirapan +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Nakumpleto techtree = Tech Tree techtree.select = Pagpili ng Tech Tree @@ -359,6 +364,7 @@ confirm = Kumpirmahin delete = Tanggalin view.workshop = Tingnan Sa Workshop workshop.listing = I-edit ang Listahan sa Workshop +hide = Hide ok = OK open = Buksan customize = I-customize ang Mga Panuntunan @@ -370,7 +376,6 @@ command.repair = Ipagawa command.rebuild = Itayo command.assist = Asistahan ang maglalaro command.move = Galaw -command.boost = Magpabilis command.enterPayload = Pumasok sa payload command.loadUnits = Ipasok ang Unit command.loadBlocks = Ipasok ang tapak @@ -381,7 +386,9 @@ stance.shoot = Paninindigan: Barilan stance.holdfire = Paninindigan: Huwag Bumaril stance.pursuetarget = Paninindigan: Habulin ang Iaatake stance.patrol = Paninindigan: Patrolyang Lakarin +stance.holdposition = Stance: Hold Position stance.ram = Paninindigan: Daan\n[lightgray]Tuwid na linyang paggalaw, walang paghanag ng path +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Buksan Link @@ -428,6 +435,7 @@ saveimage = I-Save ng Imahe unknown = Di-alam custom = Di-karaniwan builtin = Gawa sa sistema +modded = Modded map.delete.confirm = Sigurado ka bang gusto mong tanggalin ang mapang ito? Ang gawaing ito ay hindi pwedeng baguhin! map.random = [accent]Kung-ano-anong Map map.nospawn = Ang mapa na ito ay walang anumang mga core para sa player upang maipabuhay! Mag-dagdag ng {0} core sa editor ng mapa! @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = I-filter ang Maps editor.filters.mode = Mode ng laro: +editor.filters.priorities = Priorities: editor.filters.type = Uri ng Map: editor.filters.search = Hanapin Sa: editor.filters.author = Manggagawa editor.filters.description = Deskripsyon +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift ang X editor.shifty = Shift ang Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Itago lahat waves.units.show = Ipakita lahat +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nai-detect ang nuclear strike: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Hindi ka mapalit sa ibang Sectors sector.noswitch = Hindi ka pwede magpalit ng sectors habang ina-atake ang isang sector mo.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = Tingnan ang Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Mababa threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = Mataas threat.extreme = Sobra-sobra threat.eradication = Tiyak na talo sa hindi handa +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Madali difficulty.normal = Normal @@ -860,43 +879,44 @@ planet.serpulo.name = Serpulo planet.erekir.name = Erekir planet.sun.name = Araw -sector.impact0078.name = Impact 0078 -sector.groundZero.name = Ground Zero -sector.craters.name = Mga Bunganga -sector.frozenForest.name = Kagubatang Nagyelo -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Complex para sa Nuklear na Produksyon -sector.overgrowth.name = Labis ng paglalaki -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass +sector.impact0078.name = Impak 0078 +sector.groundZero.name = Panimulang Punto +sector.crateredBattleground.name = Cratered Battleground +sector.frozenForest.name = Nagyeyelong Kagubatan +sector.ruinousShores.name = Warak Na Dalampasigan +sector.stainedMountains.name = Mantsadong Bulubundukin +sector.desolateRift.name = Desoladong Lambak +sector.nuclearComplex.name = Nuklear Produksyon Kompleks +sector.overgrowth.name = Kasukalan +sector.tarFields.name = Pinaglalangisan +sector.saltFlats.name = Kaasinan +sector.fungalPass.name = Pungal Na Lagusan sector.biomassFacility.name = Biomass Synthesis Facility -sector.windsweptIslands.name = Windswept Islands +sector.windsweptIslands.name = Mahanging Kapuluan sector.extractionOutpost.name = Extraction Outpost sector.facility32m.name = Pasilidad 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons +sector.taintedWoods.name = Namantsahang Kakahuyan +sector.infestedCanyons.name = Pinamumugarang Kanyon sector.planetaryTerminal.name = Planetary Launch Terminal -sector.coastline.name = Humid Coastline -sector.navalFortress.name = Kutang Pantubig -sector.polarAerodrome.name = Polar Aerodrome -sector.atolls.name = Atolls -sector.testingGrounds.name = Testing Grounds -sector.perilousHarbor.name = Perilous Harbor -sector.weatheredChannels.name = Weathered Channels -sector.fallenVessel.name = Fallen Vessel -sector.mycelialBastion.name = Mycelial Bastion -sector.frontier.name = Frontier -sector.sunkenPier.name = Sunken Pier -sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold +sector.coastline.name = Mahalumigmig na Baybayin +sector.navalFortress.name = Himpilang Pandagat +sector.polarAerodrome.name = Paliparang Polar +sector.atolls.name = Mga Atoll +sector.testingGrounds.name = Lupaing Eksperimental +sector.perilousHarbor.name = Mapanganib Na Daungan +sector.weatheredChannels.name = Napanahunang Mga Tsanel +sector.fallenVessel.name = Bumagsak Na Besel +sector.mycelialBastion.name = Tanggulang Sanghiblayanin +sector.frontier.name = Unahan +sector.sunkenPier.name = Lumubog Na Pantalan +sector.littoralShipyard.name = Littoral Shipyard +sector.cruxscape.name = Kruskapaligiran +sector.geothermalStronghold.name = Tanggulang Heotermal sector.groundZero.description = Ang pinakamainam na lokasyon upang magsimulang muli. Mababang banta ng kaaway. Kaunting mapagkukunan.\nMagtipon ng mas maraming tingga at tanso hangga't maaari.\nItuloy. sector.frozenForest.description = Kahit dito, mas malapit sa mga bundok, ang mga spore ay kumalat. Ang napakalamig na temperatura ay hindi maaaring maglaman ng mga ito magpakailanman.\n\nSimulan ang pakikipagsapalaran sa kapangyarihan. Bumuo ng mga generator ng pagkasunog. Matutong gumamit ng mga mender. sector.saltFlats.description = Sa labas ng disyerto ay matatagpuan ang Salt Flats. Ilang resource ang makikita sa lokasyong ito.\n\nNagtayo ang kaaway ng resource storage complex dito. Tanggalin ang kanilang core. Walang iwanan na nakatayo. -sector.craters.description = Ang tubig ay naipon sa bunganga na ito, relic ng mga lumang digmaan. Bawiin ang lugar. Mangolekta ng buhangin. Gumawa ng metaglass. Magbomba ng tubig upang palamig ang mga turret at drill. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Nakalipas ang mga basura, ay ang baybayin. Minsan, ang lokasyong ito ay mayroong hanay ng pagtatanggol sa baybayin. Hindi gaanong natitira. Tanging ang pinakapangunahing mga istruktura ng depensa ang nananatiling hindi nasaktan, lahat ng iba pa ay nabawasan sa scrap.\nIpagpatuloy ang pagpapalawak. Tuklasin muli ang teknolohiya. sector.stainedMountains.description = Sa kabilang bahagi ng lupain ay matatagpuan ang mga bundok, ngunit hindi nababahiran ng mga spores.\nI-extract ang masaganang titanium sa lugar na ito. Alamin kung paano ito gamitin.\n\nMas malaki ang presensya ng kaaway dito. Huwag silang bigyan ng oras na ipadala ang kanilang pinakamalakas na unit. sector.overgrowth.description = Ang lugar na ito ay tinutubuan, mas malapit sa pinagmumulan ng mga spores.\nNagtatag ang kalaban ng isang outpost dito. Bumuo ng mga yunit ng Titan. Sirain mo. Bawiin ang nawala. @@ -1045,6 +1065,7 @@ stat.boosteffect = Epekto ng Lakas stat.maxunits = Max Active Units stat.health = Health stat.armor = Baluti +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Oras ng pagbuo stat.maxconsecutive = Max Consecutive stat.buildcost = Gastos ng pagbuo @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Huwag paganahin ang Mods Sa Startup Crash setting.animatedwater.name = Animated Fluids setting.animatedshields.name = Animated Shields setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Enemy Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls @@ -1269,6 +1292,8 @@ setting.fpscap.none = None setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling[lightgray] (restart required)[] setting.uiscale.description = Kinakailangan ang pag-restart upang mailapat ang mga pagbabago. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Palaging Diagonal na Placement setting.screenshake.name = Screen Shake setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Save Interval setting.seconds = {0} segundo setting.milliseconds = {0} millisegundo setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Maaaring kailanganin ang pag-restart upang mailapat ang mga pagbabago. setting.fps.name = Ipakita ang FPS & Ping setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound -setting.crashreport.name = Mag-send ng Anonymous Crash Reports setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Clear Building @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]I-tap nang matagal ang[] isang maliit na blo hint.payloadDrop = Pindutin ang [accent]][] para mag-drop ng payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 87f7fbd4cf..7743f5b1a2 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki officiel de Mindustry link.suggestions.description = Suggérez de nouvelles fonctionnalités link.bug.description = Vous avez trouvé un bug ? Reportez-le ici linkopen = Ce serveur vous a envoyé un lien. Êtes-vous certain de vouloir l’ouvrir ?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = L'ouverture du lien a échoué ! \nL'URL a été copiée dans votre presse-papier. screenshot = Capture d'écran sauvegardée dans {0} screenshot.invalid = Carte trop grande, potentiellement pas assez de mémoire pour la capture d'écran. @@ -99,10 +100,10 @@ level.select = Sélection du niveau 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 = Base de données principale database.button = Base de données -database.patched = Modified by data patches. -viewfields = View Content Fields +database.patched = Modifié par des correctifs sur les données. +viewfields = Voir les domaines de contenu savegame = Sauvegarder la partie loadgame = Charger une partie joingame = Rejoindre une partie @@ -123,7 +124,9 @@ continue = Continuer maps.none = [lightgray]Aucune carte trouvée ! invalid = Invalide pickcolor = Choisir la Couleur -color = Color +color = Couleur +import = Import +export = Export preparingconfig = Préparation de la configuration preparingcontent = Préparation du contenu uploadingcontent = Publication du contenu @@ -161,7 +164,7 @@ mod.circulardependencies = [red]Dépendances circulaires mod.incompletedependencies = [red]Dépendances incomplètes mod.requiresversion.details = Requiert la version: [accent]{0}[]\nVotre jeu n'est pas à jour. Ce mod a besoin d'une version récente du jeu (la beta ou l'alpha) pour fonctionner. -mod.incompatiblemod.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 154[] to its [accent]mod.json[] file. +mod.incompatiblemod.details = Ce mod est incompatible avec la dernière version du jeu. L'auteur doit le mettre à jour et ajouter [accent]minGameVersion: 154[] à son fichier [accent]mod.json[]. mod.blacklisted.details = Ce mod à été mis sur liste noire, car il cause des plantages ou d'autres problèmes avec la version actuelle du jeu. Ne l'utilisez pas. mod.missingdependencies.details = Ce mod à des dépendances manquantes: {0} mod.erroredcontent.details = Ce mod cause des erreurs lors du chargement. Demandez à l'auteur de les régler. @@ -187,9 +190,9 @@ mod.preview.missing = Avant de publier ce mod dans le Steam Workshop, vous devez mod.folder.missing = Seuls les mods sous forme de dossiers peuvent être publiés sur le Steam Workshop.\nPour convertir n'importe quel mod en un dossier, décompressez-le tout simplement dans un dossier et supprimez l'ancien zip, puis redémarrez votre jeu ou rechargez vos mods. mod.scripts.disable = Votre appareil ne prend pas en charge les mods avec des scripts. Vous devez désactiver ces mods pour pouvoir jouer. -mod.dependencies.error = [scarlet]Mods are missing dependencies +mod.dependencies.error = [scarlet]Il manque des dépendances de mods. mod.dependencies.soft = (optionnel) -mod.dependencies.download = Import +mod.dependencies.download = Importer mod.dependencies.downloadreq = Importer les requis mod.dependencies.downloadall = Importer les tous mod.dependencies.status = Résultat de l'import @@ -212,6 +215,8 @@ campaign.none = [lightgray]Sélectionnez votre planète de départ.\nCela peut campaign.erekir = Contenu récent et mieux travaillé. Une progression dans la campagne assez linéaire.\n\nPlus difficile. Des cartes et une expérience de qualité. campaign.serpulo = Contenu ancien, l'expérience classique de Mindustry. Avec plus de contenu et de possibilités.\n\nCartes et mécaniques de campagnes possiblement moins équilibrées. Moins travaillé. campaign.difficulty = Difficulté +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Complété techtree = Arbre technologique techtree.select = Sélection de l'Arbre technologique @@ -289,9 +294,9 @@ player.trace = Tracer player.admin = Activer Admin player.team = Changer Équipe -server.bans = Bans +server.bans = Bannissements server.bans.none = Aucun joueur banni trouvé ! -server.admins = Admins +server.admins = Administrateurs server.admins.none = Aucun administrateur trouvé ! server.add = Ajouter un serveur server.delete = Êtes-vous sûr de vouloir supprimer ce serveur ? @@ -314,7 +319,7 @@ disconnect.error = Un problème est survenu lors de la connexion. disconnect.closed = Connexion fermée. disconnect.timeout = Délai de connexion expiré. disconnect.data = Les données du monde n'ont pas pu être chargées ! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.snapshottimeout = Délai d'attente expiré en attendant la reception des instantanés UDP. \nCela peut être causé par un réseau ou une connexion instable. cantconnect = Impossible de rejoindre ([accent]{0}[]). connecting = [accent]Connexion... reconnecting = [accent]Reconnexion... @@ -353,12 +358,13 @@ save.wave = Vague {0} save.mode = Mode de jeu : {0} save.date = Dernière sauvegarde : {0} save.playtime = Temps de jeu : {0} -dontshowagain = Don't show again +dontshowagain = Ne plus montrer warning = Avertissement. confirm = Confirmer delete = Supprimer view.workshop = Voir dans le Steam Workshop workshop.listing = Éditer la liste du Steam Workshop +hide = Hide ok = OK open = Ouvrir customize = Personnaliser @@ -370,20 +376,21 @@ command.repair = Réparer command.rebuild = Reconstruire command.assist = Assister command.move = Bouger -command.boost = Booster command.enterPayload = Entrer dans Bloc de Transport command.loadUnits = Transporter Unités command.loadBlocks = Transporter Blocs command.unloadPayload = Poser Chargement -command.loopPayload = Loop Unit Transfer +command.loopPayload = Transfert d'Unité en Boucle stance.stop = Annuler les Ordres stance.shoot = Ordre: Tirer stance.holdfire = Ordre: Ne pas Tirer stance.pursuetarget = Ordre: Poursuivre Cible stance.patrol = Ordre: Chemins de Contrôle +stance.holdposition = Stance: Hold Position stance.ram = Ordre: Charger\n[lightgray]Mouvement en ligne droite, sans détection de chemins -stance.mineauto = Automatic Mining -stance.mine = Mine Item: {0} +stance.boost = Boost +stance.mineauto = Minage automatique +stance.mine = Miner l'objet: {0} openlink = Ouvrir le lien copylink = Copier le lien back = Retour @@ -428,6 +435,7 @@ saveimage = Sauvegarder l'image unknown = Inconnu custom = Personnalisé builtin = Intégré +modded = Moddé map.delete.confirm = Voulez-vous vraiment supprimer cette carte ?\nIl n'y aura pas de retour en arrière ! map.random = [accent]Carte aléatoire map.nospawn = Cette carte n'a aucun noyau pour que les joueurs puissent apparaître !\nAjoutez au moins un Noyau {0} sur cette carte dans l'éditeur. @@ -448,9 +456,9 @@ publish.confirm = Êtes-vous sûr de vouloir publier ceci ?\n\n[lightgray]Assure publish.error = Erreur de publication de l'élément : {0} steam.error = Échec d'initialisation des services Steam.\nErreur : {0} -editor.showblocks = Show Blocks -editor.showterrain = Show Terrain -editor.showfloor = Show Floor +editor.showblocks = Montrer les blocs +editor.showterrain = Montrer le terrain +editor.showfloor = Montrer le sol editor.planet = Planète : editor.sector = Secteur : editor.seed = Graine : @@ -488,10 +496,14 @@ editor.center = Centrer editor.search = Recherche de cartes... editor.filters = Filtrer les cartes editor.filters.mode = Modes de jeu : +editor.filters.priorities = Priorities: editor.filters.type = Type de carte : editor.filters.search = Rechercher dans : editor.filters.author = Auteur editor.filters.description = Description +editor.filters.modname = Nom du mod +editor.filters.prioritizemod = Priorité du mod +editor.filters.prioritizecustom = Priorité personnalisée editor.shiftx = Décalage X editor.shifty = Décalage Y workshop = Steam Workshop @@ -518,7 +530,7 @@ 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 les vagues par défaut. -waves.sort = Trier Par +waves.sort = Trier par waves.sort.reverse = Tri inversé waves.sort.begin = Vague waves.sort.health = Santé @@ -527,19 +539,20 @@ waves.search = Rechercher des vagues... waves.filter = Filtre d'Unité waves.units.hide = Masquer tout waves.units.show = Afficher tout +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = compte wavemode.totals = totaux wavemode.health = santé -all = All +all = Tout editor.default = [lightgray] details = Détails... edit = Modifier... variables = Variables logic.clear.confirm = Êtes-vous sûr de vouloir supprimer tout le code de ce processeur? -logic.restart = Restart +logic.restart = Redémarrer logic.globals = Variables prédéfinies editor.name = Nom : @@ -553,7 +566,7 @@ editor.errorlegacy = Cette carte est trop ancienne et utilise un format de carte editor.errornot = Ceci n'est pas un fichier de carte. editor.errorheader = Ce fichier de carte est invalide ou corrompu. editor.errorname = La carte n'a pas de nom. Essayez-vous de charger une sauvegarde ? -editor.errorlocales = Error reading invalid locale bundles. +editor.errorlocales = Erreur lors de la lecture des paquets locaux. editor.update = Mettre à jour editor.randomize = Générer editor.moveup = Monter @@ -606,8 +619,8 @@ toolmode.fillteams = Remplir les équipes toolmode.fillteams.description = Remplit les équipes\nau lieu des blocs. toolmode.fillerase = Remplir et effacer toolmode.fillerase.description = Efface les blocs\ndu même type. -toolmode.fillcliffs = Fill Cliffs -toolmode.fillcliffs.description = Turns walls into cliffs. +toolmode.fillcliffs = Remplir les Falaises +toolmode.fillcliffs.description = Transformer les murs en falaises. toolmode.drawteams = Dessiner les équipes toolmode.drawteams.description = Change les équipes\nau lieu de blocs. #unused @@ -632,7 +645,7 @@ filter.clear = Effacer filter.option.ignore = Ignorer filter.scatter = Disperser filter.terrain = Terrain -filter.logic = Logic +filter.logic = Logique filter.option.scale = Échelle filter.option.chance = Chance @@ -731,7 +744,7 @@ marker.point.name = Point marker.shape.name = Forme marker.text.name = Texte marker.line.name = Ligne -marker.quad.name = Quad +marker.quad.name = Quadrilatère marker.texture.name = Texture marker.background = Fond @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Détruisez: [][lightgray]{0}[]x Unités objective.enemiesapproaching = [accent]Arrivée des ennemis dans [lightgray]{0}[] objective.enemyescelating = [accent]La production ennemie augmente dans [lightgray]{0}[] objective.enemyairunits = [accent]La production d'unités aériennes ennemies commence dans [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Détruisez le Noyau Ennemi objective.command = [accent]Commandez des Unités objective.nuclearlaunch = [accent]⚠ Lancement nucléaire détecté: [lightgray]{0} @@ -759,10 +773,10 @@ loadout = Chargement resources = Ressources resources.max = Max bannedblocks = Blocs bannis -unbannedblocks = Unbanned Blocks +unbannedblocks = Blocs débannis objectives = Objectifs bannedunits = Unités bannies -unbannedunits = Unbanned Units +unbannedunits = Unités débannies bannedunits.whitelist = Unités bannies en tant que liste blanche bannedblocks.whitelist = Blocs bannis en tant que liste blanche addall = Ajouter TOUT @@ -785,7 +799,7 @@ error.mapnotfound = Fichier de carte introuvable ! error.io = Erreur de Réseau (I/O) error.any = Erreur de réseau inconnue. error.bloom = Échec de l'initialisation du flou lumineux.\nIl se peut que votre appareil ne le prenne pas en charge. -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. +error.moddex = Mindustry n'est pas capable de charger ce mod. \nVotre appareil bloque l'importation de mods Java à cause de changement récent sur Android. \nIl n'y pas de solution connue à ce problème. weather.rain.name = Pluie weather.snowing.name = Neige @@ -810,12 +824,12 @@ sectors.wave = Vague : sectors.stored = Stockage : sectors.resume = Reprendre sectors.launch = Décoller -sectors.nolaunchcandidate = No Launch Sector -sectors.viewsubmission = \ue80d View Submissions +sectors.nolaunchcandidate = Pas de Secteur de Lancement +sectors.viewsubmission = \ue80d Afficher les soumissions sectors.select = Sélectionner -sectors.launchselect = Select Launch Destination +sectors.launchselect = Selectionner la Destination du Lancement sectors.nonelaunch = [lightgray]Vide (soleil) -sectors.redirect = Redirect Launch Pads +sectors.redirect = Rediriger les plateformes de lancement sectors.rename = Renommer le secteur sectors.enemybase = [scarlet]Base ennemie sectors.vulnerable = [scarlet]Vulnérable @@ -824,7 +838,7 @@ sectors.go = Aller sector.abandon = Abandonner sector.abandon.confirm = Les noyaux de ce secteur vont s'auto-détruire.\nContinuer ? sector.curcapture = Secteur capturé -sector.lockdown = [red]:warning:[accent] Sector currently under attack\n[lightgray]production, research, export and import disabled +sector.lockdown = [red]:Alerte:[accent] Secteur en cours d'attaque\n[lightgray]La production, la recherche, les exports et imports sont désactivés sector.curlost = Secteur perdu sector.missingresources = [scarlet]Ressources du Noyau insuffisantes ! sector.attacked = Secteur [accent]{0}[white] attaqué ! @@ -835,7 +849,8 @@ sector.changeicon = Changer l'Icône sector.noswitch.title = Impossible de changer de Secteur sector.noswitch = Vous ne pouvez pas changer de secteur pendant qu’un autre est attaqué.\n\nSecteur: [accent]{0}[] sur [accent]{1}[] sector.view = Voir le secteur -sector.foundationrequired = [lightgray] Core: Foundation Required +sector.foundationrequired = [lightgray] Noyau: Fondation Requise +sector.shielded = [lightgray] Shielded threat.low = Faible threat.medium = Normale @@ -843,6 +858,10 @@ threat.high = Grande threat.extreme = Extrême threat.eradication = Éradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Paisible difficulty.easy = Facile difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Soleil sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Un endroit optimal pour commencer. Avec une menace ennemie faible et peu de ressources disponibles.\nRassemblez autant de cuivre et de plomb que possible pour continuer votre exploration. sector.frozenForest.description = Même ici, près des montagnes, les spores se sont propagées. Les températures glaciales ne pourront pas les contenir indéfiniment.\n\nCommencez votre production d'énergie en construisant des générateurs à combustion et apprenez à utiliser les bâtiments de soin. sector.saltFlats.description = À la périphérie du désert se trouvent les déserts de sel. Peu de ressources s'y trouvent.\n\nLà-bas, l'ennemi a construit un complexe de stockage de ressource. Détruisez leur Noyau et ne laissez rien debout. -sector.craters.description = Ce cratère est une relique d'anciennes guerres. De l'eau s'est accumulée au fond. Prenez le contrôle de la zone.\nCollectez du Sable et faites fondre du Verre trempé. Pompez de l'eau pour refroidir vos tourelles et vos foreuses. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Au-delà des déchets se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il n’en reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant leurs technologies. sector.stainedMountains.description = Plus loin, à l’intérieur des terres, se trouvent des montagnes qui n'ont pas été touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps d’envoyer leurs unités les plus fortes. sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le. @@ -1045,6 +1065,7 @@ stat.boosteffect = Effet(s) du Booster stat.maxunits = Max d'Unités Actives stat.health = Santé stat.armor = Armure +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Durée de construction stat.maxconsecutive = Max consécutif stat.buildcost = Coût de construction @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgra bullet.incendiary = [stat]incendiaire bullet.homing = [stat]autoguidé bullet.armorpierce = [stat]perceur d'armure -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] limite de dégâts bullet.suppression = [stat]{0} sec[lightgray] suppression de soins ~ [stat]{1}[lightgray] blocs @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Désactiver les mods lors d'un crash au démarrag setting.animatedwater.name = Surfaces Animées setting.animatedshields.name = Boucliers Animés setting.playerindicators.name = Indicateurs d'alliés +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicateurs d'ennemis setting.autotarget.name = Visée automatique setting.keyboard.name = Contrôles Souris+Clavier @@ -1269,6 +1292,8 @@ setting.fpscap.none = Illimité setting.fpscap.text = {0} FPS setting.uiscale.name = Échelle de l'interface setting.uiscale.description = Redémarrage du jeu nécessaire pour appliquer les changements. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Autoriser le placement en diagonale setting.screenshake.name = Tremblement de l'Écran setting.bloomintensity.name = Intensité de l'effet de Bloom @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Intervalle des Sauvegardes automatiques setting.seconds = {0} secondes setting.milliseconds = {0} millisecondes setting.fullscreen.name = Plein Écran -setting.borderlesswindow.name = Fenêtré sans bordures -setting.borderlesswindow.name.windows = Plein écran sans bordure -setting.borderlesswindow.description = Un redémarrage peut être nécessaire pour appliquer les changements. setting.fps.name = Afficher les FPS et le Ping setting.console.name = Activer la Console setting.smoothcamera.name = Lissage de la Caméra @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volume Ambiant setting.mutemusic.name = Couper la Musique setting.sfxvol.name = Volume des Sons et Effets setting.mutesound.name = Couper les Sons et Effets -setting.crashreport.name = Envoyer des Rapports de crash anonymes setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Sauvegardes Automatiques setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Commandes d'Unité category.multiplayer.name = Multijoueur category.blocks.name = Sélection des blocs placement.blockselectkeys = \n[lightgray]Raccourci : [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Réapparaître keybind.control.name = Contrôler une Unité keybind.clear_building.name = Réinitialiser les constructions @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Ordre: Ne pas tirer keybind.unit_stance_pursue_target.name = Ordre: Poursuivre la cible keybind.unit_stance_patrol.name = Ordre: Patrouille keybind.unit_stance_ram.name = Ordre: Charger +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge) rules.blockhealthmultiplier = Multiplicateur de Santé des Blocs rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités rules.unitcostmultiplier = Multiplicateur du coût de fabrication des Unités rules.unithealthmultiplier = Multiplicateur de Santé des Unités @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Feu rules.anyenv = rules.explosions = Dégâts d'explosion des Blocs/Unités @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Routeur de Charges Utiles Renforcé block.payload-mass-driver.name = Transporteur de Charges Utiles block.small-deconstructor.name = Petit Déconstructeur block.canvas.name = Canevas +block.large-canvas.name = Large Canvas block.world-processor.name = Processeur Global block.world-cell.name = Cellule de Mémoire Globale block.tank-fabricator.name = Fabricateur de Tanks @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transpor hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement. hint.payloadDrop.mobile = [accent]Tapez et retenez[] votre doigt pour larguer votre chargement. hint.waveFire = [accent]Les tourelles à liquides[], approvisionnées en eau en tant que munition, peuvent automatiquement éteindre les incendies proches. -hint.generator = :combustion-generator: Les [accent]Générateurs à combustion[] brûlent du Charbon et transmettent de l'énergie aux blocs adjacents.\n\nLa transmission d'énergie peut être étendue avec des :power-node: [accent]Transmetteurs Énergétiques[]. 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 :graphite: [accent]Graphite[] avec un :duo:Duo/:salvo:Salve 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 :core-foundation: Noyau [accent]Fondation[] sur le :core-shard: Noyau [accent]Fragment[]. Soyez sûrs que rien n'obstrue la construction. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Tout ce qui est construit dans le rayon est détruit lors du commence gz.zone3 = Une vague va commencer maintenant.\nPréparez-vous. gz.finish = Construisez plus de tourelles, minez plus de resources,\net défendez-vous contre toutes les vagues ennemies afin de [accent]capturer ce secteur[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Répare toutes les unités à proximité. block.radar.description = Découvre progressivement le terrain et les unités ennemies dans un large rayon. Nécessite de l'énergie. block.shockwave-tower.description = Endommage et détruit les projectiles ennemis dans un rayon. Nécessite du cyanogène. block.canvas.description = Affiche une image simple avec une palette prédéfinie. Modifiable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Tire des balles normales aux ennemis proches. unit.mace.description = Tire des jets de flammes aux ennemis proches. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 2dbacb1702..efffb3d960 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -15,6 +15,7 @@ link.wiki.description = Hivatalos Mindustry wiki link.suggestions.description = Új funkciók ajánlása link.bug.description = Találtál egy szoftverhibát? Itt jelentheted linkopen = Ez a kiszolgáló egy hivatkozást küldött. Biztosan megnyitod?\nAkár kártékony is lehet!\n\n[sky]{0} +clipboardcopy = Ez a kiszolgáló szöveget szeretne másolni a vágólapra. Biztosan folytatni szeretnéd?\nAkár kártékony is lehet!\n\n[sky]{0} linkfail = Nem sikerült megnyitni a hivatkozást!\nA webcím a vágólapra lett másolva. screenshot = Képernyőkép mentve ide: {0} screenshot.invalid = A pálya túl nagy és nem áll rendelkezésre elegendő memória a képernyőkép elkészítéséhez. @@ -124,6 +125,8 @@ maps.none = [lightgray]Nem találhatók pályák! invalid = Érvénytelen pickcolor = Válassz színt color = Szín +import = Importálás +export = Exportálás preparingconfig = Konfiguráció előkészítése preparingcontent = Tartalom előkészítése uploadingcontent = Tartalom feltöltése @@ -212,6 +215,8 @@ campaign.none = [lightgray]Válassz egy bolygót a kezdéshez.\nEzt bármikor me campaign.erekir = Újabb, csiszoltabb tartalom. Többnyire lineáris játékmenet.\n\nSokkal nehezebb. Magasabb minőségű pályák és élmények. campaign.serpulo = Régebbi tartalom. A klasszikus élmény. Nyíltabb végű, több tartalommal.\n\nPotenciálisan kiegyensúlyozatlan pályák és hadjárat. Kevésbé csiszolt. campaign.difficulty = Nehézségi szint +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Kifejlesztve techtree = Technológiafa techtree.select = Technológiafa kiválasztása @@ -359,6 +364,7 @@ confirm = Megerősítés delete = Törlés view.workshop = Megtekintés a Steam Műhelyben workshop.listing = Steam Műhely listázásának szerkesztése +hide = Elrejtés ok = OK open = Megnyitás customize = Szabályok módosítása @@ -370,7 +376,6 @@ command.repair = Javítás command.rebuild = Újjáépítés command.assist = Játékos segítése command.move = Mozgás -command.boost = Erősítés command.enterPayload = Berakodás a raktérbe command.loadUnits = Egységek felvétele command.loadBlocks = Blokkok felvétele @@ -380,8 +385,10 @@ stance.stop = Parancsok visszavonása stance.shoot = Viselkedés: lövés stance.holdfire = Viselkedés: tüzet szüntess stance.pursuetarget = Viselkedés: célpont követése -stance.patrol = Viselkedés: járőrözési útvonal +stance.patrol = Viselkedés: járőrözési nyomvonal +stance.holdposition = Viselkedés: helyben maradás stance.ram = Viselkedés: ütközés\n[lightgray]Egyenes vonalú mozgás, útkeresés nélkül +stance.boost = Erősítés stance.mineauto = Automatikus bányászás stance.mine = {0} bányászása openlink = Hivatkozás megnyitása @@ -428,6 +435,7 @@ saveimage = Kép mentése unknown = Ismeretlen custom = Egyéni builtin = Beépített +modded = Moddolt map.delete.confirm = Biztosan törlöd ezt a pályát? Ezt a műveletet nem lehet visszavonni! map.random = [accent]Véletlenszerű pálya map.nospawn = Ezen a pályán nincs egyetlen támaszpont sem, amellyel a játékos kezdhet! Adj hozzá egy {0} támaszpontot a pályához a szerkesztőben. @@ -488,10 +496,14 @@ editor.center = Ugrás középre editor.search = Pályák keresése… editor.filters = Pályák szűrése editor.filters.mode = Játékmódok: +editor.filters.priorities = Előnyben részesítések: editor.filters.type = Pályatípus: editor.filters.search = Keresés ebben: editor.filters.author = Szerző editor.filters.description = Leírás +editor.filters.modname = Mod neve +editor.filters.prioritizemod = Mod előnyben részesítése +editor.filters.prioritizecustom = Egyéni előnyben részesítés editor.shiftx = X-eltolás editor.shifty = Y-eltolás workshop = Steam Műhely @@ -527,6 +539,7 @@ waves.search = Hullám keresése… waves.filter = Egységszűrő waves.units.hide = Összes elrejtése waves.units.show = Összes megjelenítése +pause.disabled = [scarlet]A szüneteltetés le van tiltva #these are intentionally in lower case wavemode.counts = típusokra bontás @@ -619,7 +632,7 @@ filters.empty = [lightgray]Még nincs szűrő! Adj hozzá egyet a lenti gombra k filter.distort = Torzítás filter.noise = Zaj filter.enemyspawn = Ellenséges kezdőpont kiválasztása -filter.spawnpath = Útvonal a kezdőponthoz +filter.spawnpath = Nyomvonal a kezdőponthoz filter.corespawn = Támaszpont kiválasztása filter.median = Medián filter.oremedian = Érc medián @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Semmisíts meg: [][lightgray]{0}[] db egységet objective.enemiesapproaching = [accent]Ellenség érkezik: [lightgray]{0}[] mp múlva objective.enemyescelating = [accent]Az ellenséges gyártás fokozódik: [lightgray]{0}[] mp múlva objective.enemyairunits = [accent]Az ellenséges légi egységek gyártása elkezdődik: [lightgray]{0}[] mp múlva +objective.enemyunitproduction = [accent]Az ellenséges szárazföldi egységek gyártása elkezdődik: [lightgray]{0}[] mp múlva objective.destroycore = [accent]Semmisítsd meg az ellenséges támaszpontot objective.command = [accent]Irányítsd az egységeket objective.nuclearlaunch = [accent]⚠ Rakétakilövés észlelve: [lightgray]{0} @@ -835,7 +849,8 @@ sector.changeicon = Ikon módosítása sector.noswitch.title = A szektorváltás nem lehetséges sector.noswitch = Nem válthatsz szektort, amíg egy meglévő szektor támadás alatt áll.\n\nSzektor: [accent]{0}[] a(z) [accent]{1}[] bolygón sector.view = A szektor megtekintése -sector.foundationrequired = [lightgray] Alapítvány támaszpont szükséges +sector.foundationrequired = [lightgray] Alapítvány támaszpont szükséges a közelben +sector.shielded = [lightgray] Shielded threat.low = Alacsony threat.medium = Közepes @@ -843,6 +858,10 @@ threat.high = Magas threat.extreme = Extrém threat.eradication = Irtózatos +difficulty.guide.title = Megjegyzés +difficulty.guide = Ha a hadjárat egy szektora túl nagy kihívást jelent a számodra, finomhangolhatod a nehézségi szintet a könnyedebb játékélmény érdekében. +difficulty.guide.confirm = Nehézségi szint finomhangolása + difficulty.casual = Laza difficulty.easy = Könnyű difficulty.normal = Normál @@ -862,7 +881,7 @@ planet.sun.name = Nap sector.impact0078.name = 0078-as becsapódás sector.groundZero.name = Becsapódási pont -sector.craters.name = A kráterek +sector.crateredBattleground.name = Kráteres csatamező sector.frozenForest.name = Fagyott erdő sector.ruinousShores.name = Romos partok sector.stainedMountains.name = Foltos hegyek @@ -890,13 +909,14 @@ sector.fallenVessel.name = Elveszett hajó sector.mycelialBastion.name = Micéliumbástya sector.frontier.name = Frontvidék sector.sunkenPier.name = Elsüllyedt móló +sector.littoralShipyard.name = Part menti hajógyár sector.cruxscape.name = Crux-vidék sector.geothermalStronghold.name = Geotermikus erődítmény sector.groundZero.description = Az ideális helyszín, hogy ismét belekezdjünk. Alacsony ellenséges fenyegetés. Kevés nyersanyag.\nGyűjts annyi rezet és ólmot, amennyit csak tudsz.\nFolytasd a küldetést. sector.frozenForest.description = Még itt, a hegyekhez közel is elterjedtek a spórák. A fagypont alatti hőmérséklet nem tudja örökké fogva tartani őket.\n\nFedezd fel az elektromosság erejét. Építs égetőerőműveket. Tanuld meg, hogyan használd a foltozókat. sector.saltFlats.description = A sivatag peremén terülnek el a Sós síkságok. Kevés nyersanyag található errefelé.\n\nAz ellenség egy raktárkomplexumot létesített itt. Pusztítsd el a támaszpontjukat. Kő kövön ne maradjon. -sector.craters.description = Víz gyűlt össze ebben a kráterben, amely régi háborúk emlékét őrzi. Szerezd vissza a területet. Gyűjts homokot. Olvassz üveget, és szivattyúzz vizet a fúróid és lövegtornyaid hűtéséhez. +sector.crateredBattleground.description = Víz gyűlt össze ebben a kráterben, amely régi háborúk emlékét őrzi. Szerezd vissza a területet. Gyűjts homokot. Olvassz üveget, és szivattyúzz vizet a fúróid és lövegtornyaid hűtéséhez. sector.ruinousShores.description = A pusztaság mögött a partvonal húzódik. Valaha ezen a helyen egy partvédelmi rendszer állt. Nem sok minden maradt belőle. Csak a legalapvetőbb védelmi szerkezetek maradtak érintetlenül, minden más csak törmelék lett.\nFolytasd a terjeszkedést. Fedezd fel újra a technológiát. sector.stainedMountains.description = Mélyebben a szárazföldön fekszenek a hegyek, a spóráktól még érintetlenül.\nTermeld ki a bőséges titán készleteket a körzetben. Tanuld meg felhasználni.\n\nAz ellenség itt nagyobb létszámban van jelen. Ne hagyj nekik időt, hogy a legerősebb egységeiket hadba állíthassák. sector.overgrowth.description = Ez a terület közelebb esik a spórák forrásához, a spórák már kinőtték.\nAz ellenség egy helyőrséget létesített itt. Építs Mace egységeket. Pusztítsd el a bázist. @@ -1013,7 +1033,7 @@ stat.frequency = Frekvencia stat.targetsair = Légi célpontok stat.targetsground = Földi célpontok stat.crushdamage = Zúzó sebzés -stat.legsplashdamage = Lábbal okozott területsebzés +stat.legsplashdamage = Lábbal okozott területi sebzés stat.itemsmoved = Szállítási sebesség stat.launchtime = Kilövések közötti idő stat.shootrange = Hatótávolság @@ -1045,6 +1065,7 @@ stat.boosteffect = Erősítés hatása stat.maxunits = Aktív egységek (legfeljebb) stat.health = Életpont stat.armor = Páncél +stat.armor.info = Tényleges sebzés = bejövő sebzés - páncél.\nA sebzéscsökkentés legfeljebb 90% lehet. stat.buildtime = Építési időtartam stat.maxconsecutive = Egymást követő nyersanyagok (legfeljebb) stat.buildcost = Építési költség @@ -1103,7 +1124,7 @@ ability.armorplate = Páncéllemez ability.armorplate.description = Csökkenti a kapott sebzést lövés közben ability.shieldarc = Pajzsív ability.shieldarc.description = Olyan pajzsot vetít ki egy ívben, amely elnyeli vagy eltéríti a lövedékeket, rakétákat és egységeket -ability.suppressionfield = Javítás elnyomása +ability.suppressionfield = Javításelnyomás ability.suppressionfield.description = Leállítja a közeli javítóépületeket és lövegtornyokat épít ability.energyfield = Energiamező ability.energyfield.description = Megrázza a közeli ellenségeket @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] területi sebzés ~[stat] {1}[lightgr bullet.incendiary = [stat]gyújtó bullet.homing = [stat]nyomkövető bullet.armorpierce = [stat]páncélátütő -bullet.armorweakness = [red]{0}%[lightgray] páncélgyengítés -bullet.armorpiercing = [stat]{0}%[lightgray] páncélátütés +bullet.armorweakness = [red]{0}x[lightgray] páncélgyengítés +bullet.partialarmorpierce = [stat]{0}%[lightgray] páncélátütés bullet.antiarmor = [stat]{0} db[lightgray] páncélelhárító lövedék bullet.maxdamagefraction = [stat]{0}%[lightgray] sebzési határérték bullet.suppression = [stat]{0} mp[lightgray] javításelnyomás ~[stat]{1}[lightgray] mező @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Modok letiltása indításkori összeomláskor setting.animatedwater.name = Animált felületek setting.animatedshields.name = Animált pajzsok setting.playerindicators.name = Játékosjelzők +setting.showpings.name = Pingek megjelenítése +setting.showotherbuildplans.name = Más játékosok építési terveinek megjelenítése setting.indicators.name = Ellenségjelzők setting.autotarget.name = Automatikus célzás setting.keyboard.name = Irányítás egérrel és billentyűzettel (kísérleti) @@ -1269,6 +1292,8 @@ setting.fpscap.none = Nincs setting.fpscap.text = {0} FPS setting.uiscale.name = Felület méretezése setting.uiscale.description = A módosítások érvénybe lépéséhez újraindítás szükséges. +setting.uiEdgePadding.name = Kijelző széleinek kitöltése +setting.uiEdgePadding.description = A felhasználói felület kitölti a kijelző széleit.\nHasznos a lekerekített sarkú vagy szenzorszigettel rendelkező eszközök esetén. setting.swapdiagonal.name = Mindig átlós elhelyezés setting.screenshake.name = Képernyő rázkódása setting.bloomintensity.name = Bloom intenzitása @@ -1276,15 +1301,12 @@ setting.bloomblur.name = Bloom elmosása setting.effects.name = Hatások megjelenítése setting.destroyedblocks.name = Lerombolt építmények megjelenítése setting.blockstatus.name = Blokkok állapotának megjelenítése -setting.conveyorpathfinding.name = Szállítószalag útvonalkeresése építéskor +setting.conveyorpathfinding.name = Szállítószalag nyomvonalkeresése építéskor setting.sensitivity.name = Kontroller érzékenysége setting.saveinterval.name = Mentési időköz setting.seconds = {0} másodperc setting.milliseconds = {0} ezredmásodperc setting.fullscreen.name = Teljes képernyő -setting.borderlesswindow.name = Keret nélküli ablak -setting.borderlesswindow.name.windows = Keret nélküli teljes képernyő -setting.borderlesswindow.description = A változtatások érvénybe lépéséhez újraindításra lehet szükség. setting.fps.name = FPS, memóriahasználat és ping megjelenítése setting.console.name = Konzol engedélyezése setting.smoothcamera.name = Egyenletes kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Környezeti hangerő setting.mutemusic.name = Zene némítása setting.sfxvol.name = Hanghatások hangereje setting.mutesound.name = Hang némítása -setting.crashreport.name = Névtelen összeomlási jelentések setting.communityservers.name = Közösségi kiszolgálók listájának lekérdezése setting.savecreate.name = Automatikus mentés setting.steampublichost.name = Nyilvános játék láthatósága @@ -1318,7 +1339,7 @@ setting.hidedisplays.name = Logikai kijelzők elrejtése setting.macnotch.name = A felület igazítása a kijelző bevágásához setting.macnotch.description = A változtatások érvénybe lépéséhez újraindítás szükséges steam.friendsonly = Csak barátok -steam.friendsonly.tooltip = Független attól, hogy csak a Steam-barátok tudnak-e kapcsolódni a játékodhoz.\nHa nem jelölöd be ezt a négyzetet, a játékod nyilvános lesz – bárki kapcsolódhat hozzá. +steam.friendsonly.tooltip = Meghatározza, hogy csak a Steam-barátok kapcsolódhassanak-e a játékodhoz.\nHa kikapcsolod, a játékod nyilvános lesz és bárki kapcsolódhat hozzá. setting.maxmagnificationmultiplierpercent.name = Legkisebb kameratávolság setting.minmagnificationmultiplierpercent.name = Legnagyobb kameratávolság setting.minmagnificationmultiplierpercent.description = A magas értékek teljesítményproblémákat okozhatnak. @@ -1334,6 +1355,8 @@ category.command.name = Egységparancs category.multiplayer.name = Többjátékos category.blocks.name = Blokkválasztás placement.blockselectkeys = \n[lightgray]Kulcs: [{0}, +ping.text = Ping: +keybind.ping.name = Ping helyszíne keybind.respawn.name = Újjáéledés keybind.control.name = Egység irányítása keybind.clear_building.name = Épület törlése @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Egység viselkedése: tüzet szüntess keybind.unit_stance_pursue_target.name = Egység viselkedése: célpont követése keybind.unit_stance_patrol.name = Egység viselkedése: járőrözés keybind.unit_stance_ram.name = Egység viselkedése: ütközés +keybind.unit_stance_boost.name = Egység viselkedése: erősítés +keybind.unit_stance_hold_position.name = Egység viselkedése: helyben maradás keybind.unit_command_move.name = Egységparancs: mozgás keybind.unit_command_repair.name = Egységparancs: javítás keybind.unit_command_rebuild.name = Egységparancs: újjáépítés keybind.unit_command_assist.name = Egységparancs: támogatás keybind.unit_command_mine.name = Egységparancs: bányászás -keybind.unit_command_boost.name = Egységparancs: erősítés keybind.unit_command_load_units.name = Egységparancs: egységek berakodása keybind.unit_command_load_blocks.name = Egységparancs: blokkok berakodása keybind.unit_command_unload_payload.name = Egységparancs: kirakodás @@ -1483,6 +1507,7 @@ rules.checkplacement.info = Ha le van tiltva, akkor ennek a csapatnak az épüle rules.enemyCheat = Végtelen ellenséges csapaterőforrások rules.blockhealthmultiplier = Épületek életpontszorzója rules.blockdamagemultiplier = Épületek sebzésszorzója +rules.unitfactoryactivation = Egységgyár aktiválásának késleltetése rules.unitbuildspeedmultiplier = Egységek gyártási sebességszorzója rules.unitcostmultiplier = Egységek költségszorzója rules.unithealthmultiplier = Egységek életpontszorzója @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Lehetővé teszi a kilövőállások használatát landingpad.legacy.disabled = [scarlet]\ue815 Letiltva[lightgray] (Hagyományos kilövőállás engedélyezve) rules.showspawns = Ellenséges kezdőpontok megjelenítése a minitérképen rules.randomwaveai = Kiszámíthatatlan ellenséges támadások (MI) +rules.pauseDisabled = Szüneteltetés letiltása rules.fire = Tűz rules.anyenv = rules.explosions = Épület/egység robbanási sebzése @@ -2005,8 +2031,8 @@ block.radar.name = Radar block.build-tower.name = Építőtorony block.regen-projector.name = Regeneráló vetítő block.shockwave-tower.name = Sokkhullámtorony -block.shield-projector.name = Pajzsvetítő -block.large-shield-projector.name = Nagy Pajzsvetítő +block.shield-projector.name = Védőréteg-vetítő +block.large-shield-projector.name = Nagy védőréteg-vetítő block.armored-duct.name = Páncélozott szállítócsatorna block.overflow-duct.name = Túlcsorduló szállítócsatorna block.underflow-duct.name = Alulcsorduló szállítócsatorna @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Megerősített rakományelosztó block.payload-mass-driver.name = Rakomány-tömegmozgató block.small-deconstructor.name = Lebontó block.canvas.name = Vászon +block.large-canvas.name = Nagy vászon block.world-processor.name = Világprocesszor block.world-cell.name = Világcella block.tank-fabricator.name = Tankgyártó @@ -2112,15 +2139,14 @@ hint.launch.mobile = Ha elegendő nyersanyagot gyűjtöttél össze, akkor [acce hint.schematicSelect = Tartsd nyomva az [accent][[F][] gombot több épület kijelöléséhez és másolásához.\n\n[accent][[Középső kattintással][] egy adott blokktípus másolható. hint.rebuildSelect = Tartsd nyomva a [accent][[B][] gombot, majd húzással jelöld ki a megsemmisített blokkterveket.\nEz automatikusan újjáépíti őket. hint.rebuildSelect.mobile = Válaszd a :copy: másolás gombot, majd koppints az :wrench: újjáépítés gombra, és húzd a megsemmisült blokktervek kijelöléséhez.\nEz automatikusan újjáépíti őket. -hint.conveyorPathfind = Tartsd nyomva a [accent][[bal ctrl][] gombot a szállítószalagok lerakásakor, hogy a játék útvonalat állítson elő. -hint.conveyorPathfind.mobile = Engedélyezd az :diagonal: [accent]átlós módot[], és tegyél le egyszerre több szállítószalagot, hogy a játék útvonalat állítson elő. +hint.conveyorPathfind = Tartsd nyomva a [accent][[bal ctrl][] gombot a szállítószalagok lerakásakor, hogy a játék nyomvonalat állítson elő. +hint.conveyorPathfind.mobile = Engedélyezd az :diagonal: [accent]átlós módot[], és tegyél le egyszerre több szállítószalagot, hogy a játék nyomvonalat állítson elő. hint.boost = Tartsd nyomva a [accent][[bal shift][] gombot, hogy átrepülj az akadályok felett.\n\nErre csak néhány földi egység képes. hint.payloadPickup = Nyomd meg a [accent][[[] gombot a kis blokkok vagy egységek felemeléséhez. hint.payloadPickup.mobile = [accent]Koppints és tartsd nyomva az ujjad[] egy kis blokk vagy egység felemeléséhez. hint.payloadDrop = Nyomd le a [accent]][] gombot a rakomány lerakásához. hint.payloadDrop.mobile = [accent]Koppints és tartsd nyomva az ujjad[] egy üres területen a rakomány lerakásához. hint.waveFire = A vizet lőszerként használó [accent]Wave[] lövegtornyok automatikusan eloltják a közeli tüzeket. -hint.generator = Az :combustion-generator: [accent]égetőerőmű[] szenet éget, és áramot ad át a vele érintkező épületeknek.\n\nAz áramszállítás távolsága további \uf87f [accent]villanyoszlopokkal[] növelhető. hint.guardian = Az [accent]őrzők[] páncélozottak. A gyenge lövedékek, mint a [accent]réz[] vagy az [accent]ólom[] [scarlet]nem hatásosak[] az Őrző páncéljával szemben.\n\nHasználj magasabb szintű lövegtornyokat, vagy juttass :graphite: [accent]grafitot[] a :duo: Duo / \uf859 Salvo lövegtornyokba, hogy leszedd az őrzőket. hint.coreUpgrade = A támaszpont úgy fejleszthető, hogy [accent]magasabb szintű támaszpontot teszel rá[].\n\nHelyezz egy :core-foundation: [accent]alapítvány[] támaszpontot a \uf869 [accent]szilánk[] támaszpontra. Figyelj rá, hogy ne legyenek az új támaszpont területén épületek. hint.serpuloCoreZone = A :core-zone: [accent]támaszpontzónákra[] további :core-shard: [accent]szilánk[] támaszpontok is építhetők. @@ -2152,6 +2178,16 @@ gz.zone2 = Bármi, ami a hatósugarában épült, elpusztul, amikor egy hullám gz.zone3 = Egy hullám most kezdődik.\nKészülj fel. gz.finish = Építs több lövegtornyot, bányássz több nyersanyagot,\nés védekezz az ellenséges hullámok ellen, hogy [accent]elfoglald a szektort[]. +ff.coal = Használj :mechanical-drill: [accent]mechanikus fúrókat[] a :ore-coal: [accent]szén[] bányászásához. +ff.graphitepress = :tree: Fejleszd ki és helyezz el egy :graphite-press: [accent]grafitprést[]. +ff.craft = Juttass :coal: szenet a :graphite-press: [accent]grafitprésbe[].\nAz :graphite: grafitot fog termelni és kirakja a közeli szállítószalagokra.\nSzállítsd a :graphite-press: [accent]grafitprésből[] kijövő :graphite: grafitot a támaszpontba. +ff.generator = A :coal: szén üzemanyagként is használható az :combustion-generator: [accent]égető erőművekben[].\nFejleszd ki és helyezz el egy :combustion-generator: [accent]égető erőművet[]. +ff.coalpower = Juttass :coal: szenet az égető erőműbe az [accent]:power: áram[] termeléséhez. +ff.coalpower.objective = :combustion-generator: Áramtermelés +ff.node = A :power-node: [accent]villanyoszlopok[] továbbítják az áramot a hatókörükön belüli blokkoknak.\nFejleszd ki és helyezz el egy :power-node: [accent]villanyoszlopot[] a generátor közelében. +ff.battery = Az :battery: [accent]akkumulátorok[] tárolják az áramot.\nFejleszd ki és helyezz el egy :battery: [accent]akkumulátort[] a villanyoszlop közelében. +ff.arc = Az :arc: [accent]Arc lövegtornyoknak[] áramra van szükségük a működéshez. Fejleszd ki és helyezz el egy :arc: [accent]Arc lövegtornyot[] egy villanyoszlop közelében. + fungalpass.tutorial1 = Használj [accent]egységeket[] az épületek védelmére és az ellenség megtámadására.\nFejleszd ki és helyezz el egy :ground-factory: [accent]földiegységgyárat[]. fungalpass.tutorial2 = Válaszd ki a :dagger: [accent]Dagger[] egységeket a gyárban.\nGyárts 3 db egységet. @@ -2174,7 +2210,7 @@ atolls.carry1 = A földi egységek szállításához :mega:[accent]Mega[] egysé atolls.carry2 = 1: Utasítsd a Mega egységeket, hogy [accent]repüljenek[] a földi egységek fölé. atolls.carry3 = 2: Válaszd ki az \ue87b [accent]egységek felvétele[] parancsot a földi egységek felvételéhez. atolls.carry4 = 3: Irányítsd és mozgasd az [accent]egységekkel megrakott[] Mega szállítókat. -atolls.carry5 = 4: Válaszd ki a \ue879 [accent]kirakodás a raktérből[] parancsot, hogy a Megák kirakodják a földi egységeket. +atolls.carry5 = 4: Válaszd ki a \ue879 [accent]kirakodás a raktérből[] parancsot, hogy a Mega egységek kirakodják a földi egységeket. atolls.carry6 = Ezeket a lépéseket [accent]itt[] tekintheted át újra. atolls.carry7 = Kövesd ezeket az utasításokat, hogy további egységeket rakodhass ki az ellenséges bázis közelében. atolls.noairunit = Ez a bázis túlságosan jól meg van erősítve ahhoz, hogy légi egységekkel elpusztítsd. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Javítja a közelében lévő összes egys block.radar.description = Fokozatosan feltárja a terepet és az ellenséges egységeket egy nagy sugarú körben. Áramot fogyaszt. block.shockwave-tower.description = Sérülést okoz és megsemmisíti az ellenséges lövedékeket egy körön belül. Diciánt igényel. block.canvas.description = Egy egyszerű képet jelenít meg egy előre meghatározott palettával. Szerkeszthető. +block.large-canvas.description = Egy egyszerű képet jelenít meg egy előre meghatározott palettával. Szerkeszthető. unit.dagger.description = Szokásos lövedékeket lő a közeli ellenségekre. unit.mace.description = Lángnyelveket küld a közeli ellenségek felé. @@ -2663,13 +2700,13 @@ lenum.type = Az épület/egység típusa.\nPéldául bármilyen elosztó esetén lenum.shoot = Lövés egy adott pontra. lenum.shootp = Lövés egy egységre/épületre sebesség-előrejelzéssel. lenum.config = Épületkonfiguráció, például: nyersanyag-válogató. -lenum.enabled = Független attól, hogy engedélyezve van-e a blokk. +lenum.enabled = Meghatározza, hogy a blokk engedélyezve van-e. laccess.currentammotype = Egy lövegtorony jelenlegi nyersanyag- vagy folyadéklőszere. laccess.memorycapacity = Cellák száma egy memóriablokkban. laccess.color = Megvilágítás színe. laccess.controller = Egységvezérlő. Ha processzor vezérli, akkor a processzort adja vissza.\nMáskülönben magát az egységet adja vissza. -laccess.dead = Független attól, hogy egy épület vagy egység megsemmisült-e, vagy érvénytelen-e. +laccess.dead = Meghatározza, hogy egy egység/épület megsemmisült-e, vagy érvénytelen-e. laccess.controlled = Ezt adja vissza:\n[accent]@ctrlProcessor[], ha az egységvezérlő egy processzor\n[accent]@ctrlPlayer[], ha az egység/épület vezérlője a játékos\n[accent]@ctrlFormation[], ha az egység formációban van\nMáskülönben 0. laccess.progress = Művelet előrehaladása, 0 és 1 között.\nA termelés, a lövegtorony-újratöltés vagy az építés előrehaladását adja vissza. laccess.speed = Az egység legnagyobb sebessége, mező/mp-ben. @@ -2789,10 +2826,10 @@ unitradar.output = Változó, amelybe a kimeneti egységet írja. control.of = Irányítandó épület. control.unit = Megcélozandó egység vagy épület. -control.shoot = Független a lövéstől. +control.shoot = Meghatározza, hogy lőjön-e. -unitlocate.enemy = Független attól, hogy az ellenséges épületek fel vannak-e derítve. -unitlocate.found = Független attól, hogy az objektum meg van-e találva. +unitlocate.enemy = Meghatározza, hogy az ellenséges épületek fel vannak-e derítve. +unitlocate.found = Meghatározza, hogy az objektum meg van-e találva. unitlocate.building = Kimeneti változó a megtalált épülethez. unitlocate.outx = Kimenet X-koordinátája. unitlocate.outy = Kimenet Y-koordinátája. @@ -2824,22 +2861,22 @@ lenum.boost = Erősítés indítása/leállítása. lenum.flushtext = Az írási puffer tartalmának ürítése a jelölőre, ha alkalmazható.\nHa a „fetch” igaz, akkor megpróbálja lekérni a tulajdonságokat a pálya nyelvi csomagjából vagy a játék csomagjából. lenum.texture = A textúra neve közvetlenül a játék textúraatlaszából (úgynevezett „kebab-case” elnevezési stílus használatával).\nHa a „printFlush” igaz, akkor a szöveges puffer tartalmát használja szöveges argumentumként. lenum.texturesize = A textúra mérete mezőben. A nulla érték a jelölő szélességét az eredeti textúra méretére skálázza. -lenum.autoscale = Független attól, hogy skálázva van-e a jelölő a játékos nagyítási szintjének megfelelően. +lenum.autoscale = Meghatározza, hogy a jelölő a játékos nagyítási szintjéhez igazodik-e. lenum.posi = Indexelt pozíció, vonal- és négyszögjelzőkhöz használatos, ahol a nulla az első pozíció. lenum.uvi = A textúra pozíciója nullától egyig, négyzetjelölőkhöz használatos. lenum.colori = Indexelt szín, vonal- és négyzetjelölőkhöz használatos, ahol a nulla az első szín. -lenum.wavetimer = Független attól, hogy a hullámok automatikusan indulnak-e az időzítésre. Ha nem, akkor a hullámok a lejátszásgomb megnyomásakor indulnak. +lenum.wavetimer = Meghatározza, hogy a hullámok automatikusan indulnak-e az időzítő alapján. Ha nem, akkor a hullámok a lejátszásgomb megnyomásakor indulnak. lenum.wave = Jelenlegi hullámszám. Bármi lehet a nem-hullámalapú játékmódokban. lenum.currentwavetime = Hullám-visszaszámlálás tickben. -lenum.waves = Független attól, hogy a hullámok egyáltalán elindíthatók-e. -lenum.wavesending = Független attól, hogy a hullámok kézzel elindíthatók-e a lejátszásgombbal. +lenum.waves = Meghatározza, hogy érkezhetnek-e egyáltalán hullámok. +lenum.wavesending = Meghatározza, hogy a hullámok kézzel indíthatók-e a lejátszásgombbal. lenum.attackmode = Meghatározza, hogy a játékmód támadómódban van-e. lenum.wavespacing = A hullámok közötti idő tickben. lenum.enemycorebuildradius = Építési tilalmi zóna az ellenséges támaszpont körül. lenum.dropzoneradius = Az ellenséges hullámok ledobási zónájának sugara. lenum.unitcap = Alap egységdarabszám. Épületekkel tovább növelhető. -lenum.lighting = Független attól, hogy a háttérfény engedélyezve van-e. +lenum.lighting = Meghatározza, hogy a háttérfény engedélyezve van-e. lenum.buildspeed = Az építési sebesség szorzója. lenum.unithealth = Mennyi életponttal indulnak az egységek. lenum.unitbuildspeed = Milyen gyorsan gyártanak egységeket az egységgyárak. diff --git a/core/assets/bundles/bundle_id_ID.properties b/core/assets/bundles/bundle_id_ID.properties index baccc24283..11e14dc6fc 100644 --- a/core/assets/bundles/bundle_id_ID.properties +++ b/core/assets/bundles/bundle_id_ID.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki Mindustry resmi link.suggestions.description = Saran fitur baru link.bug.description = Menemukan bug? Laporkan di sini linkopen = Server ini mengirimkan Anda sebuah tautan. Apakah Anda yakin ingin membukanya?\n\n[sky]{0} +clipboardcopy = Server ini ingin menyalin teks ke papan klip Anda. Apakah Anda yakin ingin melanjutkan?\n\n[sky]{0} linkfail = Gagal membuka tautan!\nURL disalin ke papan klip. screenshot = Tangkapan layar tersimpan di {0} screenshot.invalid = Peta terlalu besar, tidak cukup memori untuk menangkap layar. @@ -124,6 +125,8 @@ maps.none = [lightgray]Peta tidak ditemukan! invalid = Tidak Valid pickcolor = Pilih Warna color = Warna +import = Impor +export = Ekspor preparingconfig = Menyiapkan Konfigurasi preparingcontent = Menyiapkan Konten uploadingcontent = Mengunggah Konten @@ -211,7 +214,9 @@ campaign.select = Pilih untuk Memulai Kampanye campaign.none = [lightgray]Pilih planet untuk memulai.\nPilihan ini dapat diubah setiap saat. campaign.erekir = Konten baru yang disempurnakan. Kemajuan kampanye lebih linier.\n\nKualitas peta yang tinggi dan pengalaman lebih mantap. campaign.serpulo = Konten lawas; pengalaman klasik. Lebih terbuka dan banyak konten.\n\nPeta dan mekanisme kampanye yang berpotensi tidak seimbang. Kurang halus -campaign.difficulty = Kesulitan +campaign.difficulty = Tingkat Kesulitan +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Terselesaikan techtree = Pohon Teknologi techtree.select = Pemilihan Pohon Teknologi @@ -246,7 +251,7 @@ server.kicked.gameover = Permainan telah berakhir! server.kicked.serverRestarting = Server sedang dimulai ulang. server.versions = Versi Anda:[accent] {0}[]\nVersi server:[accent] {1}[] host.info = Tombol [accent]host[] akan membuat server sementara di port [scarlet]6567[].\nSemua orang di dalam [lightgray]Wi-Fi atau jaringan lokal[] yang sama dapat melihat server Anda di daftar server mereka.\n\nJika Anda ingin pemain dari mana saja memasuki server Anda dengan IP, [accent]port forwarding[] sangat diperlukan.\n\n[lightgray]Catatan: Jika seseorang mengalami masalah memasuki permainan lokal Anda, pastikan Mindustry memiliki akses ke jaringan lokal di pengaturan firewall Anda. Perlu diingat jaringan publik terkadang tidak mengizinkan pencarian server. -join.info = Di sini, Anda bisa memasukkan [accent]IP server[] untuk dihubungkan, serta mencari [accent]jaringan lokal[] atau server [accent]global[] untuk dihubungkan.\nLAN dan WAN mendukung multipemain.\n\n[lightgray]Jika Anda ingin bergabung dengan seseorang melalui IP, Anda perlu menanyakan host tentang IP mereka, yang dapat dicari dengan meng-google "my ip" melalui perangkat mereka. +join.info = Di sini, Anda bisa memasukkan [accent]IP server[] untuk terhubung, serta mencari [accent]jaringan lokal[] atau server [accent]global[] untuk terhubung.\nLAN dan WAN mendukung multipemain.\n\n[lightgray]Jika Anda ingin bergabung dengan seseorang melalui IP, Anda perlu menanyakan host tentang IP mereka, yang dapat dicari dengan meng-google "my ip" melalui perangkat mereka. hostserver = Host Permainan Multi Pemain invitefriends = Undang Teman hostserver.mobile = Host\nPermainan @@ -310,12 +315,12 @@ votekick.reason.message = Anda yakin ingin memulai pemungutan suara untuk mengel joingame.title = Gabung Permainan joingame.ip = Alamat: disconnect = Terputus. -disconnect.error = Sambungan bermasalah. -disconnect.closed = Sambungan ditutup. +disconnect.error = Koneksi bermasalah. +disconnect.closed = Koneksi ditutup. disconnect.timeout = Waktu koneksi telah habis. disconnect.data = Gagal memuat data dunia! disconnect.snapshottimeout = Waktu koneksi habis selama menerima snapshot UDP.\nIni mungkin disebabkan oleh jaringan atau koneksi yang tidak stabil. -cantconnect = Gagal tersambung ke permainan ([accent]{0}[]). +cantconnect = Gagal bergabung ke permainan ([accent]{0}[]). connecting = [accent]Menghubungkan... reconnecting = [accent]Menghubungkan kembali... connecting.data = [accent]Memuat data dunia... @@ -359,6 +364,7 @@ confirm = Konfirmasi delete = Hapus view.workshop = Lihat di Workshop workshop.listing = Sunting Daftar Workshop +hide = Sembunyikan ok = OK open = Buka customize = Sunting Peraturan @@ -370,8 +376,7 @@ command.repair = Perbaiki command.rebuild = Bangun Kembali command.assist = Bantu Pemain command.move = Maju -command.boost = Pendorongan -command.enterPayload = Masukkan Muatan Blok +command.enterPayload = Masuk ke Blok Muatan command.loadUnits = Muat Unit command.loadBlocks = Muat Blok command.unloadPayload = Turunkan Muatan @@ -381,7 +386,9 @@ stance.shoot = Posisi Unit: Menembak stance.holdfire = Posisi Unit: Gencatan Senjata stance.pursuetarget = Posisi Unit: Kejar Target stance.patrol = Posisi Unit: Patroli Jalur +stance.holdposition = Posisi Unit: Tahan Posisi stance.ram = Posisi Unit: Seruduk\n[lightgray]Pergerakan lurus, tanpa pathfinding +stance.boost = Pendorongan stance.mineauto = Menambang Otomatis stance.mine = Tambang Sumber Daya: {0} openlink = Buka Tautan @@ -426,8 +433,9 @@ wave.guardianwarn.one = Penjaga akan tiba dalam [accent]{0}[] gelombang. loadimage = Memuat Gambar saveimage = Simpan Gambar unknown = Tidak diketahui -custom = Modifikasi +custom = Kustom builtin = Bawaan +modded = Mod map.delete.confirm = Anda yakin ingin menghapus peta ini? Tindakan ini tidak bisa dibatalkan! map.random = [accent]Peta Acak map.nospawn = Peta ini tidak memiliki inti agar pemain bisa muncul! Tambahkan inti [#{0}]{1}[] ke dalam peta di penyunting. @@ -442,7 +450,7 @@ workshop.info = Informasi Konten changelog = Catatan Pembaruan (opsional): updatedesc = Timpa Judul & Deskripsi eula = EULA Steam -missing = Konten ini telah dihapus atau dipindah.\n[lightgray]Daftar Workshop sekarang telah tidak terhubung secara otomatis. +missing = Konten ini telah dihapus atau dipindah.\n[lightgray]Daftar Workshop sekarang telah diputus secara otomatis. publishing = [accent]Menerbitkan... publish.confirm = Apakah Anda yakin untuk menerbitkan ini?\n\n[lightgray]Pastikan Anda setuju dengan EULA Workshop terlebih dahulu, atau konten Anda tidak akan muncul! publish.error = Terjadi kesalahan saat menerbitkan konten: {0} @@ -488,10 +496,14 @@ editor.center = Pusat editor.search = Cari peta... editor.filters = Filter Peta editor.filters.mode = Mode Permainan: +editor.filters.priorities = Prioritas: editor.filters.type = Tipe Peta: editor.filters.search = Cari Dalam: editor.filters.author = Pencipta editor.filters.description = Deskripsi +editor.filters.modname = Nama Mod +editor.filters.prioritizemod = Prioritas Mod +editor.filters.prioritizecustom = Prioritas Kustom editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Cari gelombang... waves.filter = Filter Unit waves.units.hide = Sembunyikan Semua waves.units.show = Tampilkan Semua +pause.disabled = [scarlet]Jeda dinonaktifkan #these are intentionally in lower case wavemode.counts = jumlah @@ -748,7 +761,8 @@ objective.buildunit = [accent]Produksi Unit: [][lightgray]{0}[]x\n{1}[lightgray] objective.destroyunits = [accent]Hancurkan: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Musuh akan datang dalam [lightgray]{0}[] objective.enemyescelating = [accent]Produksi musuh meningkat dalam [lightgray]{0}[] -objective.enemyairunits = [accent]Produksi pasukan udara musuh dimulai dalam [lightgray]{0}[] +objective.enemyairunits = [accent]Produksi unit udara musuh dimulai dalam [lightgray]{0}[] +objective.enemyunitproduction = [accent]Produksi unit musuh dimulai dalam [lightgray]{0}[] objective.destroycore = [accent]Hancurkan Inti Musuh objective.command = [accent]Perintahkan Unit objective.nuclearlaunch = [accent]⚠ Terdeteksi peluncuran nuklir: [lightgray]{0} @@ -776,7 +790,7 @@ add = Tambahkan... guardian = Penjaga connectfail = [scarlet]Gagal menyambung ke server:\n\n[accent]{0} -error.unreachable = Server tidak dapat dihubungi.\nApakah alamatnya benar? +error.unreachable = Server tidak dapat dijangkau.\nApakah alamatnya benar? error.invalidaddress = Alamat tidak valid. error.timedout = Kehabisan waktu!\nPastikan host mengaktifkan port forwarding, dan alamatnya benar! error.mismatch = Paket bermasalah:\nkemungkinan versi client/server berbeda.\nPastikan Anda dan host mempunyai versi terbaru Mindustry! @@ -824,7 +838,7 @@ sectors.go = Mulai sector.abandon = Tinggalkan sector.abandon.confirm = Inti di sektor ini akan meledak secara sendirinya.\nLanjutkan? sector.curcapture = Sektor Dikuasai -sector.lockdown = [red]:peringatan:[accent] Sektor saat ini sedang diserang\n[lightgray]produksi, penelitian, ekspor dan impor dihentikan +sector.lockdown = [red]:warning:[accent] Sektor saat ini sedang diserang\n[lightgray]produksi, penelitian, ekspor dan impor dihentikan sector.curlost = Sektor Gagal Bertahan sector.missingresources = [scarlet]Sumber Daya Inti Tidak Cukup sector.attacked = Sektor [accent]{0}[white] sedang diserang! @@ -835,7 +849,8 @@ sector.changeicon = Ubah Ikon sector.noswitch.title = Tidak Dapat Berpindah Sektor sector.noswitch = Anda tidak boleh berpindah ke sektor lain jika salah satu sektor Anda sedang di serang.\nSektor: [accent]{0}[] di [accent]{1}[] sector.view = Lihat Sektor -sector.foundationrequired = Memerlukan[lightgray] Inti: Foundation +sector.foundationrequired = Memerlukan[lightgray] Inti: Foundation []disekitar +sector.shielded = [lightgray] Shielded threat.low = Rendah threat.medium = Sedang @@ -843,6 +858,10 @@ threat.high = Tinggi threat.extreme = Berbahaya threat.eradication = Pemusnahan +difficulty.guide.title = Pemberitahuan +difficulty.guide = Jika sebuah sektor terlalu menantang, tingkat kesulitan kampanye dapat disesuaikan untuk pengalaman bermain yang lebih mudah. +difficulty.guide.confirm = Sesuaikan Tingkat Kesulitan + difficulty.casual = Kasual difficulty.easy = Mudah difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Matahari sector.impact0078.name = Benturan 0078 sector.groundZero.name = Titik Awal -sector.craters.name = Kawah +sector.crateredBattleground.name = Medan Perang Kawah sector.frozenForest.name = Hutan Beku sector.ruinousShores.name = Runtuhan Pesisir sector.stainedMountains.name = Gunung Bernoda @@ -890,13 +909,14 @@ sector.fallenVessel.name = Bangkai Kapal sector.mycelialBastion.name = Benteng Pertahanan Miselium sector.frontier.name = Perbatasan sector.sunkenPier.name = Dermaga Karam +sector.littoralShipyard.name = Galangan Kapal Pesisir sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Benteng Geotermal sector.groundZero.description = Lokasi yang optimal untuk bermain satu kali lagi. Sangat sedikit musuh. Sedikit sumber daya.\nKumpulkan timah dan tembaga sebanyak yang Anda bisa.\nMulai dari sini. sector.frozenForest.description = Di sini, dekat dengan gunung, spora sudah menyebar. Suhu dingin tidak dapat menahannya.\n\nMulailah hasilkan listrik. Bangun generator pembakar. Pelajari cara menggunakan mender. sector.saltFlats.description = Di pinggiran padang pasir terdapat Daratan Garam. Beberapa sumber daya dapat ditemukan di sini.\n\nMusuh telah mendirikan penyimpanan sumber daya kompleks di sini. Hancurkan inti mereka. Jangan biarkan satupun tersisa. -sector.craters.description = Air banyak terkumpul di kawah ini, sebuah peninggalan dari perang masa lalu. Klaim area ini lagi. Kumpulkan pasir. Lebur metaglass. Pompa air untuk mendinginkan turret dan bor. +sector.crateredBattleground.description = Air banyak terkumpul di kawah ini, sebuah peninggalan dari perang masa lalu. Klaim area ini lagi. Kumpulkan pasir. Lebur metaglass. Pompa air untuk mendinginkan turret dan bor. sector.ruinousShores.description = Keluar dari lembah gunung, terdapat garis pantai. Sebelumnya, area ini adalah garis pertahanan pantai. Sekarang tidak banyak yang tersisa. Hanya pertahanan dasar yang tersisa, yang lain telah hancur berkeping keping.\nBangun kembali pertahanan di sini. Pelajari lebih banyak teknologi. sector.stainedMountains.description = Area ini terletak di dekat pegunungan, namun belum tersentuh oleh spora.\nTambang titanium yang ada di area ini. Pelajari fungsinya.\n\nMusuh jauh lebih kuat di sini. Jangan biarkan mereka meluncurkan unit yang lebih kuat. sector.overgrowth.description = Area ini banyak ditumbuhi spora, karena dekat dengan sumber spora.\nMusuh telah membangun pangkalan di sini. Produksi unit Mace. Hancurkan mereka. Klaim apapun yang tersisa. @@ -1030,7 +1050,7 @@ stat.itemcapacity = Kapasitas Item stat.memorycapacity = Kapasitas Memori stat.basepowergeneration = Produksi Tenaga Dasar stat.productiontime = Waktu Produksi -stat.warmuptime = Warmup Time +stat.warmuptime = Waktu Pemanasan stat.repairtime = Waktu Penuh Perbaikan Blok stat.repairspeed = Kecepatan Perbaikan stat.weapons = Senjata @@ -1045,6 +1065,7 @@ stat.boosteffect = Efek Pendorong stat.maxunits = Batas Unit Aktif stat.health = Nyawa stat.armor = Pelindung +stat.armor.info = Damage yang diberikan = damage yang diterima - armor.\nPengurangan damage maksimum hingga 90%. stat.buildtime = Waktu Pembangunan stat.maxconsecutive = Batas Konsekutif stat.buildcost = Biaya Bangunan @@ -1073,7 +1094,7 @@ stat.minetier = Tingkat Tambang stat.payloadcapacity = Kapasitas Muatan stat.abilities = Kemampuan stat.canboost = Memiliki Pendorong -stat.boostingspeed = Boosting Speed +stat.boostingspeed = Kecepatan Pendorong stat.flying = Terbang stat.ammouse = Penggunaan Amunisi stat.ammocapacity = Kapasitas Amunisi @@ -1138,7 +1159,7 @@ bar.drilltierreq = Memerlukan Bor yang Lebih Baik bar.nobatterypower = Tenaga Baterai Tidak Mencukupi bar.noresources = Sumber Daya Tidak Cukup bar.corereq = Memerlukan Inti Markas -bar.corefloor = Ubin Zona Inti Dibutuhkan +bar.corefloor = Ubin Zona Inti Diperlukan bar.cargounitcap = Kapasitas Unit Kargo Telah Mencapai Batas bar.drillspeed = Kecepatan Bor: {0}/d bar.pumpspeed = Kecepatan Pompa: {0}/d @@ -1172,35 +1193,35 @@ bar.activated = Aktif units.processorcontrol = [lightgray]Dikendalikan Prosesor -weapon.pointdefense = [stat]Point Defense +weapon.pointdefense = [stat]Titik Pertahanan bullet.damage = [stat]{0}[lightgray] damage bullet.splashdamage = [stat]{0}[lightgray] damage percikan~[stat] {1}[lightgray] ubin bullet.incendiary = [stat]membakar bullet.homing = [stat]mengejar bullet.armorpierce = [stat]menembus pelindung -bullet.armorweakness = [red]{0}%[lightgray] melemahkan pelindung -bullet.armorpiercing = [stat]{0}%[lightgray] menembus pelindung +bullet.armorweakness = [red]{0}x[lightgray] melemahkan pelindung +bullet.partialarmorpierce = [stat]{0}%[lightgray] pelindung tertembus bullet.antiarmor = [stat]{0}x[lightgray] anti-pelindung bullet.maxdamagefraction = [stat]{0}%[lightgray] batas damage bullet.suppression = [stat]{0}[lightgray] detik penahan perbaikan ~ [stat]{1}[lightgray] ubin -bullet.empradius = [stat]{0}[lightgray] tiles EMP radius -bullet.empboost = [stat]{0}%[lightgray] overdrive ~ [stat]{1}[lightgray] -bullet.empdamage = [stat]{0}%[lightgray] power damage -bullet.empslowdown = [stat]{0}%[lightgray] enemy power overdrive ~ [stat]{1}[lightgray] -bullet.empunitdamage = [stat]{0}%[lightgray] unit damage +bullet.empradius = [stat]{0}[lightgray] ubin radius EMP +bullet.empboost = [stat]{0}%[lightgray] dipercepat ~ [stat]{1}[lightgray] +bullet.empdamage = [stat]{0}%[lightgray] damage tenaga +bullet.empslowdown = [stat]{0}%[lightgray] tenaga musuh dipercepat ~ [stat]{1}[lightgray] +bullet.empunitdamage = [stat]{0}%[lightgray] damage unit bullet.interval = [stat]{0}/detik[lightgray] jarak antar peluru: bullet.frags = [stat]{0}[lightgray]x pecahan: bullet.lightning = [stat]{0}[lightgray]x petir ~ [stat]{1}[lightgray] damage -bullet.lightninginterval = [stat]{0}[lightgray] tiles interval ~ [stat]{1}[lightgray] tiles length +bullet.lightninginterval = [stat]{0}[lightgray] jarak antar ubin ~ [stat]{1}[lightgray] panjang ubin bullet.buildingdamage = [stat]{0}%[lightgray] damage bangunan -bullet.spawnBullets = [stat]{0}x[lightgray] spawned bullets: +bullet.spawnBullets = [stat]{0}x[lightgray] peluru yang dihasilkan: bullet.shielddamage = [stat]{0}%[lightgray] damage perisai bullet.knockback = [stat]{0}[lightgray] terdorong bullet.pierce = [stat]{0}[lightgray]x tembus bullet.infinitepierce = [stat]tembus bullet.healpercent = [stat]{0}[lightgray]% menyembuhkan -bullet.healamount = [stat]{0}[lightgray] perbaikan langsung +bullet.healamount = [stat]{0}[lightgray] nyawa perbaikan langsung bullet.multiplier = [stat]{0}[lightgray]x penggandaan amunisi bullet.reload = [stat]{0}[lightgray]x laju tembakan bullet.range = [stat]{0}[lightgray] jarak ubin @@ -1215,7 +1236,7 @@ unit.liquidsecond = unit zat cair/detik unit.itemssecond = item/detik unit.liquidunits = unit zat cair unit.powerunits = unit tenaga -unit.powerequilibrium = power equilibrium +unit.powerequilibrium = keseimbangan tenaga unit.heatunits = unit panas unit.degrees = derajat unit.seconds = detik @@ -1233,7 +1254,7 @@ unit.billions = m unit.shots = tembakan unit.pershot = /tembakan unit.perleg = per kaki -unit.perside = per side +unit.perside = per sisi category.purpose = Kegunaan category.general = Umum category.power = Tenaga @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Nonaktifkan Mod Ketika Ada Masalah Saat Memulai G setting.animatedwater.name = Animasi Perairan setting.animatedshields.name = Animasi Perisai setting.playerindicators.name = Indikasi Pemain +setting.showpings.name = Tampilkan Ping +setting.showotherbuildplans.name = Tampilkan Rencana Pembangunan Pemain Lain setting.indicators.name = Indikasi Musuh setting.autotarget.name = Bidik Musuh Secara Otomatis setting.keyboard.name = Kontrol Tetikus+Papan Ketik @@ -1269,6 +1292,8 @@ setting.fpscap.none = Tidak Ada setting.fpscap.text = {0} FPS setting.uiscale.name = Skala UI setting.uiscale.description = Mulai ulang diperlukan untuk menerapkan perubahan. +setting.uiEdgePadding.name = Pengisi Tepi UI +setting.uiEdgePadding.description = Menambahkan ruang pada tepi UI. Berguna untuk layar dengan sudut membulat atau lekukan. setting.swapdiagonal.name = Penaruhan Selalu Diagonal setting.screenshake.name = Layar Getar setting.bloomintensity.name = Intensitas Bloom @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Jarak Menyimpan setting.seconds = {0} detik setting.milliseconds = {0} milidetik setting.fullscreen.name = Layar Penuh -setting.borderlesswindow.name = Jendela tak Berbatas -setting.borderlesswindow.name.windows = Layar Penuh tak Berbatas -setting.borderlesswindow.description = Mulai ulang mungkin diperlukan untuk menerapkan perubahan. setting.fps.name = Tampilkan FPS & Ping setting.console.name = Hidupkan Konsol setting.smoothcamera.name = Kamera Halus @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volume Sekeliling setting.mutemusic.name = Bisukan Musik setting.sfxvol.name = Volume Suara Efek setting.mutesound.name = Bisukan Suara -setting.crashreport.name = Laporkan Masalah Secara Anonim setting.communityservers.name = Ambil Daftar Server Komunitas setting.savecreate.name = Otomatis Menyimpan setting.steampublichost.name = Visibilitas Game Publik @@ -1334,6 +1355,8 @@ category.command.name = Perintah Unit category.multiplayer.name = Bermain Bersama category.blocks.name = Pilih Blok placement.blockselectkeys = \n[lightgray]Tombol: [{0}, +ping.text = Ping: +keybind.ping.name = Lokasi Ping keybind.respawn.name = Muncul Kembali keybind.control.name = Kendalikan Unit keybind.clear_building.name = Hapus Bangunan @@ -1352,18 +1375,19 @@ keybind.command_queue.name = Antrian Perintah Unit keybind.create_control_group.name = Buat Grup Kendali keybind.cancel_orders.name = Batalkan Perintah -keybind.unit_stance_shoot.name = Posisi Unit: Tembak +keybind.unit_stance_shoot.name = Posisi Unit: Tembak keybind.unit_stance_hold_fire.name = Posisi Unit: Tahan Tembakan keybind.unit_stance_pursue_target.name = Posisi Unit: Mengejar Target keybind.unit_stance_patrol.name = Posisi Unit: Patroli keybind.unit_stance_ram.name = Posisi Unit: Tabrak +keybind.unit_stance_boost.name = Posisi Unit: Pendorongan +keybind.unit_stance_hold_position.name = Posisi Unit: Tahan Posisi keybind.unit_command_move.name = Perintah Unit: Bergerak keybind.unit_command_repair.name = Perintah Unit: Perbaiki keybind.unit_command_rebuild.name = Perintah Unit: Bangun Kembali keybind.unit_command_assist.name = Perintah Unit: Ikuti Player keybind.unit_command_mine.name = Perintah Unit: Menambang -keybind.unit_command_boost.name = Perintah Unit: Mendorong keybind.unit_command_load_units.name = Perintah Unit: Muat Unit keybind.unit_command_load_blocks.name = Perintah Unit: Muat Blok keybind.unit_command_unload_payload.name = Perintah Unit: Bongkar Muatan @@ -1483,6 +1507,7 @@ rules.checkplacement.info = Saat dinonaktifkan, bangunan tim ini akan diabaikan rules.enemyCheat = Sumber Daya Musuh Tak Terbatas rules.blockhealthmultiplier = Penggandaan Nyawa Blok rules.blockdamagemultiplier = Penggandaan Damage Blok +rules.unitfactoryactivation = Penundaan Aktivasi Pabrik Unit rules.unitbuildspeedmultiplier = Penggandaan Kecepatan Produksi Unit rules.unitcostmultiplier = Penggandaan Bahan Produksi Unit rules.unithealthmultiplier = Penggandaan Nyawa Unit @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Mengizinkan penggunaan alas peluncur tanpa alas pe landingpad.legacy.disabled = [scarlet]\ue815 Nonaktifkan[lightgray] (Alas Peluncur Warisan diaktifkan) rules.showspawns = Tampilkan Zona Pendaratan Musuh rules.randomwaveai = Gelombang AI yang Tak Terduga +rules.pauseDisabled = Nonaktifkan Jeda rules.fire = Api rules.anyenv = rules.explosions = Damage Ledakan Blok/Unit @@ -1553,7 +1579,7 @@ database-tag.distribution = Distribusi database-tag.liquid = Perairan database-tag.power = Kelistrikan database-tag.defense = Pertahanan -database-tag.crafting = Kerajinan +database-tag.crafting = Pabrik Kerajinan database-tag.units = Pabrik Unit database-tag.effect = Utilitas database-tag.logic = Logika @@ -2005,8 +2031,8 @@ block.radar.name = Radar block.build-tower.name = Menara Pembangun block.regen-projector.name = Proyektor Penyembuhan block.shockwave-tower.name = Menara Gelombang Kejut -block.shield-projector.name = Proyektor Perisai -block.large-shield-projector.name = Proyektor Perisai Besar +block.shield-projector.name = Proyektor Penghalang +block.large-shield-projector.name = Proyektor Penghalang Besar block.armored-duct.name = Pipa Berlapis Tungsten block.overflow-duct.name = Pipa Luapan block.underflow-duct.name = Pipa Luapan Terbalik @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Pengarah Muatan yang Diperkuat block.payload-mass-driver.name = Penembak Muatan Massal block.small-deconstructor.name = Dekonstruktor block.canvas.name = Kanvas +block.large-canvas.name = Kanvas Besar block.world-processor.name = Prosessor Dunia block.world-cell.name = Sel Dunia block.tank-fabricator.name = Pabrikator Tank @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Ketuk dan tahan[] untuk mengambil blok kecil hint.payloadDrop = Tekan [accent]][] untuk menurunkan muatan. hint.payloadDrop.mobile = [accent]Tekan dan tahan[] di lokasi yang kosong untuk menurunkan muatan. hint.waveFire = Menara [accent]Wave[] yang terisi dengan air akan memadamkan api dalam jangkauannya. -hint.generator = :combustion-generator: [accent]Generator Pembakar[] membakar batu bara dan menghasilkan energi ke blok yang berdekatan.\n\nTransmisi energi dapat diperluas dengan :power-node: [accent]Simpul Daya[]. hint.guardian = Unit [accent]Penjaga[] adalah unit yang diperkuat. Amunisi lemah seperti [accent]Tembaga[] dan [accent]Timah[] [scarlet]tidak efektif[].\n\nGunakan menara yang lebih bagus atau amunisi yang lebih kuat seperti :graphite: [accent]Grafit[] :duo:Duo/:salvo:Salvo untuk menghancurkan Penjaga. hint.coreUpgrade = Inti dapat ditingkatkan dengan cara [accent]meletakkan Inti yang lebih besar di atasnya[].\n\nLetakkan sebuah inti :core-foundation: [accent]Foundation[] diatas inti :core-shard: [accent]Shard[]. Pastikan terdapat ruang kosong dari bangunan yang lain. hint.serpuloCoreZone = [accent]Inti[] :core-shard: tambahan dapat dibangun di atas ubin :core-zone: [accent]Zona Inti[]. @@ -2152,6 +2178,16 @@ gz.zone2 = Apa pun yang dibangun dalam radius tersebut \nakan hancur ketika gelo gz.zone3 = Gelombang akan dimulai sekarang. Bersiaplah. gz.finish = Bangun lebih banyak menara, tambang lebih banyak sumber daya,\ndan bertahanlah terhadap semua gelombang untuk [accent]menguasai sektor[]. +ff.coal = Gunakan :mechanical-drill: [accent]Bor Mekanis[] untuk menambang :ore-coal: [accent]Batu Bara[]. +ff.graphitepress = :tree: Riset dan tempatkan :graphite-press: [accent]Pencetak Grafit[]. +ff.craft = Pindahkan :coal: batu bara ke dalam :graphite-press: [accent]Pencetak Grafit[].\nIni akan memproduksi :graphite: grafit ke semua konveyor di dekatnya.\nPindahkan :graphite: grafit hasil cetakan dari :graphite-press: [accent]Pencetak Grafit[] ke inti. +ff.generator = :coal: Batu Bara juga dapat digunakan sebagai bahan bakar pada :combustion-generator: [accent]Generator Pembakar[].\nRiset dan tempatkan :combustion-generator: [accent]Generator Pembakar[]. +ff.coalpower = Masukkan :coal: batu bara ke dalam generator pembakar untuk menghasilkan [accent]:power: tenaga[]. +ff.coalpower.objective = :combustion-generator: Hasilkan Tenaga +ff.node = :power-node: [accent]Simpul Tenaga[] mentransmisikan tenaga ke blok terdekat dalam jangkauan.\nRiset dan tempatkan :power-node: [accent]Simpul Tenaga[] di dekat generator pembakar. +ff.battery = :battery: [accent]Baterai[] berguna untuk menyimpan tenaga.\nRiset dan tempatkan :battery: [accent]Baterai[] di dekat simpul tenaga. +ff.arc = Menara :arc: [accent]Arc[] memerlukan tenaga untuk berfungsi. Riset dan tempatkan menara :arc: [accent]Arc[] di dekat simpul tenaga. + fungalpass.tutorial1 = Gunakan [accent]unit[] untuk mempertahankan bangunan dan menyerang musuh.\nTeliti dan tempatkan :ground-factory: [accent]pabrik unit darat[]. fungalpass.tutorial2 = Pilih unit :dagger: [accent]Dagger[] di pabrik.\nProduksi 3 Unit. @@ -2401,9 +2437,9 @@ block.multiplicative-reconstructor.description = Meningkatkan unit di dalamnya m block.exponential-reconstructor.description = Meningkatkan unit di dalamnya menjadi tingkat empat. block.tetrative-reconstructor.description = Meningkatkan unit di dalamnya menjadi tingkat lima dan terakhir. block.switch.description = Sakelar yang dapat dialihkan. Status dapat dibaca dan dikendalikan dengan prosesor logika. -block.micro-processor.description = Menjalankan urutan instruksi logika dalam satu lingkaran. Dapat digunakan untuk mengontrol unit dan bangunan. -block.logic-processor.description = Menjalankan urutan instruksi logika dalam satu lingkaran. Dapat digunakan untuk mengontrol unit dan bangunan. Lebih cepat dibandingkan prosesor mikro. -block.hyper-processor.description = Menjalankan urutan instruksi logika dalam satu lingkaran. Dapat digunakan untuk mengontrol unit dan bangunan. Lebih cepat dibandingkan prosesor logika. +block.micro-processor.description = Menjalankan urutan instruksi logika dalam satu perulangan. Dapat digunakan untuk mengontrol unit dan bangunan. +block.logic-processor.description = Menjalankan urutan instruksi logika dalam satu perulangan. Dapat digunakan untuk mengontrol unit dan bangunan. Lebih cepat dibandingkan prosesor mikro. +block.hyper-processor.description = Menjalankan urutan instruksi logika dalam satu perulangan. Dapat digunakan untuk mengontrol unit dan bangunan. Lebih cepat dibandingkan prosesor logika. block.memory-cell.description = Menyimpan informasi untuk prosesor. block.memory-bank.description = Menyimpan informasi untuk prosesor. Berkapasitas besar. block.logic-display.description = Menampilkan grafik sembarang dari prosesor. @@ -2478,12 +2514,12 @@ block.unit-cargo-loader.description = Memproduksi unit kargo. Unit kargo secara block.unit-cargo-unload-point.description = Bertindak sebagai titik bongkar muatan unit kargo. Menerima barang yang cocok dengan filter yang dipilih. block.beam-node.description = Mentransmisikan tenaga ke blok lain secara ortogonal. Menyimpan tenaga dalam jumlah yang kecil. block.beam-tower.description = Mentransmisikan tenaga ke blok lain secara ortogonal. Menyimpan tenaga dalam jumlah yang besar. Jarak jauh. -block.beam-link.description = Mentransmisikan tenaga ke blok lain dengan jarak yang sangat jauh.\nHanya mampu terhubung ke struktur yang berdekatan atau tautan sinar lainnya. +block.beam-link.description = Mentransmisikan tenaga ke blok lain dengan jarak yang sangat jauh.\nHanya mampu tersambung ke struktur yang berdekatan atau tautan sinar lainnya. block.turbine-condenser.description = Menghasilkan tenaga ketika ditempatkan pada ventilasi. Menghasilkan sedikit air. block.chemical-combustion-chamber.description = Menghasilkan tenaga dari arkisit dan ozon. block.pyrolysis-generator.description = Menghasilkan tenaga dalam jumlah besar dari arkisit dan lava. Menghasilkan air sebagai produk sampingan. block.flux-reactor.description = Menghasilkan tenaga dalam jumlah besar ketika dipanaskan. Memerlukan sianogen sebagai penstabil. Tenaga yang dihasilkan dan kebutuhan sianogen sebanding dengan panas yang masuk.\nMeledak jika sianogen yang disediakan tidak mencukupi. -block.neoplasia-reactor.description = Menggunakan arkisit, air, dan fabrik phase untuk menghasilkan daya dalam jumlah besar. Menghasilkan panas dan neoplasma yang berbahaya sebagai produk sampingan.\nMeledak hebat jika neoplasma tidak dikeluarkan dari reaktor melalui saluran. +block.neoplasia-reactor.description = Menggunakan arkisit, air, dan fabrik phase untuk menghasilkan daya dalam jumlah besar. Menghasilkan panas dan neoplasma yang berbahaya sebagai produk sampingan.\nMeledak jika neoplasma tidak dikeluarkan dari reaktor melalui saluran. block.build-tower.description = Secara otomatis membangun kembali bangunan dalam jangkauan dan membantu unit lain dalam konstruksi. block.regen-projector.description = Perlahan menyembuhkan bangunan sekutu di perimeter persegi. Memerlukan hidrogen. Dapat menggunakan fabrik phase untuk meningkatkan efisiensi. block.reinforced-container.description = Menyimpan sejumlah kecil barang. Isi kontainer dapat diambil melalui pembongkar muatan. Tidak dapat meningkatkan kapasitas penyimpanan inti. @@ -2502,12 +2538,13 @@ block.basic-assembler-module.description = Menaikkan tingkat perakit ketika dite block.small-deconstructor.description = Mendekonstruksi bangunan dan unit yang dimasukkan. Mengembalikan 100% biaya pembangunan. block.reinforced-payload-conveyor.description = Memindahkan muatan ke depan. block.reinforced-payload-router.description = Mendistribusikan muatan ke blok yang berdekatan. Berfungsi sebagai penyortir ketika filter disetel. -block.payload-mass-driver.description = Struktur transportasi muatan jarak jauh. Menembakkan muatan ke penembak muatan massal yang terhubung. -block.large-payload-mass-driver.description = Struktur transportasi muatan jarak jauh. Menembakkan muatan ke penembak muatan massal yang terhubung. +block.payload-mass-driver.description = Struktur transportasi muatan jarak jauh. Menembakkan muatan ke penembak muatan massal yang tersambung. +block.large-payload-mass-driver.description = Struktur transportasi muatan jarak jauh. Menembakkan muatan ke penembak muatan massal yang tersambung. block.unit-repair-tower.description = Memulihkan semua unit di sekitarnya. Memerlukan ozon. block.radar.description = Secara bertahap mengungkap medan dan unit musuh dalam radius besar. Memerlukan tenaga. block.shockwave-tower.description = Merusak dan menghancurkan proyektil musuh dalam radius. Memerlukan sianogen. block.canvas.description = Menampilkan gambar sederhana dengan palet yang telah ditentukan sebelumnya. Dapat diedit. +block.large-canvas.description = Menampilkan gambar sederhana dengan palet yang telah ditentukan sebelumnya. Dapat diedit. unit.dagger.description = Menembak peluru standar ke arah musuh. unit.mace.description = Menembak semburan api ke arah musuh. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 8501e696bf..41b7c90f02 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki ufficiale di Mindustry link.suggestions.description = Suggerisci nuove funzionalità link.bug.description = Trovato uno? Segnalalo qui linkopen = Questo server ti ha inviato un link, sicuro di volerlo aprire?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Impossibile aprire il link! L'URL è stato copiato negli appunti. screenshot = Screenshot salvato a {0} screenshot.invalid = Mappa troppo pesante, probabilmente non c'è abbastanza spazio sul disco. @@ -124,6 +125,8 @@ maps.none = [lightgray]Nessuna mappa trovata! invalid = Non valido pickcolor = Seleziona Colore color = Color +import = Import +export = Export preparingconfig = Preparo la Configurazione preparingcontent = Preparo il Contenuto uploadingcontent = Carico il Contenuto @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficoltà +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Completato techtree = Albero Scoperte techtree.select = Seleziona albero delle scoperte @@ -359,6 +364,7 @@ confirm = Conferma delete = Elimina view.workshop = Vedi nel Workshop workshop.listing = Modifica l'elenco del Workshop +hide = Hide ok = OK open = Apri customize = Personalizza @@ -370,7 +376,6 @@ command.repair = Ripara command.rebuild = Ricostruisci command.assist = Aiuta Giocatore command.move = Muovi -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Apri Link @@ -428,6 +435,7 @@ saveimage = Salva Immagine unknown = Sconosciuto custom = Personalizzato builtin = Incluso +modded = Modded map.delete.confirm = Sei sicuro di voler eliminare questa mappa? L'operazione è irreversibile! map.random = [accent]Mappa casuale map.nospawn = Questa mappa non possiede un Nucleo in cui generare! Aggiungine uno nell'editor. @@ -488,10 +496,14 @@ editor.center = Centro editor.search = Ricerca mappe... editor.filters = Filtri mappe editor.filters.mode = Modalità di gioco: +editor.filters.priorities = Priorities: editor.filters.type = Tipo mappa: editor.filters.search = Cerca in: editor.filters.author = Autore editor.filters.description = Descrizione +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Cerca ondate... waves.filter = Filtro Unità waves.units.hide = Nascondi tutto waves.units.show = Mostra tutto +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = conteggi @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Distruggi: [][lightgray]{0}[]x unità objective.enemiesapproaching = [accent]Nemici in arrivo tra [lightgray]{0}[] objective.enemyescelating = [accent]Produzione nemica in aumento tra [lightgray]{0}[] objective.enemyairunits = [accent]La produzione aerea nemica comincia tra [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Distruggi il nucleo nemico objective.command = [accent]Comanda Unità objective.nuclearlaunch = [accent]⚠ Lancio nucleare rilevato: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Impossibile cambiare settore sector.noswitch = Non puoi cambiare settore mentre sei sotto attacco.\n\nSectore: [accent]{0}[] on [accent]{1}[] sector.view = Vedi settore sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Bassa threat.medium = Media @@ -843,6 +858,10 @@ threat.high = Alta threat.extreme = Estrema threat.eradication = Catastrofe +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Molto Facile difficulty.easy = Facile difficulty.normal = Normale @@ -862,7 +881,7 @@ planet.sun.name = Sole sector.impact0078.name = Impatto 0078 sector.groundZero.name = Terreno Zero -sector.craters.name = Crateri +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Foresta Ghiacciata sector.ruinousShores.name = Rive in Rovina sector.stainedMountains.name = Montagne Macchiate @@ -890,13 +909,14 @@ sector.fallenVessel.name = Nave Affondata sector.mycelialBastion.name = Bastione del Micelio sector.frontier.name = Frontiera sector.sunkenPier.name = Molo Sommerso +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Roccaforte Geotermica sector.groundZero.description = La posizione ottimale per ricominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nParti. sector.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature gelide non possono contenerle per sempre.\n\nInizia l'avventura nell'energia. Costruisci generatori a combustione. Impara a usare i riparatori. sector.saltFlats.description = Alla periferia nel deserto si trovano le saline. Si possono ricavare poche risorse in questa posizione.\n\nIl nemico ha costruito un complesso di immagazzinamento delle risorse qui. Elimina il loro nucleo. Non lasciare niente in piedi. -sector.craters.description = L'acqua si è accumulata in questo cratere, reliquia delle antiche guerre. Bonifica l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa acqua per raffreddare torrette e trivelle. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Oltre le distese, c'è il litorale. Una volta, questa posizione ospitava uno schieramento difensivo sulla costa. Non ne rimane molto. Solo le strutture di difesa più elementari sono rimaste intatte, tutto il resto è stato ridotto a rottami.\nContinua l'espansione verso l'esterno. Riscopri la tecnologia. sector.stainedMountains.description = Oltre l'entroterra ci sono le montagne, ma non contaminato da spore.\nEstrai l'abbondante titanio in questa zona. Impara come usarlo.\n\nQui la presenza nemica è maggiore. Non dare loro il tempo di inviare le loro unità più forti. sector.overgrowth.description = Questa zona è ricoperta di vegetazione, più vicina alla fonte delle spore.\nIl nemico ha stabilito un avamposto qui. Costruisci le unità Titano. Distruggilo. Recupera ciò che è stato perso. @@ -1045,6 +1065,7 @@ stat.boosteffect = Effetto Boost stat.maxunits = Unità Attive Massime stat.health = Salute stat.armor = Armatura +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Tempo di Costruzione stat.maxconsecutive = Limite Consecutivi stat.buildcost = Costo di Costruzione @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray] bullet.incendiary = [stat]incendiario bullet.homing = [stat]autoguidato bullet.armorpierce = [stat]perforazione alle armature -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] limite danno bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disabilita le mod dopo un arresto anomalo setting.animatedwater.name = Fluidi Animati setting.animatedshields.name = Scudi Animati setting.playerindicators.name = Indicatori Giocatori +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicatori Nemici setting.autotarget.name = Mira Automatica setting.keyboard.name = Tastiera @@ -1269,6 +1292,8 @@ setting.fpscap.none = Niente setting.fpscap.text = {0} FPS setting.uiscale.name = Ridimensionamento Interfaccia[lightgray] (richiede il riavvio)[] setting.uiscale.description = Riavvio necessario per applicare le modifiche. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Posizionamento Sempre Diagonale setting.screenshake.name = Movimento dello Schermo setting.bloomintensity.name = Intensità d'illuminazione (Bloom Intensity) @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Intervallo di Salvataggio Automatico setting.seconds = {0} secondi setting.milliseconds = {0} millisecondi setting.fullscreen.name = Schermo Intero -setting.borderlesswindow.name = Finestra Senza Bordi[lightgray] (potrebbe richiedere il riavvio) -setting.borderlesswindow.name.windows = Schermo intero senza bordi -setting.borderlesswindow.description = Potrebbe essere necessario il riavvio. setting.fps.name = Mostra FPS e Ping setting.console.name = Attiva Console setting.smoothcamera.name = Visuale fluida @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volume Ambiente setting.mutemusic.name = Silenzia Musica setting.sfxvol.name = Volume Effetti setting.mutesound.name = Silenzia Suoni -setting.crashreport.name = Invia rapporti anonimi sugli arresti anomali setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Salvataggi Automatici setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multigiocatore category.blocks.name = Seleziona Blocco placement.blockselectkeys = \n[lightgray]Tasto: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Rinasci keybind.control.name = Controlla Unità keybind.clear_building.name = Pulisci Costruzione @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Risorse AI (squadra Rossa) Infinite rules.blockhealthmultiplier = Moltiplicatore Salute Blocco rules.blockdamagemultiplier = Moltiplicatore Danno Blocco +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Moltiplicatore Velocità Costruzione Unità rules.unitcostmultiplier = Moltiplicatore Costo Unità rules.unithealthmultiplier = Moltiplicatore Vita Unità @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fuoco rules.anyenv = rules.explosions = Danno da Esplosione Blocchi/Unità @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Clicca e trattieni[] piccoli blocchi o unit hint.payloadDrop = Premi [accent]][] per rilasciare un carico. hint.payloadDrop.mobile = [accent]Clicca e trattieni[] una posizione vuota per rilasciarci un carico. hint.waveFire = [accent]Idrogetto[] torrette con acqua per munizioni spegneranno automaticamente incendi. -hint.generator = \uf879 [accent]Generatori a Combustibile[] bruciano carbone e trasferiscono energia ai blocchi adiacenti.\n\nIl raggio di trasmissione dell'enrgia può essere esteso con \uf87f [accent]Nodo Energetico[]. hint.guardian = Unità [accent]Guardiano[] sono corazzate. Munizioni deboli come [accent]Rame[] e [accent]Piombo[] sono [scarlet]inefficaci[].\n\nUsa torrette di grado superiore o \uf835 [accent]Grafite[] \uf861Duo/\uf859Cannone Leggero per buttare giù il boss. hint.coreUpgrade = I nuclei possono essere aggiornati [accent]piazzando nuclei di un livello superiore sopra di loro[].\n\nPiazzia un nucleo \uf868 [accent]Fondazione[] sopra il nucleo \uf869 [accent]Frammento[]. Assicurati che sia libero da ostacoli. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Spara proiettili standard ai nemici vicini. unit.mace.description = Spara raffiche infuocate ai nemici vicini. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index d940250931..ee086b9a89 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -15,6 +15,7 @@ link.wiki.description = 公式 Mindustry Wiki link.suggestions.description = 新機能を提案する link.bug.description = バグを見つけましたか?ぜひここから報告して下さい。 linkopen = このサーバーからリンクが送信されました。開きますか?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = リンクを開けませんでした!\nURLをクリップボードにコピーしました。 screenshot = スクリーンショットを {0} に保存しました。 screenshot.invalid = マップが広すぎます。スクリーンショットに必要なメモリが足りない可能性があります。 @@ -124,6 +125,8 @@ maps.none = [lightgray]マップが見つかりませんでした! invalid = 無効 pickcolor = 色を選ぶ color = Color +import = Import +export = Export preparingconfig = 設定ファイルを準備中 preparingcontent = コンテンツを準備中 uploadingcontent = コンテンツをアップロードしています @@ -212,6 +215,8 @@ campaign.none = [lightgray]キャンペーンを始める惑星を選んでく campaign.erekir = より新しく、より洗練されたコンテンツ。 ほぼ一貫して進行するキャンペーン。\n\n高品質のマップと総合的な体験。 campaign.serpulo = 昔のコンテンツ。クラシックな体験。より自由な発想。\n\nマップやキャンペーンの仕組みがアンバランスになる可能性があり、あまり洗練されてない。 campaign.difficulty = 難易度 +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]完了 techtree = テックツリー techtree.select = テックツリーの選択 @@ -359,6 +364,7 @@ confirm = 確認 delete = 削除 view.workshop = ワークショップを見る workshop.listing = ワークショップ一覧を編集する。 +hide = Hide ok = OK open = 開く customize = カスタマイズ @@ -370,7 +376,6 @@ command.repair = 修復 command.rebuild = 再建築 command.assist = プレイヤーをアシスト command.move = 移動 -command.boost = ブースト command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = 姿勢:発砲 stance.holdfire = 姿勢:発砲控え stance.pursuetarget = 姿勢:追撃 stance.patrol = 姿勢:偵察経路 +stance.holdposition = Stance: Hold Position stance.ram = 姿勢: 突撃\n[lightgray]直線、経路捜索無し +stance.boost = Boost stance.mineauto = 自採掘掘 stance.mine = 採掘数: {0} openlink = リンクを開く @@ -428,6 +435,7 @@ saveimage = 画像を保存 unknown = 不明 custom = カスタム builtin = 組み込み +modded = Modded map.delete.confirm = マップを削除してもよろしいですか? これは元に戻すことができません! map.random = [accent]ランダムマップ map.nospawn = このマップにはプレイヤーが出現するためのコアがありません! エディターで{0}のコアをマップに追加してください。 @@ -488,10 +496,14 @@ editor.center = 中心 editor.search = マップを検索... editor.filters = マップをフィルターする editor.filters.mode = ゲームモード: +editor.filters.priorities = Priorities: editor.filters.type = マップタイプ: editor.filters.search = 検索: editor.filters.author = 作者 editor.filters.description = 説明 +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = ワークショップ @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = すべて非表示 waves.units.show = すべて表示 +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = 数 @@ -749,6 +762,7 @@ objective.destroyunits = [accent]破壊: [][lightgray]{0}[]x ユニット objective.enemiesapproaching = [accent]敵が [lightgray]{0}[] に接近中 objective.enemyescelating = [accent][lightgray]{0} で敵の生産が早くなる。[] objective.enemyairunits = [accent][lightgray]{0} で敵の航空部隊の生産が始まる。[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]敵のコアを破壊する objective.command = [accent]ユニットの制御 objective.nuclearlaunch = [accent]⚠ 核弾頭の発射が確認されました: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = セクターを切り替えることができません sector.noswitch = 既存のセクターが攻撃を受けている間は、セクターを切り替えることはできません。\n\nセクター: [accent]{0}[] on [accent]{1}[] sector.view = セクターを表示 sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = 低 threat.medium = 中 @@ -843,6 +858,10 @@ threat.high = 高 threat.extreme = 過酷 threat.eradication = 破滅的 +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = 軽快 difficulty.easy = 簡単 difficulty.normal = 普通 @@ -862,7 +881,7 @@ planet.sun.name = 太陽 sector.impact0078.name = 墜落地点 0078 sector.groundZero.name = 始点 -sector.craters.name = クレーター +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = 凍った森 sector.ruinousShores.name = 荒廃した海岸 sector.stainedMountains.name = 汚染された山脈 @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = 辺境辺境 sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = 地熱要塞 sector.groundZero.description = 奪回を始めるには最適な場所です。敵の脅威は少ないが、資源が乏しい。\nできるだけ多くの銅と鉛を集めろ。\n開始せよ。 sector.frozenForest.description = ここでさえ、山に近づくほど胞子が広がっている。\n極寒の気候もでさえ胞子を永遠に封じ込めることはできなかった。\n\n電動技術に挑め。\n火力発電機を建設し、修復機の使い方を学べ。 sector.saltFlats.description = 砂漠のはずれにある平野です。\nここには資源がほとんどありません。\n\n敵はここに資源貯蔵施設を建設しました。\nコアを破壊し、掃滅してください。 -sector.craters.description = 過去の戦争の名残であるクレーターに水が溜まっています。\nエリアを取り戻し、砂を集め、メタガラスを精錬せよ。\nタレットとドリルを冷却するためには水をポンプで送る必要があります。 +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = 荒れ地を過ぎると海岸線です。\nここにはかつて沿岸防衛隊が配備されていましたが、ほぼ残存していません。\n最も基本的な防衛施設のみが無傷のまま残っており、それ以外は全て破壊されています。\n外部拡張を続け、技術を再発見せよ。 sector.stainedMountains.description = 更に内陸には、胞子に汚染されていない山があります。\nこの地域にはチタンが豊富にあります。抽出して使い方を学びましょう。\n\nここにはより多くの敵が襲来します。強力なユニットを送る時間を与えるな。 sector.overgrowth.description = このエリアは、胞子の発生源に近く生い茂っています。\n敵はここに前哨基地を配備しました。ユニットの"メイス"を生産し、破壊してください。\n失われたものを取り反せ。 @@ -1045,6 +1065,7 @@ stat.boosteffect = ブースト効果 stat.maxunits = 最大ユニット数 stat.health = 耐久値 stat.armor = 装甲 +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = 建設時間 stat.maxconsecutive = 最大連鎖 stat.buildcost = 建設費用 @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] 範囲ダメージ 約[stat] {1}[ligh bullet.incendiary = [stat]焼夷弾 bullet.homing = [stat]追尾弾 bullet.armorpierce = [stat]装甲貫通 -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] ダメージ制限 bullet.suppression = [stat]{0} 秒[lightgray] 修復妨害 ~ [stat]{1}[lightgray] タイル @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = 起動時にクラッシュした場合にModを setting.animatedwater.name = 流体のアニメーション setting.animatedshields.name = シールドのアニメーション setting.playerindicators.name = プレイヤーの方角表示 +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = 敵の方角表示 setting.autotarget.name = 標的自動補足 setting.keyboard.name = マウスとキーボード操作 @@ -1269,6 +1292,8 @@ setting.fpscap.none = なし setting.fpscap.text = {0} FPS setting.uiscale.name = UIサイズ setting.uiscale.description = 再起動が必要です。 +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = 常に斜め設置 setting.screenshake.name = 画面の揺れ setting.bloomintensity.name = きらめきの強さ @@ -1282,9 +1307,6 @@ setting.saveinterval.name = 自動保存間隔 setting.seconds = {0} 秒 setting.milliseconds = {0} ミリ秒 setting.fullscreen.name = フルスクリーン -setting.borderlesswindow.name = ボーダーレスウィンドウ -setting.borderlesswindow.name.windows = ボーダーレスフルスクリーン -setting.borderlesswindow.description = 再起動が必要になる場合があります。 setting.fps.name = FPSを表示 setting.console.name = コンソールを有効にする setting.smoothcamera.name = スムーズなカメラ @@ -1303,7 +1325,6 @@ setting.ambientvol.name = 環境音 音量 setting.mutemusic.name = 音楽をミュート setting.sfxvol.name = 効果音 音量 setting.mutesound.name = 効果音をミュート -setting.crashreport.name = 匿名でクラッシュレポートを送信する setting.communityservers.name = Fetch Community Server List setting.savecreate.name = 自動保存 setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = ユニット指令 category.multiplayer.name = マルチプレイ category.blocks.name = ブロックセレクト placement.blockselectkeys = \n[lightgray]キー: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = リスポーン keybind.control.name = ユニットをコントロール keybind.clear_building.name = 建築の取り消し @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = ユニット姿勢:発砲控え keybind.unit_stance_pursue_target.name = ユニット姿勢:追撃 keybind.unit_stance_patrol.name = ユニット姿勢:偵察経路 keybind.unit_stance_ram.name = ユニット姿勢:突撃 +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = ユニット指令:移動 keybind.unit_command_repair.name = ユニット指令:修復 keybind.unit_command_rebuild.name = ユニット指令:再建 keybind.unit_command_assist.name = ユニット指令:援助 keybind.unit_command_mine.name = ユニット指令:採掘 -keybind.unit_command_boost.name = ユニット指令:ブースト keybind.unit_command_load_units.name = ユニット指令:ユニット搬入 keybind.unit_command_load_blocks.name = ユニット指令:ブロック搬入 keybind.unit_command_unload_payload.name = ユニット指令:ペイロード搬出 @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = 敵(赤チーム)の資源の無限化 rules.blockhealthmultiplier = ブロック体力倍率 rules.blockdamagemultiplier = ブロックダメージ倍率 +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = ユニット製造速度倍率 rules.unitcostmultiplier = ユニット製造コスト倍率 rules.unithealthmultiplier = ユニット体力倍率 @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = 敵発生地表示 rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = 火災 rules.anyenv = rules.explosions = 爆発ダメージ @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = 強化ペイロードルーター block.payload-mass-driver.name = ペイロードマスドライバー block.small-deconstructor.name = 小さなデコンストラクター block.canvas.name = キャンバス +block.large-canvas.name = Large Canvas block.world-processor.name = ワールドプロセッサー block.world-cell.name = ワールドセル block.tank-fabricator.name = 戦車工場 @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]タップ&ホールド[]により、小さ hint.payloadDrop = [accent]][]を押すと、積載物を降ろします。 hint.payloadDrop.mobile = 空いている場所を[accent]タップ&ホールド[]して、積載物を降ろします。 hint.waveFire = [accent]ウェーブ[]タレットは水を搬入すると、近くの火を自動的に消火します。 -hint.generator = :combustion-generator: [accent]火力発電機[]石炭を燃やし、隣接するブロックに電力を供給します。\n\n電力供給範囲は:power-node: [accent]電源ノード[]で拡張できます。 hint.guardian = [accent]ガーディアン[]ユニットは装甲を搭載しています。[accent]銅[]や[accent]鉛[]などの弱い弾薬は[scarlet]効果がありません[]。\n\n強力なターレット、または:duo:デュオ/:salvo:サルボーの弾薬に:graphite: [accent]黒鉛[]を使用してガーディアンを撃破してください。 hint.coreUpgrade = コアは [accent]上位のコアを配置することでアップグレードできます[]。\n\n :core-shard: [accent]シャード[]コアの上に、 :core-foundation: [accent]ファンデーション[]コアを置きます。近くに障害物がないことを確認してください。 hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = ウェーブが始まると、円の中に構築されたものはす gz.zone3 = もうすぐウェーブが始まります。\n準備をしてください。 gz.finish = より多くのタレットを建設し、より多くの資源を採掘し、\nすべてのウェーブから防御して[accent]セクターを占領[]してください。 +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = 周辺のすべてのユニットを修理 block.radar.description = 大きな半径で地形と敵ユニットを徐々に発見します。 電源が必要です。 block.shockwave-tower.description = 半径内の敵の発射体にダメージを与えて破壊します。 シアンが必要です。 block.canvas.description = 定義済みのパレットを使用して単純な画像を表示します。 編集可能。 +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = 近くの敵に標準的な弾丸を発射します。 unit.mace.description = 近くの敵に火炎放射を発射します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 3b2dcecab6..c8565d5e07 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -15,6 +15,7 @@ link.wiki.description = 공식 Mindustry 위키 link.suggestions.description = 새 기능 제안하기 link.bug.description = 버그 제보하기 linkopen = 이 서버에서 당신에게 링크를 보냈습니다. 정말로 열어보시겠습니까?\n\n[sky]{0} +clipboardcopy = 이 서버에서 텍스트를 클립보드에 복사하려고 합니다. 계속하시겠습니까?\n\n[sky]{0} linkfail = 링크를 열지 못했습니다!\nURL이 클립보드에 복사되었습니다. screenshot = 스크린샷이 {0} 에 저장되었습니다. screenshot.invalid = 맵이 너무 커서 스크린샷에 사용될 메모리가 부족합니다. @@ -98,10 +99,10 @@ level.highscore = 최고 점수: [accent]{0} level.select = 맵 선택 level.mode = 게임 모드: coreattack = < 코어가 공격을 받고 있습니다! > -nearpoint = [[ [scarlet]즉시 적 착륙 지점에서 떠나세요[] ]\n점멸이 임박됨 +nearpoint = [[ [scarlet]즉시 적 착륙 지점에서 떠나세요[] ]\n전멸이 임박됨 database = 코어 데이터베이스 database.button = 데이터베이스 -database.patched = Modified by data patches. +database.patched = 데이터 패치로 수정됨. viewfields = 콘텐츠 필드 보기 savegame = 게임 저장 loadgame = 게임 불러오기 @@ -124,6 +125,8 @@ maps.none = [lightgray]맵을 찾을 수 없습니다! invalid = 오류 pickcolor = 색상 선택 color = 색상 +import = 가져오기 +export = 내보내기 preparingconfig = 설정 준비 중 preparingcontent = 콘텐츠 준비 중 uploadingcontent = 콘텐츠 올리는 중 @@ -212,6 +215,8 @@ campaign.none = [lightgray]시작할 행성을 선택하십시오.\n언제든지 campaign.erekir = [scarlet]신규 플레이어에게 권장되지 않습니다.[]\n\n보다 새롭고 세련된 컨텐츠. 대부분 순차적으로 캠페인이 진행됨.\n\n더 어렵고, 더 높은 완성도의 맵과 다채로운 경험. campaign.serpulo = [accent]신규 플레이어에게 추천합니다.[]\n\n오래된 콘텐츠, 고전적인 경험. 더 개방적이고, 더 많은 콘텐츠.\n\n잠재적으로 불균형한 맵과 캠페인 메커니즘. 덜 세련됨. campaign.difficulty = 난이도 +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]완료됨 techtree = 연구 기록 techtree.select = 연구 기록 선택 @@ -359,6 +364,7 @@ confirm = 확인 delete = 삭제 view.workshop = 창작마당에서 보기 workshop.listing = 창작마당 목록 편집하기 +hide = 숨기기 ok = 확인 open = 열기 customize = 사용자 정의 규칙 @@ -370,7 +376,6 @@ command.repair = 수리 command.rebuild = 재건 command.assist = 플레이어 지원 command.move = 이동 -command.boost = 비행 command.enterPayload = 화물 블록에 들어가기 command.loadUnits = 유닛 적재 command.loadBlocks = 블록 적재 @@ -381,7 +386,9 @@ stance.shoot = 명령: 사격 stance.holdfire = 명령: 사격 중지 stance.pursuetarget = 명령: 타겟 추격 stance.patrol = 명령: 정찰 +stance.holdposition = 명령: 현재 위치 유지 stance.ram = 명령 : 돌격\n[lightgray] 유닛이 장애물 여부를 확인하지 않고 일직선으로 이동합니다. +stance.boost = 이륙 stance.mineauto = 자동 채굴 stance.mine = 채굴 자원: {0} openlink = 링크 열기 @@ -428,7 +435,8 @@ saveimage = 사진 저장하기 unknown = 알 수 없음 custom = 사용자 정의 builtin = 내장 -map.delete.confirm = 정말로 이 맵을 삭제하시겠습니까? 이 명령은 취소할 수 없습니다! +modded = 모드가 포함됨 +map.delete.confirm = 정말로 이 맵을 삭제하시겠습니까? 이 선택은 되돌릴 수 없습니다! map.random = [accent]무작위 맵 map.nospawn = 이 맵에 플레이어가 생성될 코어가 없습니다! 편집기에서 {0} 코어를 맵에 추가하세요. map.nospawn.pvp = 이 맵에는 적 플레이어가 생성될 코어가 없습니다! 편집기에서 [scarlet]주황색 팀이 아닌[] 코어를 추가하세요. @@ -488,10 +496,14 @@ editor.center = 중앙으로 이동 editor.search = 맵 검색 editor.filters = 맵 필터링 editor.filters.mode = 게임 모드: +editor.filters.priorities = 우선순위: editor.filters.type = 맵 유형: editor.filters.search = 검색: editor.filters.author = 제작자 editor.filters.description = 설명 +editor.filters.modname = 모드 이름 +editor.filters.prioritizemod = 모드 우선순위 +editor.filters.prioritizecustom = 사용자 지정 우선순위 editor.shiftx = X축 밀기 editor.shifty = Y축 밀기 workshop = 창작마당 @@ -504,9 +516,9 @@ waves.health = 체력: {0}% waves.perspawn = 기씩 waves.shields = 방어막만큼 소환 waves.to = 부터 -waves.spawn = 소환: +waves.spawn = 소환 지점: waves.spawn.all = <전체> -waves.spawn.select = 적 소환지점 선택 +waves.spawn.select = 적 소환 지점 선택 waves.spawn.none = [scarlet] 적 소환지점을 찾을 수 없습니다 waves.max = 기까지 waves.guardian = 수호자 @@ -527,6 +539,7 @@ waves.search = 단계 검색... waves.filter = 유닛 필터 waves.units.hide = 모두 숨기기 waves.units.show = 모두 보이기 +pause.disabled = [scarlet]일시중지가 비활성화되어 있습니다 #these are intentionally in lower case wavemode.counts = 기 @@ -746,9 +759,10 @@ objective.coreitem = [accent]코어로 운반:\n[][lightgray]{0}[]/{1}\n{2}[ligh objective.build = [accent]건설: [][lightgray]{0}[]개의\n{1}[lightgray]{2} objective.buildunit = [accent]유닛 생산: [][lightgray]{0}[]기\n{1}[lightgray]{2} objective.destroyunits = [accent]처치: [][lightgray]{0}[]기의 유닛 -objective.enemiesapproaching = [accent]적이 [lightgray]{0}[]초 후에 도착합니다 -objective.enemyescelating = [accent]적의 생산량이 증가하고 있습니다[lightgray]{0}[] -objective.enemyairunits = [accent]적의 공중 유닛이 생산되고 있습니다[lightgray]{0}[] +objective.enemiesapproaching = [lightgray]{0}[][accent]초 후, 적이 접근합니다 +objective.enemyescelating = [lightgray]{0}[][accent]초 후, 적의 생산량이 증가합니다 +objective.enemyairunits = [lightgray]{0}[][accent]초 후, 적 공중 유닛이 생산되기 시작합니다 +objective.enemyunitproduction = [lightgray]{0}[][accent]초 후, 적 유닛이 생산되기 시작합니다 objective.destroycore = [accent]적의 코어를 파괴하세요 objective.command = [accent]유닛 조종 objective.nuclearlaunch = [accent]⚠ 핵 공격이 감지되었습니다: [lightgray]{0} @@ -824,7 +838,7 @@ sectors.go = 진입 sector.abandon = 포기 sector.abandon.confirm = 이 지역의 코어가 자폭합니다.\n계속하시겠습니까? sector.curcapture = 지역 점령됨 -sector.lockdown = [red]:warning:[accent] 현재 공격받고 있습니다\n[밝은 회색]생산, 연구, 수출입이 중단되었습니다. +sector.lockdown = [red]:warning:[accent] 현재 공격받고 있습니다\n[lightgray]생산, 연구, 수출입이 중단되었습니다. sector.curlost = 지역 잃음 sector.missingresources = [scarlet]코어 자원 부족[] sector.attacked = [accent]{0}[white] 지역이 공격받고 있습니다![] @@ -835,7 +849,8 @@ sector.changeicon = 아이콘 바꾸기 sector.noswitch.title = 지역 전환 불가능 sector.noswitch = 기존 지역이 공격받는 동안은 지역을 전환할 수 없습니다.\n\n지역: [accent]{0}[] 중 [accent]{1}[] sector.view = 지역 보기 -sector.foundationrequired = [lightgray] 코어: 기반 필요 +sector.foundationrequired = [lightgray] 근처에 코어: 기반 필요 +sector.shielded = [lightgray] Shielded threat.low = 낮음 threat.medium = 보통 @@ -843,6 +858,10 @@ threat.high = 높음 threat.extreme = 매우 높음 threat.eradication = 극한 +difficulty.guide.title = 알림 +difficulty.guide = 특정 지역이 너무 어렵게 느껴진다면, 캠페인 난이도를 조정하여 더 쉽게 진행할 수 있습니다. +difficulty.guide.confirm = 난이도 조정 + difficulty.casual = 캐주얼 difficulty.easy = 쉬움 difficulty.normal = 보통 @@ -862,7 +881,7 @@ planet.sun.name = 태양 sector.impact0078.name = 임팩트 0078 sector.groundZero.name = 전초기지 -sector.craters.name = 크레이터 +sector.crateredBattleground.name = 분화구로 뒤덮인 전쟁터 sector.frozenForest.name = 얼어붙은 숲 sector.ruinousShores.name = 파괴된 해안가 sector.stainedMountains.name = 얼룩진 산맥 @@ -879,7 +898,7 @@ sector.facility32m.name = 32 M 시설 sector.taintedWoods.name = 오염된 산림 sector.infestedCanyons.name = 감염된 깊은 협곡 sector.planetaryTerminal.name = 대행성 출격단지 -sector.coastline.name = 해안선 +sector.coastline.name = 습한 해안선 sector.navalFortress.name = 해군 요새 sector.polarAerodrome.name = 극지 비행장 sector.atolls.name = 환초섬 @@ -890,13 +909,14 @@ sector.fallenVessel.name = 추락한 함선 sector.mycelialBastion.name = 균사 성채 sector.frontier.name = 국경 지방 sector.sunkenPier.name = 가라앉은 부두 +sector.littoralShipyard.name = 연안 조선소 sector.cruxscape.name = 크럭스케이프 sector.geothermalStronghold.name = 지열 요새 sector.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지녔습니다. 적은 위협적이지 않지만, 자원도 풍부하진 않습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n이제 출격할 시간입니다. sector.frozenForest.description = 산과 가까운 이곳에도, 포자가 퍼졌습니다. 혹한의 추위조차 포자가 퍼지는 것을 억누를 수 없었습니다.\n화력 발전기를 건설하고, 멘더를 사용하는 방법을 배우세요. sector.saltFlats.description = 사막의 변두리에는 소금으로 이루어진 평원이 있습니다. 이곳에선 매우 적은 자원만 발견되었습니다.\n\n하지만 자원이 희소한 이곳에서도 적들의 요새가 포착되었습니다. 그들을 사막의 모래로 만들어버리세요. -sector.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 탈환하여 강화 유리를 제련하고, 포탑과 드릴에 물을 공급하여 더 강력한 방어선을 구축하여야 합니다. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = 폐허를 지나서 나오는 해안선. 한때, 이곳에는 해안 방어기지가 있었습니다.\n많은 부분이 소실되었고, 기본적인 방어 시설을 제외한 모든 것이 고철 덩어리가 되었습니다. \n외부로 세력을 확장하기 위한 첫 발걸음으로, 무너진 시설을 재건하고 잃어버린 기술을 다시 회수하십시오. sector.stainedMountains.description = 더 내륙에는 아직 포자에 오염되지 않은 산맥이 있습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n이곳은 더 강력한 적이 주둔하고 있습니다. 적이 가장 강력한 유닛을 준비할 시간을 주지 마십시오. sector.overgrowth.description = 이곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이곳에 전초기지를 설립했습니다. 대거를 생산해 적의 기지를 박살 내고 우리가 잃어버린 것을 되찾아야 합니다! @@ -1030,7 +1050,7 @@ stat.itemcapacity = 자원 용량 stat.memorycapacity = 변수 용량 stat.basepowergeneration = 기본 전력 발전량 stat.productiontime = 소요 시간 -stat.warmuptime = Warmup Time +stat.warmuptime = 준비 시간 stat.repairtime = 건물 완전 수리 시간 stat.repairspeed = 수리 속도 stat.weapons = 무기 @@ -1045,6 +1065,7 @@ stat.boosteffect = 버프 효과 stat.maxunits = 최대 유닛 수 stat.health = 체력 stat.armor = 방어력 +stat.armor.info = 받은 피해 = 들어오는 피해 - 방어력.\n최대 90%의 피해 감소 효과. stat.buildtime = 건설 시간 stat.maxconsecutive = 최대 체인 stat.buildcost = 건설 비용 @@ -1073,7 +1094,7 @@ stat.minetier = 채굴 등급 stat.payloadcapacity = 화물 용량 stat.abilities = 능력 stat.canboost = 이륙 가능 -stat.boostingspeed = Boosting Speed +stat.boostingspeed = 이륙 속도 stat.flying = 비행 stat.ammouse = 탄약 사용 stat.ammocapacity = 탄약 용량 @@ -1081,7 +1102,7 @@ stat.damagemultiplier = 피해량 배수 stat.healthmultiplier = 체력 배수 stat.speedmultiplier = 이동속도 배수 stat.reloadmultiplier = 재장전 배수 -stat.buildspeedmultiplier = 건설속도 배수 +stat.buildspeedmultiplier = 건설 속도 배수 stat.reactive = 작용 받음 stat.immunities = 상태이상 면역 stat.healing = 회복량 @@ -1091,7 +1112,7 @@ ability.forcefield = 보호막 필드 ability.forcefield.description = 탄을 흡수하는 보호막을 만들어냄 ability.repairfield = 수리 필드 ability.repairfield.description = 근처 유닛을 수리함 -ability.statusfield = 상태이상 필드 +ability.statusfield = 상태 이상 필드 ability.statusfield.description = 근처 유닛에 상태 효과를 제공함 ability.unitspawn = 공장 ability.unitspawn.description = 유닛을 생산함 @@ -1102,9 +1123,9 @@ ability.movelightning.description = 이동하면서 번개를 방출함 ability.armorplate = 장갑판 ability.armorplate.description = 사격 시 받는 피해가 감소됨 ability.shieldarc = 호 보호막 -ability.shieldarc.description = 탄약을 흡수하는 호 형태의 보호막을 만들어냄 +ability.shieldarc.description = 탄환, 미사일, 적의 공격을 흡수하거나 반사하는 호 형태의 보호막을 만들어냄 ability.suppressionfield = 재생성 억제 필드 -ability.suppressionfield.description = 근처 수리 건물을 잠깐동안 억제함 +ability.suppressionfield.description = 근처 수리 관련 건물 및 건설 관련 건물을 잠깐동안 억제함 ability.energyfield = 에너지 필드 ability.energyfield.description = 근처 적을 감전시킴 ability.energyfield.healdescription = 근처 적에게 전기 충격을 주고 건물과 아군을 치료함 @@ -1172,29 +1193,29 @@ bar.activated = 활성화됨 units.processorcontrol = [lightgray]프로세서 제어됨[] -weapon.pointdefense = [stat]Point Defense +weapon.pointdefense = [stat]발사체 요격 bullet.damage = [stat]{0}[lightgray] 피해량[][] bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat]{1}[lightgray] 타일[][][][] bullet.incendiary = [stat]방화[] bullet.homing = [stat]유도[] bullet.armorpierce = [stat]방어 관통 -bullet.armorweakness = [red]{0}%[lightgray] 방어력 취약 -bullet.armorpiercing = [stat]{0}%[lightgray] 방어력 관통 +bullet.armorweakness = [red]{0}x[lightgray] 방어력 취약 +bullet.partialarmorpierce = [stat]{0}%[lightgray] 방어력 관통 bullet.antiarmor = [stat]{0}x[lightgray] 방어력 반격 bullet.maxdamagefraction = [stat]{0}%[lightgray] 피해 한도 bullet.suppression = [stat]{0} 초[lightgray] 수리 억제 ~ [stat]{1}[lightgray] 타일 -bullet.empradius = [stat]{0}[lightgray] tiles EMP radius -bullet.empboost = [stat]{0}%[lightgray] overdrive ~ [stat]{1}[lightgray] -bullet.empdamage = [stat]{0}%[lightgray] power damage -bullet.empslowdown = [stat]{0}%[lightgray] enemy power overdrive ~ [stat]{1}[lightgray] -bullet.empunitdamage = [stat]{0}%[lightgray] unit damage +bullet.empradius = [stat]{0}[lightgray] 타일 ​​EMP 범위 +bullet.empboost = [stat]{0}%[lightgray] 과부하 ~ [stat]{1}[lightgray] +bullet.empdamage = [stat]{0}%[lightgray] 과부하 된 피해량 +bullet.empslowdown = [stat]{0}%[lightgray] 적에게 과부하 ~ [stat]{1}[lightgray] +bullet.empunitdamage = [stat]{0}%[lightgray] 유닛 피해량 bullet.interval = [stat]{0}/초[lightgray] 간격 탄환: bullet.frags = [stat]{0}[lightgray]개 파편 탄환:[][] bullet.lightning = [stat]{0}[lightgray]x 전격 ~ [stat]{1}[lightgray] 피해량[][][][] -bullet.lightninginterval = [stat]{0}[lightgray] tiles interval ~ [stat]{1}[lightgray] tiles length +bullet.lightninginterval = [stat]{0}[lightgray] 타일 ​​간격 ~ [stat]{1}[lightgray] 타일 ​​길이 bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량[][] -bullet.spawnBullets = [stat]{0}x[lightgray] spawned bullets: +bullet.spawnBullets = [stat]{0}x[lightgray] 생성된 탄환: bullet.shielddamage = [stat]{0}%[lightgray] 보호막 피해량 bullet.knockback = [stat]{0}[lightgray] 넉백[][] bullet.pierce = [stat]{0}[lightgray]번 관통[][] @@ -1215,7 +1236,7 @@ unit.liquidsecond = 액체/초 unit.itemssecond = 자원/초 unit.liquidunits = 액체 unit.powerunits = 전력 -unit.powerequilibrium = power equilibrium +unit.powerequilibrium = 전력 균형 unit.heatunits = 열 단위 unit.degrees = 도 unit.seconds = 초 @@ -1232,7 +1253,7 @@ unit.millions = m unit.billions = b unit.shots = 발 unit.pershot = /발 -unit.perleg = /다리 +unit.perleg = /다리 당 unit.perside = per side category.purpose = 목적 category.general = 일반 @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = 로딩 중 충돌 시 모드 비활성화 setting.animatedwater.name = 액체 애니메이션 효과 setting.animatedshields.name = 보호막 애니메이션 효과 setting.playerindicators.name = 플레이어 위치 표시기 +setting.showpings.name = 핑 표시 +setting.showotherbuildplans.name = 다른 플레이어의 건설 계획 보기 setting.indicators.name = 적 위치 표시기 setting.autotarget.name = 자동 조준 setting.keyboard.name = 마우스+키보드 조작 @@ -1269,6 +1292,8 @@ setting.fpscap.none = 없음 setting.fpscap.text = {0} FPS setting.uiscale.name = UI 스케일링 setting.uiscale.description = 적용하려면 재시작이 필요합니다. +setting.uiEdgePadding.name = UI 가장자리 패딩 +setting.uiEdgePadding.description = UI 가장자리에 여백을 추가합니다. 모서리가 둥글거나 노치 디자인이 있는 디스플레이에 유용합니다. setting.swapdiagonal.name = 항상 대각선 배치 setting.screenshake.name = 화면 흔들림 setting.bloomintensity.name = 광원 세기 @@ -1282,9 +1307,6 @@ setting.saveinterval.name = 저장 간격 setting.seconds = {0} 초 setting.milliseconds = {0} 밀리초 setting.fullscreen.name = 전체 화면 -setting.borderlesswindow.name = 테두리 없는 창 모드 -setting.borderlesswindow.name.windows = 테두리 없는 전체화면 -setting.borderlesswindow.description = 적용하려면 재시작이 필요할 수도 있습니다. setting.fps.name = FPS와 핑 표시 setting.console.name = 콘솔 활성화 setting.smoothcamera.name = 부드러운 시점 @@ -1303,7 +1325,6 @@ setting.ambientvol.name = 배경음 크기 setting.mutemusic.name = 음소거 setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 -setting.crashreport.name = 익명으로 오류 보고서 자동 전송 setting.communityservers.name = 커뮤니티 서버 목록 가져오기 setting.savecreate.name = 자동 저장 활성화 setting.steampublichost.name = 공개 게임 가시성 @@ -1334,6 +1355,8 @@ category.command.name = 유닛 지휘 category.multiplayer.name = 멀티플레이어 category.blocks.name = 블록 선택 placement.blockselectkeys = \n[lightgray]단축키: [{0}, +ping.text = 핑: +keybind.ping.name = 위치에 핑 찍기 keybind.respawn.name = 리스폰 keybind.control.name = 유닛 제어 keybind.clear_building.name = 설계도 초기화 @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = 유닛 명령: 사격 중지 keybind.unit_stance_pursue_target.name = 유닛 명령: 타겟 추격 keybind.unit_stance_patrol.name = 유닛 명령: 정찰 keybind.unit_stance_ram.name = 유닛 명령: 돌격 +keybind.unit_stance_boost.name = 유닛 명령: 이륙 +keybind.unit_stance_hold_position.name = 유닛 명령: 현재 위치 유지 keybind.unit_command_move.name = 유닛 제어: 이동 keybind.unit_command_repair.name = 유닛 제어: 수리 keybind.unit_command_rebuild.name = 유닛 제어: 재건 keybind.unit_command_assist.name = 유닛 제어: 플레이어 지원 keybind.unit_command_mine.name = 유닛 제어: 채굴 -keybind.unit_command_boost.name = 유닛 제어: 비행 keybind.unit_command_load_units.name = 유닛 제어: 유닛 적재 keybind.unit_command_load_blocks.name = 유닛 제어: 블록 적재 keybind.unit_command_unload_payload.name = 유닛 제어: 화물 투하 @@ -1483,13 +1507,14 @@ rules.checkplacement.info = 이 기능을 비활성화하면, 이 팀의 건물 rules.enemyCheat = 적 AI 무한자원 rules.blockhealthmultiplier = 블록 체력 배수 rules.blockdamagemultiplier = 블록 피해량 배수 +rules.unitfactoryactivation = 유닛 공장 활성화 지연 rules.unitbuildspeedmultiplier = 유닛 생산속도 배수 rules.unitcostmultiplier = 유닛 비용 배수 rules.unithealthmultiplier = 유닛 체력 배수 rules.unitdamagemultiplier = 유닛 피해량 배수 rules.unitcrashdamagemultiplier = 유닛 충돌 피해량 배수 rules.unitminespeedmultiplier = 유닛 채굴 속도 배수 -rules.logicunitcontrol = Logic Unit Control +rules.logicunitcontrol = 로직: 유닛 제어 허용 rules.logicunitbuild = 로직: 유닛 건설 허용 rules.logicunitdeconstruct = 로직: 유닛 철거 허용 rules.solarmultiplier = 태양광 전력 배수 @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = 7.0에서와 같이 착륙 패드 없이 발사 landingpad.legacy.disabled = [scarlet]\ue815 비활성화 됨[lightgray] (구 발사 패드 메커니즘 활성화 상태) rules.showspawns = 적 스폰 표시 rules.randomwaveai = 무작위 단계 AI +rules.pauseDisabled = 일시 중지 비활성화 rules.fire = 방화 허용 rules.anyenv = <모두> rules.explosions = 블록/유닛 폭발 피해 @@ -1713,7 +1739,7 @@ block.snow.name = 눈 block.crater-stone.name = 돌 구덩이 block.sand-water.name = 젖은 모래 block.darksand-water.name = 젖은 검은 모래 -block.char.name = 숯 +block.char.name = 까맣게 탄 돌 block.dacite.name = 데이사이트 block.rhyolite.name = 유문암 block.dacite-wall.name = 데이사이트 벽 @@ -2005,8 +2031,8 @@ block.radar.name = 레이더 block.build-tower.name = 건설 타워 block.regen-projector.name = 재생 프로젝터 block.shockwave-tower.name = 충격파 타워 -block.shield-projector.name = 보호막 프로젝터 -block.large-shield-projector.name = 대형 보호막 프로젝터 +block.shield-projector.name = 장벽 프로젝터 +block.large-shield-projector.name = 대형 장벽 프로젝터 block.armored-duct.name = 장갑 도관 block.overflow-duct.name = 포화 도관 block.underflow-duct.name = 불포화 도관 @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = 보강된 화물 분배기 block.payload-mass-driver.name = 화물 매스 드라이버 block.small-deconstructor.name = 소형 화물 분해기 block.canvas.name = 도화지 +block.large-canvas.name = 대형 도화지 block.world-processor.name = 월드 프로세서 block.world-cell.name = 월드 셀 block.tank-fabricator.name = 전차 조립기 @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = 작은 블록이나 유닛을 집으려면 해당 hint.payloadDrop = 다시 내려놓으려면 빈 공간에서 [accent]][]를 누르십시오. hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 두고 싶은 곳을 [accent]잠깐 누르십시오[]. hint.waveFire = [accent]웨이브[] 포탑에 물을 공급하면 주변에 발생한 화재를 자동으로 진압합니다. -hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]전력 노드[]를 활용하십시오. hint.guardian = [accent]수호자[] 유닛은 높은 체력과 방어력을 가졌습니다. [accent]구리[]와 [accent]납[]처럼 약한 탄약으로는 [scarlet]효과적인 피해를 주지 못합니다[].\n\n수호자를 제거하려면 높은 티어의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오. hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치[]하여 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지 확인하십시오. hint.serpuloCoreZone = 추가 코어는 :core-zone: [accent]코어 구역[] 타일에 건설할 수 있습니다. @@ -2150,12 +2176,22 @@ gz.supplyturret = [accent]포탑에 탄약 보급 gz.zone1 = 여긴 적의 착륙 지점입니다. gz.zone2 = 반경에 세워진 모든 것은 단계가 시작되면 파괴됩니다. gz.zone3 = 단계가 지금 시작됩니다.\n준비하세요. -gz.finish = 포탑을 더 건설하고, 자원을 더 채굴하고,\n모든 단계를 막아내어 [accent]이 지역을 점령[]하세요. 이것으로 튜토리얼을 마칩니다. 행운을 빕니다. +gz.finish = 포탑을 더 건설하고, 자원을 더 채굴하고,\n모든 단계를 막아내어 [accent]이 지역을 점령[]하세요. + +ff.coal = :mechanical-drill: [accent]기계식 드릴[]을 사용하여 :ore-coal: [accent]석탄[]을 채굴하세요. +ff.graphitepress = :graphite-press: [accent]흑연 압축기[]를 :tree: 연구하고 배치하세요. +ff.craft = :coal: 석탄을 :graphite-press: [accent]흑연 압축기[]에 넣으세요.\n그러면 :graphite: 흑연이 주변의 모든 컨베이어로 출력됩니다.\n :graphite-press: [accent]흑연 압축기[]에서 출력된 :graphite: 흑연을 코어로 옮기세요. +ff.generator = :coal: 석탄은 :combustion-generator: [accent]화력 발전기[]에서 연료로도 사용할 수 있습니다.\n:combustion-generator: [accent]화력 발전기[]를 연구하고 배치하세요. +ff.coalpower = 발전기에 :coal: 석탄을 넣어 [accent]:power: 전력[]을 생산하세요. +ff.coalpower.objective = :combustion-generator: 전력을 생산하세요. +ff.node = :power-node: [accent]전력 노드[]는 범위 내 주변 블록에 전력을 전송합니다.\n:power-node: [accent]전력 노드[]를 발전기 근처에 설치하세요. +ff.battery = :battery: [accent]배터리[]는 전력을 저장합니다.\n:battery: [accent]배터리[]를 연구하고 노드 근처에 배치하세요. +ff.arc = :arc: [accent]아크[] 포탑은 작동하려면 전력이 필요합니다. :arc: [accent]아크[] 포탑을 연구하고 전력 노드 근처에 설치하세요. fungalpass.tutorial1 = 건물을 방어하고 적을 공격하려면 [accent]유닛[]을 사용해야 합니다.\n:ground-factory: [accent]지상 공장[]을 연구하고 배치하세요. fungalpass.tutorial2 = 공장에서 :dagger: [accent]대거[] 유닛을 선택하고.\n유닛을 총 3기 생산하세요. -frontier.tutorial1 = :additive-reconstructor: [accent]애디티브 재구성기[]\n는 :silicon: 실리콘과 :graphite: 흑연을 사용하여 1티어 유닛을 2티어로 업그레이드합니다.\n\n[accent]연구하고[] :dagger: [accent]대거를 재구성하여[]:mace: [accent]메이스를 만드세요.[] +frontier.tutorial1 = :additive-reconstructor: [accent]애디티브 재구성기[]\n는 :silicon: 실리콘과 :graphite: 흑연을 사용하여 1티어 유닛을 2티어로 업그레이드합니다.\n\n해당 건물을 [accent]연구하고[] :dagger: [accent]대거를 재구성하여[]:mace: [accent]메이스를 만드세요.[] frontier.tutorial2 = 적의 공격은 모든 적 코어가 [unlaunched]파괴[]될 때까지 [accent]무한히 계속[]됩니다. frontier.tutorial3 = [accent]단계가 너무 높아지기 전에 적 기지를 빠르게 파괴하세요[]. @@ -2166,15 +2202,15 @@ atolls.mega3 = 메가 유닛을 지상 유닛 [accent]위로[] 이동시켜 적 atolls.mega4 = [accent]지상 유닛을 여기에 투입하여 공격하십시오. atolls.mega5 = 메가 유닛이 적재된 유닛을 투하하도록 하려면 \ue879 [accent]화물 내려놓기[] 명령을 선택하십시오. atolls.mega6 = \ue879 화물 내려놓기 명령이 선택된 동안 유닛은 [accent]자동으로 투하됩니다[]. -atolls.mega7 = 메가 유닛은 벽이나 깊은 물 위에 있을 때는 지상 유닛을 [accent]투하하지 않습니다[]. +atolls.mega7 = 메가 유닛은 벽이나 깊은 물 위에 있을 때는 유닛을 [accent]투하하지 않습니다[]. atolls.mega8 = [accent]이곳에 해상 유닛을 투입하여 공격하십시오.[] atolls.attack1 = 1: 이 위치에 지상 유닛을 투입하여 공격을 시작하세요. atolls.attack2 = 2: 또는 해상 유닛을 이곳에 투입하여 기습 공격을 감행할 수도 있습니다. atolls.carry1 = 지상 유닛을 운반하려면 :mega:[accent]메가[] 유닛이 필요합니다. atolls.carry2 = 1: 메가 유닛에게 [accent]지상 유닛 위로 이동하라고 명령[]하세요. -atolls.carry3 = 2: 메가 유닛으로 지상 유닛을 픽업하려면 \ue87b [accent]유닛 적재[] 명령을 선택하십시오. +atolls.carry3 = 2: 메가 유닛으로 지상 유닛을 픽업하려면 \ue87b [accent]유닛 적재[] 명령을 선택하세요. atolls.carry4 = 3: 유닛을 실은 메가를 지휘하고 이동시키세요. -atolls.carry5 = 4: 메가 유닛이 지상 유닛을 투하하도록 하려면 \ue879 [accent]'화물 내려놓기'[] 명령을 선택하십시오. +atolls.carry5 = 4: 메가 유닛이 지상 유닛을 투하하도록 하려면 \ue879 [accent]'화물 내려놓기'[] 명령을 선택하세요. atolls.carry6 = 이러한 단계는 [accent]여기[]에서 검토할 수 있습니다. atolls.carry7 = 적 기지 근처에 추가 병력을 공중 투하하려면 다음 지침을 따르십시오. atolls.noairunit = 이 기지는 공중 유닛으로 파괴하기에는 너무 견고하게 요새화되어 있습니다. @@ -2305,7 +2341,7 @@ block.door-large.description = 탭하여 열거나 닫을 수 있는 벽입니 block.mender.description = 주변 블록을 주기적으로 수리합니다.\n선택적으로 실리콘을 사용하여 범위와 효율성을 향상할 수 있습니다. block.mend-projector.description = 주변의 블록을 수리합니다.\n선택적으로 위상 섬유를 사용하여 범위와 효율성을 향상할 수 있습니다. block.overdrive-projector.description = 주변 건물의 속도를 높입니다.\n선택적으로 위상 섬유를 사용하여 범위와 효율성을 향상할 수 있습니다. -block.force-projector.description = 주위에 육각형 역장을 형성하여 내부의 건물과 유닛을 공격으로부터 보호합니다. 지속해서 많은 피해를 받을 경우 과열됩니다.\n선택적으로 냉각수를 사용해서 과열 방지를, 위상 섬유를 사용해서 보호막 크기를 증가시킬 수 있습니다. +block.force-projector.description = 주위에 육각형 보호막을 형성하여 내부의 건물과 유닛을 공격으로부터 보호합니다. 지속해서 많은 피해를 받을 경우 과열됩니다.\n선택적으로 냉각수를 사용해서 과열 방지를, 위상 섬유를 사용해서 보호막 크기를 증가시킬 수 있습니다. block.shock-mine.description = 접촉한 적 유닛에게 전격 아크를 방출합니다. block.conveyor.description = 자원을 앞으로 운반합니다. 회전하여 방향을 바꿀 수 있습니다. block.titanium-conveyor.description = 자원을 앞으로 운반합니다. 컨베이어보다 더 빠릅니다. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = 주변의 모든 유닛을 수리합니다 block.radar.description = 넓은 반경의 지형과 적 유닛을 서서히 파악합니다. 전력이 필요합니다. block.shockwave-tower.description = 반경 내 적의 발사체에 피해를 입히고 파괴합니다. 시아노겐이 필요합니다. block.canvas.description = 미리 정의된 팔레트를 사용하여 단순 이미지를 표시합니다. 편집 가능. +block.large-canvas.description = 미리 정의된 팔레트를 사용하여 단순 이미지를 표시합니다. 편집 가능. unit.dagger.description = 주변의 모든 적을 향해 일반적인 탄환을 발사합니다. unit.mace.description = 주변의 모든 적을 향해 화염 줄기를 발사합니다. @@ -2516,7 +2553,7 @@ unit.scepter.description = 주변의 모든 적을 향해 장전된 탄환을 unit.reign.description = 주변의 모든 적을 향해 거대한 관통 탄환을 일제히 발사합니다. unit.nova.description = 적에게 피해를 주고, 아군 구조물을 수리하는 레이저 볼트를 발사합니다. 이륙할 수 있습니다. unit.pulsar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 전격을 발사합니다. 이륙할 수 있습니다. -unit.quasar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 관통 레이저 빔을 발사합니다. 이륙할 수 있습니다. 역장을 가지고 있습니다. +unit.quasar.description = 적에게 피해를 주고, 아군 구조물을 수리하는 관통 레이저 빔을 발사합니다. 이륙할 수 있습니다. 보호막을 가지고 있습니다. unit.vela.description = 적에게 피해를 주고, 아군 구조물을 수리하는 거대한 지속적인 레이저 빔을 발사합니다. 이륙할 수 있습니다. unit.corvus.description = 적에게 피해를 주고, 아군 구조물을 수리하는 거대한 레이저 블레스트를 발사합니다. 대부분의 지형 위를 밟을 수 있습니다. unit.crawler.description = 적을 향해 달려가 자폭하며, 큰 폭발을 일으킵니다. @@ -2533,7 +2570,7 @@ unit.mono.description = 자동으로 구리와 납을 채굴하여 코어에 넣 unit.poly.description = 자동으로 부서진 구조물을 재건하거나 다른 유닛의 건설을 보조합니다. unit.mega.description = 자동으로 손상된 구조물을 수리합니다. 블록이나 작은 지상 유닛을 수송할 수 있습니다. unit.quad.description = 지상 목표물에 아군 구조물을 수리하고 적에게 피해를 입히는 큰 폭탄을 투하합니다. 중간 크기의 지상 유닛을 수송할 수 있습니다. -unit.oct.description = 재생하는 역장으로 주변 아군을 보호합니다. 대부분의 지상 유닛을 수송할 수 있습니다. +unit.oct.description = 재생하는 보호막으로 주변 아군을 보호합니다. 대부분의 지상 유닛을 수송할 수 있습니다. unit.risso.description = 주변의 모든 적을 향해 탄환과 미사일을 일제히 발사합니다. unit.minke.description = 주변의 지상 적을 향해 일반적인 탄환과 포탄을 발사합니다. unit.bryde.description = 적을 향해 장거리 포탄과 미사일을 발사합니다. @@ -2551,9 +2588,9 @@ unit.navanax.description = 적 전력망에 상당한 피해를 주고 아군 #Erekir unit.stell.description = 적 대상에게 일반적인 탄환을 발사합니다. unit.locus.description = 적 대상에게 번갈아 나오는 탄환을 발사합니다. -unit.precept.description = 적 대상에게 관통하는 집속탄환을 발사합니다. -unit.vanquish.description = 적 대상에게 관통하는 거대한 분열탄환을 발사합니다. -unit.conquer.description = 적 대상에게 관통하는 거대한 탄환의 폭포를 발사합니다. +unit.precept.description = 적 대상에게 관통하는 집속탄환을 발사합니다. 액체 항력의 영향을 덜 받습니다. +unit.vanquish.description = 적 대상에게 관통하는 거대한 분열탄환을 발사합니다. 액체 항력의 영향을 덜 받습니다. +unit.conquer.description = 적 대상에게 관통하는 거대한 탄환의 폭포를 발사합니다. 액체 항력의 영향을 상당히 덜 받습니다. unit.merui.description = 지상 적 대상에게 장사정포를 발사합니다. 대부분의 지형을 뛰어넘을 수 있습니다. unit.cleroi.description = 적 대상에게 이중 포탄을 발사합니다. 집중 방어 포탑으로 적의 발사체를 요격합니다. 대부분의 지형을 뛰어넘을 수 있습니다. unit.anthicus.description = 적 대상에게 장거리 유도 발사체를 발사합니다. 대부분의 지형을 뛰어넘을 수 있습니다. @@ -2562,11 +2599,11 @@ unit.collaris.description = 적 대상에게 장거리 분열포탄을 발사합 unit.elude.description = 적 대상에게 한 쌍의 유도 탄환을 발사합니다. 액체 위에 떠 있을 수 있습니다. unit.avert.description = 적 대상에게 비틀리는 한 쌍의 탄환을 발사합니다. unit.obviate.description = 적 대상에게 비틀리는 한 쌍의 전기 구체를 발사합니다. -unit.quell.description = 적 대상에게 장거리 유도 발사체를 발사합니다. 적 구조물 수리 블록을 억제합니다. -unit.disrupt.description = 적 대상에게 장거리 유도 억제 발사체를 발사합니다. 적 구조물 수리 블록을 억제합니다. -unit.evoke.description = 코어: 요새를 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. -unit.incite.description = 코어: 성채를 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. -unit.emanate.description = 코어: 도심을 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. +unit.quell.description = 적 대상에게 장거리 유도 발사체를 발사합니다. 적 구조물 수리 블록을 억제합니다. 지상 목표물만 공격할 수 있습니다. +unit.disrupt.description = 적 대상에게 장거리 유도 억제 발사체를 발사합니다. 적 구조물 수리 블록을 억제합니다. 지상 목표물만 공격할 수 있습니다. +unit.evoke.description = 코어: 요새를 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. 2x2 구조물을 운반할 수 있습니다. +unit.incite.description = 코어: 성채를 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. 2x2 구조물을 운반할 수 있습니다. +unit.emanate.description = 코어: 도심을 지켜내기 위해 구조물을 건설합니다. 빔으로 구조물을 수리합니다. 2x2 구조물을 운반할 수 있습니다. lst.read = 연결된 메모리 셀에서 숫자를 읽습니다. lst.write = 연결된 메모리 셀에 숫자를 작성합니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 910e7d36b5..fc70406077 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -15,6 +15,7 @@ link.wiki.description = Oficialus Mindustry wiki link.suggestions.description = Pasiūlykite naujas funkcijas link.bug.description = Radot vieną? Praneškite čia linkopen = Šis serveris atsiuntė jums nuorodą. Ar jūs norite atidaryti ją?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Nepavyko atidaryti nuorodos!\nURL nukopijuotas į jūsų iškarpinę. screenshot = Ekrano kopija išsaugota į {0} screenshot.invalid = Žemėlapis yra per didelis, potencialiai nepakanka vietos išsaugoti ekrano kopiją. @@ -124,6 +125,8 @@ maps.none = [lightgray]Nerasta žemėlapių! invalid = Klaidingas pickcolor = Pasirinkti spalvą color = Color +import = Import +export = Export preparingconfig = Ruošiamos konfiguracijos preparingcontent = Ruošiamas turinys uploadingcontent = Talpinamas turinys @@ -212,6 +215,8 @@ campaign.none = [lightgray]Pasirinkite planetą ant kurios pradėti.\nTai gali b campaign.erekir = Naujesnis, patobulintas turinys. Daugiausia linijinė kampanijos eiga.\n\nAukštesnės kokybės žemėlapiai ir bendra patirtis. campaign.serpulo = Senesnis turinys; klasikinė versija. Atviresnis.\n\nPotencialiai nebalancuoti žemelapiai ir kampanijos mechanika. Mažiau tobulinta. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Išrasta techtree = Technologijų Medis techtree.select = Technologijų Medį parinkti @@ -359,6 +364,7 @@ confirm = Priimti delete = Šalinti view.workshop = Apžiūrėti Workshop'e workshop.listing = Edit Workshop Listing +hide = Hide ok = Gerai open = Atidaryti customize = Keisti Taisykles @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Atidaryti Nuorodą @@ -428,6 +435,7 @@ saveimage = Išsaugoti vaizdą unknown = Nežinomas custom = Pasirinktinis builtin = Integruotas +modded = Modded map.delete.confirm = Ar esate tikras, jog norite išpašalinti šį žemėlapį? Šis veiksmas negali būti atstatytas map.random = [accent]Atsitiktinis žemėlapis map.nospawn = Šiame žemėlapyje nėra jokio branduolio atsirasti žaidėjui! Įdėkite {0} branduolį į žemėlapį redaktoriuje. @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Dirbtuvė @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Pastiprinimo Efektas stat.maxunits = Maks. Aktyvių Vienetų Kiekis stat.health = Gyvybės stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Statymo Laikas stat.maxconsecutive = Max Consecutive stat.buildcost = Statymo Kaina @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] zonos žalos ~[stat] {1}[lightgray] b bullet.incendiary = [stat]uždegantis bullet.homing = [stat]sekimas bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Vandens Animacija setting.animatedshields.name = Skydų Animacija setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Priešų/Sąjungininkų Indikatorius setting.autotarget.name = Automatinis Taikymas setting.keyboard.name = Pelės+Klaviatūros Valdymas @@ -1269,6 +1292,8 @@ setting.fpscap.none = Nėra setting.fpscap.text = {0} FPS setting.uiscale.name = UI mastelio keitimas[lightgray] (reikalingas perkrovimas)[] setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Visada Įstrižinis Padėjimas setting.screenshake.name = Ekrano Drebėjimas setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Išsaugojimo Intervalas setting.seconds = {0} sekundžių setting.milliseconds = {0} milisekundžių setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Langas Be Pakrasčių[lightgray] (gali reikėti perkrauti) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Rodyti FPS ir Ping setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Aplinkos Garsas setting.mutemusic.name = Nutildyti Muziką setting.sfxvol.name = SFX Garsumas setting.mutesound.name = Nutildyti Garsus -setting.crashreport.name = Siųsti Anoniminius Strigties Pranešimus setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatiškai Kurti Išsaugojimus setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Žaidimas Tinkle category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Išvalyti Statybas @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Neriboti Kompiuterio (Raudonosios Komandos) Resursai rules.blockhealthmultiplier = Blokų Gyvybių Daugiklis rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Vienetų Gamybos Greičio Daugiklis rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Vienetų Gyvybių Daugiklis @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index b1972e0451..ce7d1c018a 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -15,6 +15,7 @@ link.wiki.description = Offici�le Mindustry wiki link.suggestions.description = Stel iets voor link.bug.description = ��n gevonden? Rapporteer het hier. linkopen = Deze server heeft je een link gestuurd. Weet je zeker dat je hem wilt openen?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Kon link niet openen!\nDe URL is gekopieerd naar je klembord screenshot = Schermafbeeling opgeslagen in {0} screenshot.invalid = Map is te groot, er is mogelijk niet genoeg geheugen beschikbaar voor een schermafbeelding. @@ -124,6 +125,8 @@ maps.none = [lightgray]Geen Kaarten gevonden! invalid = Ongeldig pickcolor = Kies kleur color = Color +import = Import +export = Export preparingconfig = Configuratie voorbereiden preparingcontent = Inhoud voorbereiden uploadingcontent = Inhoud aan het uploaden @@ -212,6 +215,8 @@ campaign.none = [lightgray]Kies een planeet om op te starten.\nJe kan op elk mom campaign.erekir = Nieuwere, meer gepolijste inhoud. Grotendeels lineair veldtochtverloop.\n\nKaarten en algemene ervaring van hogere kwaliteit. campaign.serpulo = Oudere inhoud; de klassieke ervaring. Meer open veldtochtverloop.\n\nKans op ongebalanceerde kaarten en veldtocht mechanismen. Minder gepolijst. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Voltooid techtree = Techniekboom techtree.select = Techniekboom selectie @@ -359,6 +364,7 @@ confirm = Bevestig delete = Verwijder view.workshop = Bekijk in Werkplaats workshop.listing = Bewerk Workshop vermelding +hide = Hide ok = Oke open = Open customize = Aanpassen @@ -370,7 +376,6 @@ command.repair = Repareer command.rebuild = Herbouw command.assist = Assist Speler command.move = Beweeg -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Open Link @@ -428,6 +435,7 @@ saveimage = Bewaar afbeelding unknown = Onbekend custom = Aangepast builtin = Ingebouwd +modded = Modded map.delete.confirm = Weet je zeker dat je deze map wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt! map.random = [accent]Willekeurige map map.nospawn = Deze map heeft geen cores voor de spelers om in te spawnen! Voeg een {0} core toe aan de map via de editor. @@ -488,10 +496,14 @@ editor.center = Centraaliseer editor.search = Zoek kaarten... editor.filters = Filter Kaarten editor.filters.mode = Spelmodi: +editor.filters.priorities = Priorities: editor.filters.type = Kaart Type: editor.filters.search = Zoek In: editor.filters.author = Auteur editor.filters.description = Beschrijving +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Werkplaats @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Verberg Alle waves.units.show = Toon Alle +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = telt @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Vernietig: [][lightgray]{0}[]x Eenheden objective.enemiesapproaching = [accent]Vijanden naderen in [lightgray]{0}[] objective.enemyescelating = [accent]Vijandelijke productie stijgt in [lightgray]{0}[] objective.enemyairunits = [accent]De productie van vijandelijke luchtmachteenheden begint in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Vernietig Vijandelijke Core objective.command = [accent]Commandeer Eenheden objective.nuclearlaunch = [accent]? Nucleaire lancering gedetecteerd: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Kan niet van sector wisselen sector.noswitch = Je mag niet van sector wisselen terwijl een bestaande sector wordt aangevallen.\n\nSector: [accent]{0}[] op [accent]{1}[] sector.view = Bekijk Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Laag threat.medium = Gemiddeld @@ -843,6 +858,10 @@ threat.high = Hoog threat.extreme = Extreem threat.eradication = Uitroeiing +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Zon sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = De optimale locatie om nog een keer te beginnen. Lage vijandelijke dreiging. Enkele grondstoffen.\nVerzamel zoveel mogelijk lood en koper.\nGa door. sector.frozenForest.description = Zelfs hier, dichter bij de bergen, hebben de schimmels zich verspreid. De koude temperaturen kunnen ze niet eeuwig tegenhouden.\n\nBegin de onderneming in energie. Bouw verbrandingsgeneratoren. Leer herstellers te gebruiken. sector.saltFlats.description = Aan de rand van de woestijn liggen de Zoutvlaktes. Weinig grondstoffen zijn te vinden op deze locatie.\n\nDe vijand heeft hier een opslagplaats voor grondstoffen gebouwd. Roei hun core uit. Laat niets overeind staan. -sector.craters.description = Water heeft zich opgehoopt in deze krater, restant van de oude oorlogen. Herwin het gebied. Verzamel zand. Smelt glasvezel. Pomp water om geschuttorens en boormachines te koelen. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Voorbij het puin is de kustlijn. Ooit stond hier een kustbeschermingsinstallatie. Er is niet veel van overgebleven. Alleen de meest eenvoudige verdedigingswerken zijn onbeschadigd gebleven, al het andere tot schroot gereduceerd.\nGa door met de uitbreiding naar buiten. Herontdek de technologie. sector.stainedMountains.description = Verder landinwaarts liggen de bergen, nog niet aangetast door schimmels.\nWin het overvloedige titanium in dit gebied. Leer het te gebruiken.\n\nDe vijandelijke aanwezigheid is hier groter. Geef ze geen tijd om hun sterkste eenheden te sturen. sector.overgrowth.description = Dit gebied is overgroeid, dichter bij de bron van de schimmels.\nDe vijand heeft hier een voorpost gevestigd. Bouw mace-eenheden. Vernietig het. Herover wat verloren was gegaan. @@ -1045,6 +1065,7 @@ stat.boosteffect = Boost-effect stat.maxunits = Maximaal Actieve Units stat.health = Levenspunten stat.armor = Pantser +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Bouwtijd stat.maxconsecutive = Max Opeenvolgend stat.buildcost = Bouwkosten @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] gebied scade ~[stat] {1}[lightgray] t bullet.incendiary = [stat]brandstichtend bullet.homing = [stat]doelzoekend bullet.armorpierce = [stat]pantserdoorborend -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Mods uitschakelen bij crash opstarten setting.animatedwater.name = Animeer Water setting.animatedshields.name = Animeer Schilden setting.playerindicators.name = Spelersindicatoren +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Toon Bondgenoten setting.autotarget.name = Automatisch Richten setting.keyboard.name = Muis+Toetsenbord Controls @@ -1269,6 +1292,8 @@ setting.fpscap.none = Geen setting.fpscap.text = {0} FPS setting.uiscale.name = UI Schaal[lightgray] (herstart vereist)[] setting.uiscale.description = Herstart vereist om veranderingen door te voeren. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Altijd Diagonaal Plaatsen setting.screenshake.name = Schuddend Scherm setting.bloomintensity.name = Bloom Intensiteit @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Autosave Interval setting.seconds = {0} seconden setting.milliseconds = {0} millisecondes setting.fullscreen.name = Volledig Scherm -setting.borderlesswindow.name = Grenzeloos Venster[lightgray] (wellicht herstart vereist) -setting.borderlesswindow.name.windows = Grenzeloos Venster -setting.borderlesswindow.description = Een herstart kan vereist zijn om de wijzigingen door te voeren. setting.fps.name = Toon FPS setting.console.name = Console Inschakelen setting.smoothcamera.name = Vloeiende Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Achtergrond Volume setting.mutemusic.name = Demp Muziek setting.sfxvol.name = SFX Volume setting.mutesound.name = Demp Geluid -setting.crashreport.name = Stuur Anonieme Crashmeldingen setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Bewaar Saves Automatisch setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Selecteer Blok placement.blockselectkeys = \n[lightgray]Toets: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Bediening Eenheid keybind.clear_building.name = Stop met bouwen @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Oneindige AI Materialen rules.blockhealthmultiplier = Blok Levenspunten Vermenigvuldiger rules.blockdamagemultiplier = Blokschade Vermenigvuldiger +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Eenheid Spawnsnelheid Vermenigvuldiger rules.unitcostmultiplier = Eenheidskosten Vermenigvuldiger rules.unithealthmultiplier = Eenheid Levenspunten Vermenigvuldiger @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Vuur rules.anyenv = rules.explosions = Blok/Eenheid Explosieschade @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index b33c29d694..1269826ac6 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -15,6 +15,7 @@ link.wiki.description = Officiële Mindustry-wiki link.suggestions.description = Suggest new features link.bug.description = Found one? Report it here linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Openen van link mislukt!\nDe link is gekopiëerd naar je klembord. screenshot = Locatie screenshot: {0} screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een screenshot te kunnen maken. @@ -124,6 +125,8 @@ maps.none = [lightgray]Geen kaarten gevonden! invalid = Ongeldig pickcolor = Pick Color color = Color +import = Import +export = Export preparingconfig = Configuratie Voorbereiden preparingcontent = Inhoud Voorbereiden uploadingcontent = Inhoud Uploaden @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Voltooid techtree = Technische vooruitgang techtree.select = Tech Tree Selection @@ -359,6 +364,7 @@ confirm = Bevestig delete = Verwijder view.workshop = Bekijk In Workshop workshop.listing = Bewerk Workshop-Publicatie +hide = Hide ok = OK open = Open customize = Pas aan @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Open Link @@ -428,6 +435,7 @@ saveimage = Sla Afbeelding Op unknown = Onbekend custom = Aangepast builtin = Ingebouwd +modded = Modded map.delete.confirm = Weet je zeker dat je deze kaart wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden! map.random = [accent]Willekeurige Map map.nospawn = Deze map heeft geen cores voor spelers om te spawnen! Voeg een {0} core toe in de mapbewerker. @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Boost Effect stat.maxunits = Max Active Units stat.health = Health stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Build Time stat.maxconsecutive = Max Consecutive stat.buildcost = Build Cost @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Enemy/Ally Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls @@ -1269,6 +1292,8 @@ setting.fpscap.none = None setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling[lightgray] (requires restart)[] setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Always Diagonal Placement setting.screenshake.name = Screen Shake setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Autosave Interval setting.seconds = {0} Seconds setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen -setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Show FPS setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Mute Music setting.sfxvol.name = SFX Volume setting.mutesound.name = Mute Sound -setting.crashreport.name = Send Anonymous Crash Reports setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Clear Building @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 386216f1ce..a75f366205 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -15,6 +15,7 @@ link.wiki.description = Oficjalna Wiki Mindustry link.suggestions.description = Zaproponuj nowe funkcje link.bug.description = Znalazłeś błąd? Zgłoś go tutaj linkopen = Serwer wysłał ci link. Czy jesteś pewnien, że chcesz go otworzyć?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. screenshot = Zapisano zrzut ekranu w {0} screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia. @@ -79,7 +80,7 @@ schematic.addtag = Dodaj Znacznik schematic.texttag = Tekst Znacznika schematic.icontag = Ikona Znacznika schematic.renametag = Zmień Nazwę Znacznika -schematic.tagged = {0} Otagowany +schematic.tagged = {0} Oznaczony schematic.tagdelconfirm = Czy kompletnie usunąć znacznik? schematic.tagexists = Taki znacznik już istnieje. @@ -101,8 +102,8 @@ coreattack = < Rdzeń jest atakowany! > nearpoint = [[ [scarlet]NATYCHMIAST OPUŚĆ PUNKT ZRZUTU[] ]\nnadciąga zniszczenie database = Centralna baza danych database.button = Baza Danych -database.patched = Modified by data patches. -viewfields = View Content Fields +database.patched = Zmodyfikowano stosując łatki. +viewfields = Pokaż zawartość savegame = Zapisz Grę loadgame = Wczytaj Grę joingame = Dołącz Do Gry @@ -123,7 +124,9 @@ continue = Kontynuuj maps.none = [lightgray]Nie znaleziono żadnych map! invalid = Nieprawidłowy pickcolor = Wybierz kolor -color = Color +color = Kolor +import = Import +export = Export preparingconfig = Przygotowywanie Konfiguracji preparingcontent = Przygotowywanie Zawartości uploadingcontent = Przesyłanie Zawartości @@ -148,7 +151,7 @@ mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony mod.multiplayer.compatible = [gray]Kompatybilny z trybem wieloosobowym mod.disable = Wyłącz -mod.version = Version: +mod.version = Wersja: mod.content = Zawartość: mod.delete.error = Nie udało się usunąć modyfikacji. Plik może być w użyciu. @@ -212,6 +215,8 @@ campaign.none = [lightgray]Wybierz planetę, na której chcesz zacząć.\nMożes campaign.erekir = Nowsza, bardziej dopracowana zawartość. Kampania postępuje bardziej liniowo.\n\nWyższej jakości mapy oraz rozgrywka. campaign.serpulo = Starsza zawartość; klasyczne doświadczenia. Bardziej otwarta.\n\nPotencjalnie niezbalansowane mapy i mechaniki. Słabiej dopracowana. campaign.difficulty = Tryb gry +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Ukończony techtree = Drzewo Techno-\nlogiczne techtree.select = Wybór Drzewa Technologicznego @@ -269,7 +274,7 @@ servers.showhidden = Pokaż Ukryte Serwery server.shown = Pokazane server.hidden = Ukryte -viewplayer = Viewing Player: [accent]{0} +viewplayer = Obserwowany gracz: [accent]{0} trace = Zlokalizuj Gracza trace.playername = Nazwa gracza: [accent]{0} trace.ip = IP: [accent]{0} @@ -314,14 +319,14 @@ disconnect.error = Błąd połączenia. disconnect.closed = Połączenie zostało zamknięte. disconnect.timeout = Przekroczono limit czasu. disconnect.data = Nie udało się załadować mapy! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.snapshottimeout = Przekroczono limit czasu podczas otrzymywania pakietów UDP.\nPowodem może być niestabilna sieć lub połączenie. cantconnect = Nie można dołączyć do gry ([accent]{0}[]). connecting = [accent]Łączenie... reconnecting = [accent]Ponowne łączenie... connecting.data = [accent]Ładowanie danych świata... server.port = Port: server.invalidport = Nieprawidłowy numer portu. -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! +server.error.addressinuse = [scarlet]Nie udało się uruchomić serwera na porcie 6567.[]\n\nUpewnij się, że żaden inny serwer Mindustry nie jest już uruchomiony na twoim urządzeniu lub w lokalnej sieci! server.error = [crimson]Błąd hostowania serwera: [accent]{0} save.new = Nowy zapis save.overwrite = Czy na pewno chcesz nadpisać zapis gry? @@ -340,7 +345,7 @@ save.newslot = Zapisz nazwę: save.rename = Zmień nazwę save.rename.text = Nowa nazwa: selectslot = Wybierz zapis. -slot = [accent]Slot {0} +slot = [accent]Zapis {0} editmessage = Edytuj wiadomość save.corrupted = Zapis gry jest uszkodzony lub nieprawidłowy! empty = @@ -353,12 +358,13 @@ save.wave = Fala {0} save.mode = Tryb gry: {0} save.date = Ostatnio zapisane: {0} save.playtime = Czas gry: {0} -dontshowagain = Don't show again +dontshowagain = Nie pokazuj ponownie warning = Uwaga. confirm = Potwierdź delete = Usuń view.workshop = Pokaż w Warsztacie workshop.listing = Edytuj pozycję w Warsztacie +hide = Hide ok = OK open = Otwórz customize = Dostosuj zasady @@ -370,8 +376,7 @@ command.repair = Naprawiaj command.rebuild = Odbudowywuj command.assist = Asystuj Graczowi command.move = Przemieść -command.boost = Przyspiesz -command.enterPayload = Wprowadź blok ładunku +command.enterPayload = Wprowadź w tryb dokowania command.loadUnits = Załaduj Jednostki command.loadBlocks = Załaduj Bloki command.unloadPayload = Rozładuj Ładunek @@ -381,9 +386,11 @@ stance.shoot = Strzelaj stance.holdfire = Wstrzymaj Ogień stance.pursuetarget = Goń Cel stance.patrol = Patroluj Obszar +stance.holdposition = Stance: Utrzymaj pozycje stance.ram = Taranuj\n[lightgray]Ruch w prostej linii bez znajdowania drogi -stance.mineauto = Automatic Mining -stance.mine = Mine Item: {0} +stance.boost = Przyspiesz +stance.mineauto = Automatyczne wydobycie +stance.mine = Wydobądź: {0} openlink = Otwórz Link copylink = Kopiuj Link back = Wróć @@ -428,10 +435,11 @@ saveimage = Zapisz Obraz unknown = Nieznane custom = Własne builtin = Wbudowane +modded = Zmodyfikowano map.delete.confirm = Czy jesteś pewny, że chcesz usunąć tę mapę? Nie będzie można jej przywrócić! map.random = [accent]Losowa Mapa map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj {0} rdzeń do tej mapy w edytorze. -map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj [scarlet]inny niż żółty[] rdzeń do mapy w edytorze. +map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, z którego mogliby wyjść przeciwnicy! Dodaj [scarlet]inny niż żółty[] rdzeń do mapy w edytorze. map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj {0} rdzeń do mapy w edytorze. map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. workshop.update = Aktualizuj pozycję @@ -448,9 +456,9 @@ publish.confirm = Czy jesteś pewien, że chcesz to opublikować?\n\n[lightgray] publish.error = Błąd podczas publikowania pozycji: {0} steam.error = Nie udało się zainicjować serwisów Steam.\nBłąd: {0} -editor.showblocks = Show Blocks -editor.showterrain = Show Terrain -editor.showfloor = Show Floor +editor.showblocks = Pokaż Bloki +editor.showterrain = Pokaż Teren +editor.showfloor = Pokaż Podłoże editor.planet = Planeta: editor.sector = Sektor: editor.seed = Ziarno: @@ -467,19 +475,19 @@ editor.rules = Zasady: editor.generation = Generacja: editor.objectives = Cele editor.locales = Pakiety regionalne -editor.patches.guide = Patch Guide -editor.patches = Content Patches -editor.patch = Patchset: {0} -editor.patches.none = [lightgray]No patchsets loaded. -editor.patches.errors = Patchset Errors -editor.patches.importerror = Failed to import patchset -editor.patches.delete.confirm = Are you sure you want to delete this patchset? -editor.patch.fields = {0} fields -editor.worldprocessors = World Processors +editor.patches.guide = Poradnik łatek +editor.patches = Łatki zawartości +editor.patch = Zestaw łatek: {0} +editor.patches.none = [lightgray]Nie załadowano zestawu łatek. +editor.patches.errors = Błędy zestawu łatek +editor.patches.importerror = Nie udało się zaimportować zestawu łatek +editor.patches.delete.confirm = Czy na pewno chcesz usunąć ten zestaw łatek? +editor.patch.fields = {0} pola +editor.worldprocessors = Procesory światowe editor.worldprocessors.editname = Edytuj nazwę -editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. -editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? -editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. +editor.worldprocessors.none = [lightgray]Nie znaleziono bloków procesorów światowych\nDodaj procesor w edytorze mapy lub \ue813 Dodaj przyciskiem poniżej. +editor.worldprocessors.nospace = Brak dostępnego miejsca, aby umieścić procesor! Czyżby mapa była zapełniona? Czemóż to ktoś zrobił coś takiego?! +editor.worldprocessors.delete.confirm = Czy na pewno chcesz usunąć ten procesor?\n\nJeśli jest on otoczony ścianami, zostanie zastąpiony ścianą z bieżącego środowiska. editor.ingame = Edytuj w Grze editor.playtest = Testuj Mapę editor.publish.workshop = Opublikuj w Warsztacie @@ -488,15 +496,19 @@ editor.center = Wyśrodkuj editor.search = Przeszukaj mapy... editor.filters = Przefiltruj Mapy editor.filters.mode = Tryby Gry: +editor.filters.priorities = Priorities: editor.filters.type = Typ Mapy: editor.filters.search = Szukaj W: editor.filters.author = Autor editor.filters.description = Opis +editor.filters.modname = Nazwa modyfikacji +editor.filters.prioritizemod = Priorytet modyfikacji +editor.filters.prioritizecustom = Własny priorytet editor.shiftx = Przesunięcie X editor.shifty = Przesunięcie Y workshop = Warsztat waves.title = Fale -waves.team = Team +waves.team = Zespół waves.remove = Usuń waves.every = co waves.waves = fal(e) @@ -506,8 +518,8 @@ waves.shields = tarcze/fala waves.to = do waves.spawn = spawn: waves.spawn.all = -waves.spawn.select = Wybierz Miejsce Odrodzania -waves.spawn.none = [scarlet]Brak punktów spawnu na mapie +waves.spawn.select = Wybierz Punkt Odrodzania +waves.spawn.none = [scarlet]Brak Punktów Odradzania na mapie waves.max = maks. jednostek waves.guardian = Strażnik waves.preview = Podgląd @@ -527,20 +539,21 @@ waves.search = Wyszukaj Fale... waves.filter = Filtr jednostek waves.units.hide = Schowaj Wszystkie waves.units.show = Pokaż Wszystkie +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = liczba wavemode.totals = sumy wavemode.health = życie -all = All +all = Wszystko editor.default = [lightgray] details = Detale... edit = Edytuj... variables = Zmienne logic.clear.confirm = Czy na pewno chcesz wyczyścić cały kod z tego procesora?? -logic.restart = Restart -logic.globals = Built-in Variables +logic.restart = Rozpocznij ponownie +logic.globals = Zmienne wbudowane editor.name = Nazwa: editor.spawn = Stwórz Jednostkę @@ -553,7 +566,7 @@ editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, kt editor.errornot = To nie jest plik mapy. editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony. editor.errorname = Mapa nie zawiera nazwy. Czy próbujesz załadować zapis gry? -editor.errorlocales = Error reading invalid locale bundles. +editor.errorlocales = Błąd podczas wczytywania pakietu językowego. editor.update = Aktualizuj editor.randomize = Losuj editor.moveup = Przesuń w górę @@ -565,7 +578,7 @@ editor.sectorgenerate = Generuj Sektor editor.resize = Zmień Rozmiar editor.loadmap = Załaduj Mapę editor.savemap = Zapisz Mapę -editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? +editor.savechanges = [scarlet]Masz niezapisane zmiany!\n\n[]Czy chcesz je zapisać? editor.saved = Zapisano! editor.save.noname = Twoja mapa nie ma nazwy! Ustaw ją w 'Informacjach o mapie'. editor.save.overwrite = Ta mapa nadpisze wbudowaną mapę! Ustaw inną nazwę w 'Informacjach o mapie'. @@ -606,8 +619,8 @@ toolmode.fillteams = Wypełnij Drużyny toolmode.fillteams.description = Wypełnia drużyny zamiast bloków. toolmode.fillerase = Usuń Typ toolmode.fillerase.description = Usuwa bloki tego samego typu. -toolmode.fillcliffs = Fill Cliffs -toolmode.fillcliffs.description = Turns walls into cliffs. +toolmode.fillcliffs = Wypełnij klify +toolmode.fillcliffs.description = Zamienia ściany w klify. toolmode.drawteams = Rysuj Drużyny toolmode.drawteams.description = Rysuje drużyny zamiast bloków. #unused @@ -618,8 +631,8 @@ filters.empty = [lightgray]Brak filtrów! Dodaj jeden za pomocą przycisku poni filter.distort = Zniekształcanie filter.noise = Szum -filter.enemyspawn = Wybierz spawn przeciwnika -filter.spawnpath = Droga Do Spawnu +filter.enemyspawn = Wybierz Punkt Odradzania przeciwnika +filter.spawnpath = Droga Do Punktu Odradzania filter.corespawn = Wybierz rdzeń filter.median = Mediana filter.oremedian = Mediana Rud @@ -659,17 +672,17 @@ filter.option.percentile = Procent filter.option.code = Kod filter.option.loop = Pętla -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Czy na pewno chcesz usunąć ten pakiet lokalizacji? -locales.applytoall = Zastosuj Do Wszystkich Lokalizacji -locales.addtoother = Dodaj Do Innych Lokalizacji +locales.info = Tutaj możesz dodać pakiety językowe dla wybranych języków do twojej mapy. W pakietach językowych, każda właściwość ma swoją nazwę i przypisaną do niej wartość. Te właściwości mogą zostać wykorzystane przez Procesory Światowe i Cele poprzez użycie ich nazw. Właściwości wspierają formatowanie tekstu (wstawianie wartości w oznaczone miejsce).\n\n[cyan]Przykładowa właściwość:\n[]name: [accent]stoper[]\nvalue:[accent]Przykładowy stoper, pozostało {0} sekund[]\n\n[cyan]Zastosowanie:\n[]Ustaw tekst zadania: [accent]@stoper\n\n[]Wyświetl w Procesorze Światowym:\n[accent]localeprint "stoper"\nformat time\n[gray](gdzie time jest osobnie liczoną zmienną) +locales.deletelocale = Czy na pewno chcesz usunąć ten pakiet językowy? +locales.applytoall = Zastosuj Do Wszystkich Pakietów Językowych +locales.addtoother = Dodaj Do Innych Pakietów Językowych locales.rollback = Cofnij do ostatnio zastosowanego locales.filter = Filtr właściwości locales.searchname = Szukaj nazwy... locales.searchvalue = Szukaj wartości... -locales.searchlocale = Szukaj lokalizacji... +locales.searchlocale = Szukaj pakietu językowego... locales.byname = Po nazwie -locales.byvalue = Po wartośći +locales.byvalue = Po wartości locales.showcorrect = Pokaż właściwości, które są obecne we wszystkich lokalizacjach i wszędzie mają unikalne wartości locales.showmissing = Pokaż właściwości, których brakuje w niektórych lokalizacjach locales.showsame = Pokaż właściwości, które mają te same wartości w różnych lokalizacjach @@ -731,7 +744,7 @@ marker.point.name = Punkt marker.shape.name = Figura marker.text.name = Tekst marker.line.name = Line -marker.quad.name = Quad +marker.quad.name = Czworokąt marker.texture.name = Tekstura marker.background = Tło @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Zniszczono: [][lightgray]{0}[]x Jednostek objective.enemiesapproaching = [accent]Wrogowie zbliżą się za [lightgray]{0}[] objective.enemyescelating = [accent]Produkcja wrogich jednostek za [lightgray]{0}[] objective.enemyairunits = [accent]Produkcja latających wrogich jednostek za [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Zniszcz Rdzeń Przeciwnika objective.command = [accent]Dowódź Jednostkami objective.nuclearlaunch = [accent]⚠ Wykryto wystrzał nuklearny: [lightgray]{0} @@ -759,18 +773,18 @@ loadout = Ładunek resources = Zasoby resources.max = Maks. bannedblocks = Zabronione bloki -unbannedblocks = Unbanned Blocks +unbannedblocks = Dozwolone bloki objectives = Cele bannedunits = Zabronione jednostki -unbannedunits = Unbanned Units -bannedunits.whitelist = Zablokowane jednostki jako biała lista -bannedblocks.whitelist = Zablokowane bloki jako biała lista +unbannedunits = Dozwolone jednostki +bannedunits.whitelist = Zabronione jednostki jako biała lista +bannedblocks.whitelist = Zabronione bloki jako biała lista addall = Dodaj wszystkie launch.from = Wystrzelony z: [accent]{0} launch.capacity = Wystrzelona Ilość Przedmiotów: [accent]{0} launch.destination = Cel: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +landing.sources = Zektory źródłowe: [accent]{0}[] +landing.import = Import łącznie: {0}[accent]{1}[lightgray]/min configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. add = Dodaj... guardian = Zdrowie Strażnika @@ -785,7 +799,7 @@ error.mapnotfound = Plik mapy nie został znaleziony! error.io = Błąd sieciowy I/O. error.any = Nieznany błąd sieci. error.bloom = Nie udało się załadować funkcji bloom.\nTwoje urządzenie może nie wspierać tej funkcji. -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. +error.moddex = Mindustry nie może załadować modyfikacji. Twoje urządzenie blokuje importowanie Javowych modyfikacji ze względu na ostatnie zmiany w Androidzie.\nNiestety obecnie nie ma sposobu na obejście tego problemu. weather.rain.name = Deszcz weather.snowing.name = Śnieg @@ -799,7 +813,7 @@ campaign.complete = [accent]Gratulacje.\n\nWróg na sektorze {0} został pokonan sectorlist = Sektory sectorlist.attacked = {0} atakowanych sectors.unexplored = [lightgray]Niezbadane -sectors.attempts = Attempts: +sectors.attempts = Podejścia: sectors.resources = Zasoby: sectors.production = Produkcja: sectors.export = Eksport: @@ -810,12 +824,12 @@ sectors.wave = Fala: sectors.stored = Zmagazynowane: sectors.resume = Kontynuuj sectors.launch = Wystrzel -sectors.nolaunchcandidate = No Launch Sector -sectors.viewsubmission = \ue80d View Submissions +sectors.nolaunchcandidate = Brak sektoru do wystrzału +sectors.viewsubmission = \ue80d Pokaż Zgłoszenia sectors.select = Wybierz -sectors.launchselect = Select Launch Destination +sectors.launchselect = Wybierz Cel Wystrzału sectors.nonelaunch = [lightgray]Żaden (Słońce) -sectors.redirect = Redirect Launch Pads +sectors.redirect = Przekieruj Wyrzutnię sectors.rename = Zmień Nazwę Sektora sectors.enemybase = [scarlet]Baza Wroga sectors.vulnerable = [scarlet]Wrażliwy @@ -824,18 +838,19 @@ sectors.go = Idź sector.abandon = Porzuć sector.abandon.confirm = Ten sektor zostanie samo-zniszczony.\nKontynuować? sector.curcapture = Sektor Podbity -sector.lockdown = [red]:warning:[accent] Sector currently under attack\n[lightgray]production, research, export and import disabled +sector.lockdown = [red]:warning:[accent] Sektor jest atakowany\n[lightgray]produkcja, badania, eksport i import są wstrzymane. sector.curlost = Sektor Stracony sector.missingresources = [scarlet]Niewystarczające Zasoby Rdzenia sector.attacked = Sektor [accent]{0}[white] jest atakowany! sector.lost = Sektor [accent]{0}[white] został stracony! -sector.capture = Sector [accent]{0}[white]Captured! -sector.capture.current = Sector Captured! +sector.capture = Sektor [accent]{0}[white]Podbity! +sector.capture.current = Sektor Podbito! sector.changeicon = Zmień Ikonę sector.noswitch.title = Nie można zmienić sektorów sector.noswitch = Nie możesz zmieniać sektorów, gdy istniejący sektor jest atakowany.\n\nSektor: [accent]{0}[] na [accent]{1}[] sector.view = Zobacz Sektor -sector.foundationrequired = [lightgray] Core: Foundation Required +sector.foundationrequired = [lightgray] Wymagany Rdzeń: Podstawa +sector.shielded = [lightgray] Shielded threat.low = Niski threat.medium = Średni @@ -843,16 +858,20 @@ threat.high = Wysoki threat.extreme = Ekstremalny threat.eradication = Czystka -difficulty.casual = Casual -difficulty.easy = Easy -difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty -difficulty.enemyHealthMultiplier = Enemy Health: {0} -difficulty.enemySpawnMultiplier = Enemy Amount: {0} -difficulty.waveTimeMultiplier = Wave Timer: {0} -difficulty.nomodifiers = [lightgray](No modifiers) +difficulty.casual = Swobodny +difficulty.easy = Łatwy +difficulty.normal = Normalny +difficulty.hard = Trudny +difficulty.eradication = Wyniszczenie + +difficulty.enemyHealthMultiplier = Zdrowie Przeciwnika: {0} +difficulty.enemySpawnMultiplier = Ilość Przeciwników: {0} +difficulty.waveTimeMultiplier = Czas Do Następnej Fali: {0} +difficulty.nomodifiers = [lightgray](Bez modyfikatorów) planets = Planety @@ -862,7 +881,7 @@ planet.sun.name = Słońce sector.impact0078.name = Uderzenie 0078 sector.groundZero.name = Punkt Zerowy -sector.craters.name = Kratery +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Zamrożony Las sector.ruinousShores.name = Zniszczone Przybrzeża sector.stainedMountains.name = Zabarwione Góry @@ -876,27 +895,28 @@ sector.biomassFacility.name = Obiekt Syntezy Biomasy sector.windsweptIslands.name = Wyspy Wiatru sector.extractionOutpost.name = Placówka Ekstrakcji sector.facility32m.name = Facility 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons +sector.taintedWoods.name = Skażony Las +sector.infestedCanyons.name = Zainfekowany Kanion sector.planetaryTerminal.name = Planetarny Terminal Startowy sector.coastline.name = Linia Brzegowa sector.navalFortress.name = Morska Forteca -sector.polarAerodrome.name = Polar Aerodrome -sector.atolls.name = Atolls -sector.testingGrounds.name = Testing Grounds -sector.perilousHarbor.name = Perilous Harbor -sector.weatheredChannels.name = Weathered Channels -sector.fallenVessel.name = Fallen Vessel -sector.mycelialBastion.name = Mycelial Bastion -sector.frontier.name = Frontier -sector.sunkenPier.name = Sunken Pier +sector.polarAerodrome.name = Polarne Lotnisko +sector.atolls.name = Atole +sector.testingGrounds.name = Poligon Doświadczalny +sector.perilousHarbor.name = Niebezpieczna Przystań +sector.weatheredChannels.name = Zużyte Kanały +sector.fallenVessel.name = Wrak +sector.mycelialBastion.name = Zgrzybiały bastion +sector.frontier.name = Granica +sector.sunkenPier.name = Zatopione Molo +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold +sector.geothermalStronghold.name = Geotermalna Twierdza sector.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz możliwie jak najwięcej miedzi i ołowiu.\nPrzejdź do następnej strefy jak najszybciej. sector.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki się rozprzestrzeniały. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nZacznij od produkcji prądu. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. sector.saltFlats.description = Na obrzeżach pustyni są Solne Równiny. Jest tu niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdzeń. Zniszcz wszystko co stanie ci na drodze. -sector.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksplorację. Odkryj pozostawioną tu technologię. sector.stainedMountains.description = W głębi lądu leżą góry, jeszcze nieskażone przez zarodniki.\nWydobądź bogate złoża tytanu w tym obszarze. Dowiedz się, jak z niego korzystać.\n\nObecność wroga jest tutaj większa. Nie pozwól im na wysłanie ich najsilniejszych jednostek. sector.overgrowth.description = Obszar ten jest zarośnięty, bliżej źródła zarodników.\nWróg założył tu bazę. Stwórz "Noże". Odzyskaj to, co nam odebrano. @@ -1012,7 +1032,7 @@ stat.damage = Obrażenia stat.frequency = Frequency stat.targetsair = Namierza wrogów powietrznych stat.targetsground = Namierza wrogów lądowych -stat.crushdamage = Crush Damage +stat.crushdamage = Obrażenia od miażdżenia stat.legsplashdamage = Leg Splash Damage stat.itemsmoved = Prędkość poruszania się stat.launchtime = Czas pomiędzy wystrzeleniami @@ -1045,6 +1065,7 @@ stat.boosteffect = Efekt wzmocnienia stat.maxunits = Maksymalna ilość jednostek stat.health = Zdrowie stat.armor = Pancerz +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Czas budowy stat.maxconsecutive = Maksymalnie kolejnych stat.buildcost = Koszt budowy @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[ligh bullet.incendiary = [stat]zapalający bullet.homing = [stat]naprowadzający bullet.armorpierce = [stat]przebijający pancerz -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] maksymalne obrażenia bullet.suppression = [stat]{0} sec[lightgray] wyłączenie naprawy ~ [stat]{1}[lightgray] kratki @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Wyłącz mody w przypadku awarii podczas uruchami setting.animatedwater.name = Animowana woda setting.animatedshields.name = Animowana tarcza setting.playerindicators.name = Znaczniki graczy +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Znaczniki przyjaciół setting.autotarget.name = Automatyczne celowanie setting.keyboard.name = Sterowanie - Myszka+Klawiatura @@ -1269,6 +1292,8 @@ setting.fpscap.none = Nieograniczone setting.fpscap.text = {0} FPS setting.uiscale.name = Skalowanie interfejsu[lightgray] (wymaga restartu)[] setting.uiscale.description = Aby zastosować zmiany, wymagane jest ponowne uruchomienie. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Pozwala na ukośną budowę setting.screenshake.name = Siła wstrząsów ekranu setting.bloomintensity.name = Intensywaność Rozmycia @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Interwał automatycznego zapisywania setting.seconds = {0} sekund setting.milliseconds = {0} milisekund setting.fullscreen.name = Pełny ekran -setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu) -setting.borderlesswindow.name.windows = Pełny ekran bez obramowania -setting.borderlesswindow.description = Restart może być wymagany, aby zastowasować zmiany. setting.fps.name = Pokazuj FPS oraz ping setting.console.name = Włącz konsolę setting.smoothcamera.name = Płynna kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Głośność otoczenia setting.mutemusic.name = Wycisz muzykę setting.sfxvol.name = Głośność dźwięków setting.mutesound.name = Wycisz dźwięki -setting.crashreport.name = Wysyłaj anonimowo dane o crashu gry setting.communityservers.name = Pobierz listę serwerów społecznościowych setting.savecreate.name = Automatyczne tworzenie zapisów setting.steampublichost.name = Widoczność gry publicznej @@ -1334,6 +1355,8 @@ category.command.name = Zarządzanie Jednostką category.multiplayer.name = Wielu graczy category.blocks.name = Wybierz Blok placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Odrodzenie keybind.control.name = Kontroluj jednostkę keybind.clear_building.name = Wyczyść budynek @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Wstrzymaj ogień keybind.unit_stance_pursue_target.name = Goń Cel keybind.unit_stance_patrol.name = Patroluj keybind.unit_stance_ram.name = Taranuj +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Nieskończone Zasoby SI (wroga) rules.blockhealthmultiplier = Mnożnik Życia Bloków rules.blockdamagemultiplier = Mnożnik Uszkodzeń Bloków +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek rules.unitcostmultiplier = Mnożnik Kosztu Jednostek rules.unithealthmultiplier = Mnożnik Życia Jednostek @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Umożliwia korzystanie z platform startowych bez l landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Pokaż miejsca odrodzenia się wroga rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Ogień rules.anyenv = rules.explosions = Uszkodzenia Wybuchu Bloku/Jednostki @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Wzmocniony Rozdzielacz Ładunku block.payload-mass-driver.name = Katapula Ładunku block.small-deconstructor.name = Mały Dekonstruktor block.canvas.name = Płótno +block.large-canvas.name = Large Canvas block.world-processor.name = Procesor Świata block.world-cell.name = Komórka Świata block.tank-fabricator.name = Fabryka Czołgów @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Kliknij i przytrzymaj[] mały blok by go pod hint.payloadDrop = Kliknij [accent]][], by opuścić podniesiony towar. hint.payloadDrop.mobile = [accent]Kliknij i przytrzymaj[] w puste miejsce by opuścić podniesiony towar. hint.waveFire = [accent]Strumień[] wypełniony wodą będzie gasić pobiskie pożary. -hint.generator = :combustion-generator: [accent]Generatory Spalinowe[] spalają węgiel i przekazują moc do pobliskich bloków.\n\nMożesz powiększyć odległość transmitowanej mocy używając :power-node: [accent]Węzły Prądu[]. hint.guardian = Jednostki [accent]Strażnicze[] są uzbrojone. Słaba amunicja - taka jak [accent]Miedź[] czy [accent]Ołów[] [scarlet]nie jest efektywna[].\n\nUżyj lepszych działek takich jak naładowane :graphite: [accent]Grafitem[] :duo: [accent]Podwójne Działka[]/:salvo: [accent]Działa Salwowe[] by pozbyć się strażników. hint.coreUpgrade = Rdzenie mogą być ulepszone poprzez [accent]postawienie na nich rdzenia wyższej generacji[].\n\nPostaw :core-foundation: Rdzeń: [accent]Podstawę[] na :core-shard: Rdzeń: [accent]Odłamek[]. Żadna przeszkoda ani blok nie może stać na miejscu nowego rdzenia. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Wszytko co jest zbudowane w promieniu strefy zrzutu zostaje zniszczon gz.zone3 = Teraz zacznie się fala.\nPrzygotuj się. gz.finish = Wybuduj więcej działek, wykop więcej surowców\ni obroń się przed wszystkimi falami żeby [accent]przejąć sektor[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Naprawia wszystkie jednostki w jego zasię block.radar.description = Stopniowo odkrywa teren i wrogie jednostki. Wymaga prądu. block.shockwave-tower.description = Uszkadza i niszczy wrogie pociski, używając cyjanu. block.canvas.description = Wyświetla proste obrazki z predefinowaną paletą. Edytowalne. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Lądowa jednostka ofensywna, strzelająca standardowymi pociskami we wrogie jednostki. unit.mace.description = Lądowa jednostka ofensywna, miotająca strumieniami ognia we wrogie jednostki. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 20e7a2653b..4c18018295 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki oficial do Mindustry link.suggestions.description = Sugira novos conteúdos link.bug.description = Achou algum? Reporte-o aqui linkopen = Este servidor lhe enviou um link. Você tem certeza de que quer abri-lo?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Falha ao abrir o link\nO Url foi copiado para a área de transferência. screenshot = Screenshot salva para {0} screenshot.invalid = Este mapa é grande demais, você pode estar potencialmente sem memória suficiente para captura de tela. @@ -79,7 +80,7 @@ schematic.addtag = Adicionar Etiqueta schematic.texttag = Etiqueta de Texto schematic.icontag = Etiqueta de Ícone schematic.renametag = Renomear Etiqueta -schematic.tagged = {0} tagged +schematic.tagged = {0} marcado(s) schematic.tagdelconfirm = Deletar essa etiqueta completamente? schematic.tagexists = Essa etiqueta já existe. @@ -101,8 +102,8 @@ coreattack = < O Núcleo está sob ataque! > nearpoint = [[ [scarlet]SAIA DO PONTO DE QUEDA IMEDIATAMENTE[] ]\naniquilação iminente database = Banco de Dados do Núcleo database.button = Banco de Dados -database.patched = Modified by data patches. -viewfields = View Content Fields +database.patched = Modificado por patches de dados. +viewfields = Ver Campos de Conteúdo savegame = Salvar Jogo loadgame = Carregar Jogo joingame = Juntar-se ao Jogo @@ -123,7 +124,9 @@ continue = Continuar maps.none = [lightgray]Nenhum mapa encontrado! invalid = Inválido pickcolor = Escolher Cor -color = Color +color = Cor +import = Import +export = Export preparingconfig = Preparando Configuração preparingcontent = Preparando Conteúdo uploadingcontent = Fazendo Upload do Conteúdo @@ -148,20 +151,20 @@ mod.enabled = [lightgray]Ativado mod.disabled = [red]Desativado mod.multiplayer.compatible = [gray]Compatível com Multiplayer mod.disable = Desati-\nvar -mod.version = Version: +mod.version = Versão: mod.content = Conteúdo: mod.delete.error = Incapaz de deletar o mod. O arquivo talvez esteja em uso. mod.incompatiblegame = [red]Jogo desatualizado mod.incompatiblemod = [red]Incompatível mod.blacklisted = [red]Não suportado -mod.unmetdependencies = [red]Unmet Dependencies +mod.unmetdependencies = [red]Dependências Não Atendidas mod.erroredcontent = [scarlet]Erros no conteúdo mod.circulardependencies = [red]Dependências Mútuas mod.incompletedependencies = [red]Dependências Incompletas mod.requiresversion.details = Requer a versão do jogo: [accent]{0}[]\nSeu jogo está desatualizado. Este mod requer uma versão mais recente do jogo (possivelmente uma versão beta/alfa) para funcionar. -mod.incompatiblemod.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 154[] to its [accent]mod.json[] file. +mod.incompatiblemod.details = Este mod é incompatível com a versão mais recente do jogo. O autor deve atualizá-lo e adicionar [accent]minGameVersion: 154[] ao seu arquivo [accent]mod.json[]. mod.blacklisted.details = Este mod foi manualmente colocado na lista negra por causar falhas ou outros problemas com esta versão do jogo. Não use-o. mod.missingdependencies.details = Este mod está com dependências ausentes: {0} mod.erroredcontent.details = Este mod causou erros ao carregar. Peça ao autor do mod para corrigi-los. @@ -187,15 +190,15 @@ mod.preview.missing = Antes de publicar esse mod na oficina, você deve adiciona mod.folder.missing = Somente mods no formato de pasta serão publicados na oficina.\nPara converter qualquer Mod em uma pasta, simplesmente descompacte seu arquivo numa pasta e delete o arquivo ZIP antigo, então reinicie seu jogo ou recarregue os mods. mod.scripts.disable = Seu dispositivo não suporta mods com scripts. Você precisa desabilitar esses mods para conseguir jogar. -mod.dependencies.error = [scarlet]Mods are missing dependencies -mod.dependencies.soft = (optional) -mod.dependencies.download = Import -mod.dependencies.downloadreq = Import Required -mod.dependencies.downloadall = Import All -mod.dependencies.status = Import Results -mod.dependencies.success = Successfully downloaded: -mod.dependencies.failure = Failed to download: -mod.dependencies.imported = This mod requires dependencies. Download? +mod.dependencies.error = [scarlet]Mods com dependências faltando +mod.dependencies.soft = (opcional) +mod.dependencies.download = Importar +mod.dependencies.downloadreq = Importar Necessário +mod.dependencies.downloadall = Importar Tudo +mod.dependencies.status = Resultados da Importação +mod.dependencies.success = Baixado com sucesso: +mod.dependencies.failure = Falha ao baixar: +mod.dependencies.imported = Este mod requer dependências. Baixar? about.button = Sobre name = Nome: @@ -211,7 +214,9 @@ campaign.select = Selecione uma Campanha Inicial campaign.none = [lightgray]Selecione um planeta para começar.\nIsso pode ser alterado a qualquer momento. campaign.erekir = Conteúdo mais novo e mais polido. Progressão de campanha principalmente linear.\n\nMapas de maior qualidade e experiência geral. campaign.serpulo = Conteúdo mais antigo; a experiência clássica. Mais aberto, mais conteúdo.\n\nMapas e mecânicas de campanha potencialmente desbalanceados. Menos polido. -campaign.difficulty = Difficulty +campaign.difficulty = Dificuldade +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Completado techtree = Árvore Tecnológica techtree.select = Seleção de Árvore Tecnológica @@ -280,7 +285,7 @@ trace.modclient = Cliente Customizado: [accent]{0} trace.times.joined = Vezes que se Juntou: [accent]{0} trace.times.kicked = Vezes que foi Expulso: [accent]{0} trace.ips = IPs: -trace.names = Names: +trace.names = Nomes: invalidid = ID do cliente invalido! Reporte o bug player.ban = Banir @@ -314,14 +319,14 @@ disconnect.error = Erro de conexão. disconnect.closed = Conexão fechada. disconnect.timeout = Tempo esgotado. disconnect.data = Falha ao carregar os dados do mundo! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.snapshottimeout = Tempo esgotado ao receber snapshots UDP.\nIsso pode ser causado por uma rede ou conexão instável. cantconnect = Impossível conectar ([accent]{0}[]). connecting = [accent]Conectando... reconnecting = [accent]Reconectando... connecting.data = [accent]Carregando dados do mundo... server.port = Porta: server.invalidport = Numero de porta inválido! -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! +server.error.addressinuse = [scarlet]Falha ao abrir o servidor na porta 6567.[]\n\nCertifique-se de que nenhum outro servidor de Mindustry esteja rodando! server.error = [scarlet]Erro ao hospedar o servidor. save.new = Novo Jogo Salvo save.overwrite = Você tem certeza que quer sobrescrever este jogo salvo? @@ -353,12 +358,13 @@ save.wave = Horda {0} save.mode = Modo de jogo: {0} save.date = Último Salvamento: {0} save.playtime = Tempo de jogo: {0} -dontshowagain = Don't show again +dontshowagain = Não mostrar novamente warning = Aviso. confirm = Confirmar delete = Excluir view.workshop = Ver na Oficina workshop.listing = Editar a Lista da Oficina +hide = Hide ok = Certo open = Abrir customize = Customizar Regras @@ -370,20 +376,21 @@ command.repair = Reparar command.rebuild = Reconstruir command.assist = Auxiliar Jogador command.move = Mover -command.boost = Impulso command.enterPayload = Inserir Bloco de Carga útil command.loadUnits = Carregar Unidades command.loadBlocks = Carregar Blocos command.unloadPayload = Descarregar Carga -command.loopPayload = Loop Unit Transfer +command.loopPayload = Loop de Transferência de Unidade stance.stop = Cancelar Ordens stance.shoot = Modo: Atirar stance.holdfire = Modo: Cessar Fogo stance.pursuetarget = Modo: Perseguir Alvo stance.patrol = Modo: Patrulhar Caminho +stance.holdposition = Stance: Hold Position stance.ram = Modo: Vagar\n[lightgray]Andar em linha reta, ignorando o terreno -stance.mineauto = Automatic Mining -stance.mine = Mine Item: {0} +stance.boost = Impulso +stance.mineauto = Mineração Automática +stance.mine = Minerar Item: {0} openlink = Abrir Link copylink = Copiar Link back = Voltar @@ -428,6 +435,7 @@ saveimage = Salvar Imagem unknown = Desconhecido custom = Customizado builtin = Embutido +modded = Modificado map.delete.confirm = Você tem certeza que quer deletar este mapa? Isso não pode ser revertido! map.random = [accent]Mapa Aleatório map.nospawn = Este mapa não possui nenhum Núcleo para o jogador nascer! Adicione um Núcleo {0} para este mapa no editor. @@ -448,12 +456,12 @@ publish.confirm = Você tem certeza de que quer publicar isso?\n\n[lightgray]Pri publish.error = Erro ao publicar o item: {0} steam.error = Falha em iniciar os serviços da Steam.\nErro: {0} -editor.showblocks = Show Blocks -editor.showterrain = Show Terrain -editor.showfloor = Show Floor +editor.showblocks = Mostrar Blocos +editor.showterrain = Mostrar Terreno +editor.showfloor = Mostrar Chão editor.planet = Planeta: editor.sector = Setor: -editor.seed = Seed: +editor.seed = Semente: editor.brush = Pincel editor.openin = Abrir no editor editor.oregen = Geração de minério @@ -466,20 +474,20 @@ editor.waves = Hordas: editor.rules = Regras: editor.generation = Geração: editor.objectives = Objetivos: -editor.locales = Locale Bundles -editor.patches.guide = Patch Guide +editor.locales = Pacotes de Localidade +editor.patches.guide = Guia de Patches editor.patches = Content Patches -editor.patch = Patchset: {0} -editor.patches.none = [lightgray]No patchsets loaded. -editor.patches.errors = Patchset Errors -editor.patches.importerror = Failed to import patchset -editor.patches.delete.confirm = Are you sure you want to delete this patchset? -editor.patch.fields = {0} fields -editor.worldprocessors = World Processors -editor.worldprocessors.editname = Edit Name -editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. -editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? -editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. +editor.patch = Conjunto de Patches: {0} +editor.patches.none = [lightgray]Nenhum conjunto de patches carregado. +editor.patches.errors = Erros no Conjunto de Patches +editor.patches.importerror = Falha ao importar o conjunto de patches +editor.patches.delete.confirm = Tem certeza de que deseja excluir este conjunto de patches? +editor.patch.fields = {0} campos +editor.worldprocessors = Processadores de Mundo +editor.worldprocessors.editname = Editar Nome +editor.worldprocessors.none = [lightgray]Nenhum bloco de processador de mundo encontrado!\nAdicione um no editor de mapas ou use o botão \ue813 Adicionar abaixo. +editor.worldprocessors.nospace = Sem espaço livre para colocar um processador de mundo!\nVocê encheu o mapa com estruturas? Por que você faria isso? +editor.worldprocessors.delete.confirm = Tem certeza de que deseja excluir este processador de mundo? editor.ingame = Editar em jogo editor.playtest = Jogar Teste editor.publish.workshop = Publicar na oficina @@ -488,15 +496,19 @@ editor.center = Centro editor.search = Procurar mapas... editor.filters = Filtrar mapas editor.filters.mode = Modos de jogo: +editor.filters.priorities = Prioridades: editor.filters.type = Tipo: editor.filters.search = Procurar em: editor.filters.author = Autor editor.filters.description = Descrição -editor.shiftx = Shift X -editor.shifty = Shift Y +editor.filters.modname = Nome do Mod +editor.filters.prioritizemod = Prioridade de Mod +editor.filters.prioritizecustom = Prioridade Personalizada +editor.shiftx = Deslocar X +editor.shifty = Deslocar Y workshop = Oficina waves.title = Hordas -waves.team = Team +waves.team = Equipe waves.remove = Remover waves.every = a cada waves.waves = Horda(s) @@ -512,7 +524,7 @@ waves.max = quantidade máxima waves.guardian = Guardião waves.preview = Pré-visualizar waves.edit = Editar... -waves.random = Random +waves.random = Aleatório waves.copy = Copiar para área de transferência waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. @@ -523,24 +535,25 @@ waves.sort.reverse = Inverter ordem waves.sort.begin = Começar waves.sort.health = Vida waves.sort.type = Tipo -waves.search = Search waves... -waves.filter = Unit Filter +waves.search = Procurar hordas... +waves.filter = Filtro de Unidade waves.units.hide = Esconder tudo waves.units.show = Mostrar tudo +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = quantidade wavemode.totals = total wavemode.health = vida -all = All +all = Tudo editor.default = [lightgray] details = Detalhes... edit = Editar... variables = Variáveis -logic.clear.confirm = Are you sure you want to clear all code from this processor? -logic.restart = Restart -logic.globals = Built-in Variables +logic.clear.confirm = Tem certeza de que deseja limpar todo o código deste processador? +logic.restart = Reiniciar +logic.globals = Variáveis Integradas editor.name = Nome: editor.spawn = Spawnar unidade @@ -553,7 +566,7 @@ editor.errorlegacy = Esse mapa é velho demais, e usa um formato de mapa legacy editor.errornot = Este não é um arquivo de mapa. editor.errorheader = Este arquivo de mapa não é mais válido ou está corrompido. editor.errorname = O mapa não tem nome definido. -editor.errorlocales = Error reading invalid locale bundles. +editor.errorlocales = Erro ao ler pacotes de localidade inválidos. editor.update = Atualizar editor.randomize = Aleatorizar editor.moveup = Mover para Cima @@ -565,7 +578,7 @@ editor.sectorgenerate = Gerar Setor editor.resize = Redimen-\nsionar editor.loadmap = Carregar\nmapa editor.savemap = Salvar\nmapa -editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? +editor.savechanges = [scarlet]Você tem alterações não salvas!\n\n[]Deseja salvá-las? editor.saved = Salvo! editor.save.noname = Seu mapa não tem um nome! Coloque um no menu de "Informação do mapa" editor.save.overwrite = O seu mapa substitui um mapa já construído! Coloque um nome diferente no menu "Informação do mapa" @@ -604,10 +617,10 @@ toolmode.eraseores = Apagar minérios toolmode.eraseores.description = Apaga apenas minérios. toolmode.fillteams = Preencher times toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. -toolmode.fillerase = Fill Erase -toolmode.fillerase.description = Erase blocks of the same type. -toolmode.fillcliffs = Fill Cliffs -toolmode.fillcliffs.description = Turns walls into cliffs. +toolmode.fillerase = Preencher e Apagar +toolmode.fillerase.description = Apaga blocos do mesmo tipo. +toolmode.fillcliffs = Preencher Penhascos +toolmode.fillcliffs.description = Transforma muros em penhascos. toolmode.drawteams = Desenhar times toolmode.drawteams.description = Muda o time do qual o bloco pertence. #unused @@ -632,7 +645,7 @@ filter.clear = Excluir filter.option.ignore = Ignorar filter.scatter = Dispersão filter.terrain = Terreno -filter.logic = Logic +filter.logic = Lógica filter.option.scale = Escala filter.option.chance = Chance @@ -656,26 +669,26 @@ filter.option.floor2 = Chão secundário filter.option.threshold2 = Margem secundária filter.option.radius = Raio filter.option.percentile = Percentual -filter.option.code = Code +filter.option.code = Código filter.option.loop = Loop -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) -locales.deletelocale = Are you sure you want to delete this locale bundle? -locales.applytoall = Apply Changes To All Locales -locales.addtoother = Add To Other Locales -locales.rollback = Rollback to last applied -locales.filter = Property filter -locales.searchname = Search name... -locales.searchvalue = Search value... -locales.searchlocale = Search locale... -locales.byname = By name -locales.byvalue = By value -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales -locales.viewproperty = View in all locales -locales.viewing = Viewing property "{0}" -locales.addicon = Add Icon +locales.info = Aqui, você pode adicionar pacotes de localidade para idiomas específicos ao seu mapa. Cada propriedade tem um nome e um valor. Elas podem ser usadas por processadores de mundo e objetivos. Elas suportam formatação de texto (substituindo espaços reservados por valores reais).\n\n[cyan]Exemplo de propriedade:\n[]nome: [accent]timer[]\nvalor: [accent]Tempo restante: {0}[]\n\n[cyan]Uso:\n[]Defina como texto do objetivo: [accent]@timer\n\n[]Imprima em um processador de mundo:\n[accent]localeprint "timer"\nformat tempo\n[gray](onde tempo é uma variável calculada) +locales.deletelocale = Tem certeza de que deseja excluir este pacote de localidade? +locales.applytoall = Aplicar Alterações a Todas as Localidades +locales.addtoother = Adicionar a Outras Localidades +locales.rollback = Reverter para o último aplicado +locales.filter = Filtro de propriedade +locales.searchname = Procurar nome... +locales.searchvalue = Procurar valor... +locales.searchlocale = Procurar localidade... +locales.byname = Por nome +locales.byvalue = Por valor +locales.showcorrect = Mostrar propriedades presentes em todas as localidades e com valores únicos +locales.showmissing = Mostrar propriedades que faltam em algumas localidades +locales.showsame = Mostrar propriedades que têm os mesmos valores em localidades diferentes +locales.viewproperty = Visualizar em todas as localidades +locales.viewing = Visualizando propriedade "{0}" +locales.addicon = Adicionar Ícone width = Largura: height = Altura: @@ -699,7 +712,7 @@ mapeditor = Editor de mapa abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado -complete = [lightgray]Complete: +complete = [lightgray]Completo: requirement.wave = Alcançar a Horda {0} em {1} requirement.core = Destruir o núcleo inimigo em {0} requirement.research = Pesquise {0} @@ -719,20 +732,20 @@ objective.coreitem.name = Item do Núcleo objective.buildcount.name = Quantidade de Construções objective.unitcount.name = Quantidade de Unidades objective.destroyunits.name = Destrua Unidades -objective.timer.name = Timer +objective.timer.name = Cronômetro objective.destroyblock.name = Destrua Bloco objective.destroyblocks.name = Destrua Blocos objective.destroycore.name = Destrua o Núcleo objective.commandmode.name = Modo de Comando -objective.flag.name = Flag +objective.flag.name = Bandeira -marker.shapetext.name = Shape Text -marker.point.name = Point -marker.shape.name = Shape +marker.shapetext.name = Texto de Forma +marker.point.name = Ponto +marker.shape.name = Forma marker.text.name = Texto -marker.line.name = Line -marker.quad.name = Quad -marker.texture.name = Texture +marker.line.name = Linha +marker.quad.name = Quadrilátero +marker.texture.name = Textura marker.background = Fundo marker.outline = Contorno @@ -747,8 +760,9 @@ objective.build = [accent]Construa: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.buildunit = [accent]Construa Unidade: [][lightgray]{0}[]x\n{1}[lightgray]{2} objective.destroyunits = [accent]Destrua: [][lightgray]{0}[]x Unidades objective.enemiesapproaching = [accent]Inimigos se aproximando em [lightgray]{0}[] -objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] -objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyescelating = [accent]A produção inimiga está aumentando em [lightgray]{0}[] +objective.enemyairunits = [accent]A produção de unidades aéreas inimigas começa em [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destrua o Núcleo Inimigo objective.command = [accent]Comande Unidades objective.nuclearlaunch = [accent]⚠ Lançamento Nuclear Detectado: [lightgray]{0} @@ -759,18 +773,18 @@ loadout = Carregamento resources = Recursos resources.max = Máximo bannedblocks = Blocos Banidos -unbannedblocks = Unbanned Blocks +unbannedblocks = Blocos Desbanidos objectives = Objetivos bannedunits = Unidades Banidas -unbannedunits = Unbanned Units +unbannedunits = Unidades Desbanidas bannedunits.whitelist = Banned Units As Whitelist bannedblocks.whitelist = Banned Blocks As Whitelist addall = Adicionar Todos launch.from = Lançando de: [accent]{0} launch.capacity = Capacidade para Lançamento de Itens: [accent]{0} launch.destination = Destino: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +landing.sources = Setores de Origem: [accent]{0}[] +landing.import = Importação Total Máxima: {0}[accent]{1}[lightgray]/min configure.invalid = A quantidade deve ser um número entre 0 e {0}. add = Adicionar... guardian = Guardião @@ -799,7 +813,7 @@ campaign.complete = [accent]Parabéns.\n\nO inimigo em {0} foi derrotado.\n[ligh sectorlist = Setores sectorlist.attacked = {0} sob ataque sectors.unexplored = [lightgray]Inexplorado -sectors.attempts = Attempts: +sectors.attempts = Tentativas: sectors.resources = Recursos: sectors.production = Produção: sectors.export = Exportar: @@ -810,12 +824,12 @@ sectors.wave = Horda: sectors.stored = Armazenado: sectors.resume = Continuar sectors.launch = Lançar -sectors.nolaunchcandidate = No Launch Sector +sectors.nolaunchcandidate = Sem Setor de Lançamento sectors.viewsubmission = \ue80d View Submissions sectors.select = Selecionar -sectors.launchselect = Select Launch Destination +sectors.launchselect = Selecionar Destino de Lançamento sectors.nonelaunch = [lightgray]nenhum (sun) -sectors.redirect = Redirect Launch Pads +sectors.redirect = Redirecionar Plataformas de Lançamento sectors.rename = Renomear Setor sectors.enemybase = [scarlet]Base Inimiga sectors.vulnerable = [scarlet]Vulnerável @@ -824,18 +838,19 @@ sectors.go = Ir sector.abandon = Abandonar sector.abandon.confirm = O(s) Núcleo(s) desse setor vão se auto-destruir.\nContinuar? sector.curcapture = Setor Capturado -sector.lockdown = [red]:warning:[accent] Sector currently under attack\n[lightgray]production, research, export and import disabled +sector.lockdown = [red]:warning:[accent] Setor sob ataque\n[lightgray]produção, pesquisa, exportação e importação desativadas sector.curlost = Setor Perdido sector.missingresources = [scarlet]Recursos Insuficientes no Núcleo sector.attacked = Setor [accent]{0}[white] sob ataque! sector.lost = Setor [accent]{0}[white] perdido! sector.capture = Sector [accent]{0}[white]Captured! -sector.capture.current = Sector Captured! +sector.capture.current = Setor Capturado! sector.changeicon = Trocar Ícone sector.noswitch.title = Incapaz de Mudar de Setores sector.noswitch = Você não pode trocar de setor enquanto um setor existente estiver sob ataque.\n\nSetor: [accent]{0}[] em [accent]{1}[] sector.view = Visualizar Setor -sector.foundationrequired = [lightgray] Core: Foundation Required +sector.foundationrequired = [lightgray] Núcleo: Fundação Necessária +sector.shielded = [lightgray] Shielded threat.low = Baixa threat.medium = Média @@ -843,16 +858,20 @@ threat.high = Alta threat.extreme = Extrema threat.eradication = Erradicação -difficulty.casual = Casual -difficulty.easy = Easy -difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty -difficulty.enemyHealthMultiplier = Enemy Health: {0} -difficulty.enemySpawnMultiplier = Enemy Amount: {0} -difficulty.waveTimeMultiplier = Wave Timer: {0} -difficulty.nomodifiers = [lightgray](No modifiers) +difficulty.casual = Casual +difficulty.easy = Fácil +difficulty.normal = Normal +difficulty.hard = Difícil +difficulty.eradication = Erradicação + +difficulty.enemyHealthMultiplier = Vida dos Inimigos: {0} +difficulty.enemySpawnMultiplier = Quantidade de Inimigos: {0} +difficulty.waveTimeMultiplier = Temporizador de Horda: {0} +difficulty.nomodifiers = [lightgray](Sem modificadores) planets = Planetas @@ -862,7 +881,7 @@ planet.sun.name = Sol sector.impact0078.name = Impacto 0078 sector.groundZero.name = Marco Zero -sector.craters.name = As Crateras +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Floresta Congelada sector.ruinousShores.name = Costas Ruinosas sector.stainedMountains.name = Montanhas Manchadas @@ -875,28 +894,29 @@ sector.fungalPass.name = Passagem Fúngica sector.biomassFacility.name = Instalação de Síntese de Biomassa sector.windsweptIslands.name = Ilhas Ventadas sector.extractionOutpost.name = Posto Avançado de Extração -sector.facility32m.name = Facility 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons +sector.facility32m.name = Instalação 32 M +sector.taintedWoods.name = Bosques Contaminados +sector.infestedCanyons.name = Cânions Infestados sector.planetaryTerminal.name = Terminal de Lançamento Planetário. sector.coastline.name = Litoral sector.navalFortress.name = Fortaleza Naval -sector.polarAerodrome.name = Polar Aerodrome -sector.atolls.name = Atolls -sector.testingGrounds.name = Testing Grounds -sector.perilousHarbor.name = Perilous Harbor -sector.weatheredChannels.name = Weathered Channels -sector.fallenVessel.name = Fallen Vessel -sector.mycelialBastion.name = Mycelial Bastion -sector.frontier.name = Frontier -sector.sunkenPier.name = Sunken Pier +sector.polarAerodrome.name = Aeródromo Polar +sector.atolls.name = Atóis +sector.testingGrounds.name = Campos de Teste +sector.perilousHarbor.name = Porto Perigoso +sector.weatheredChannels.name = Canais Desgastados +sector.fallenVessel.name = Vaso Caído +sector.mycelialBastion.name = Bastião Micelial +sector.frontier.name = Fronteira +sector.sunkenPier.name = Píer Afundado +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold +sector.geothermalStronghold.name = Fortaleza Geotérmica sector.groundZero.description = Um lugar bom para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsiga o máximo possível de chumbo e cobre.\nContinue. sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos se espalharam. As temperaturas baixas não conseguirão contê-los para sempre.\n\nComeçe a aventura com energia. Construa geradores a combustão. Aprenda a usar reparadores. sector.saltFlats.description = Nos arredores do deserto ficam as planícies de sal. Muitos recursos podem ser encontrados nesse local.\n\nO inimigo construiu um complexo de armazenamento de recursos aqui. Destrua o núcleo deles. Não deixe nada sobrando. -sector.craters.description = A água se acumulou nessa cratera, relíquias de guerras antigas. Re-conquiste a área. Colete areia. Faça metavidro. Use a água para melhorar suas brocas e torretas. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Passando o terreno desolado, está localizada a costa. Antigamente, este local abrigava uma rede de defesa costeira. Não restou muita coisa. Apenas as estruturas de defesas básicas permaneceram ilesas, o resto foi reduzido a sucata.\nContinue expandindo seus territórios, re-descubra a tecnologia. sector.stainedMountains.description = Mais para o interior estão as montanhas, ainda não contaminadas pelos esporos.\nExtraia o titânio que é abundante nessa área. Aprenda a usá-lo.\n\nA presença inimiga é maior aqui. Não dê tempo a eles de trazerem fortes unidades. sector.overgrowth.description = Essa área coberta por vegetação, próxima ao local de origem dos esporos.\nO inimigo estabeleceu um posto de controle aqui. Faça unidades Titan. Destrua eles. Recupere o que foi perdido. @@ -909,8 +929,8 @@ sector.windsweptIslands.description = Um pouco depois do literal tem essa remota sector.extractionOutpost.description = Um posto avançado remoto, construído pelo inimigo com o objetivo de lançar recursos para outros setores.\n\nTecnologia de transporte entre setores é essencial para mais conquista de território. Destrua a base. Pesquise suas Plataformas de Lançamento. sector.impact0078.description = Aqui repousas restos de um reservatório de transporte interestelar que entrou nesse sistema primeiro.\nSalve o quanto puder dos destroços. Pesquise qualquer tecnologia intacta. sector.planetaryTerminal.description = O último alvo.\n\nEssa base costeira contém a estrutura capaz de lançar Núcleos para planetas locais. É extremamente bem guardado.\n\nProduza unidades navais. Elimine o inimigo o mais rápido o possível. pesquise a estrutura de lançamento. -sector.coastline.description = Remnants of naval unit technology have been detected at this location. Repel the enemy attacks, capture this sector, and acquire the technology. -sector.navalFortress.description = The enemy has established a base on a remote, naturally-fortified island. Destroy this outpost. Acquire their advanced naval craft technology, and research it. +sector.coastline.description = Restos da tecnologia de unidades navais foram detectados neste local. Repila os ataques inimigos, capture este setor e adquira a tecnologia. +sector.navalFortress.description = O inimigo estabeleceu uma base em uma ilha remota e naturalmente fortificada. Destrua este posto avançado. Adquira sua tecnologia avançada de embarcações navais e pesquise-a. sector.onset.name = O Começo sector.aegis.name = Aegis @@ -923,12 +943,12 @@ sector.marsh.name = O Brejo sector.peaks.name = Picos sector.ravine.name = Ravina sector.caldera-erekir.name = Caldeira -sector.stronghold.name = Stronghold -sector.crevice.name = Crevice -sector.siege.name = Siege -sector.crossroads.name = Crossroads +sector.stronghold.name = Fortaleza +sector.crevice.name = Fenda +sector.siege.name = Cerco +sector.crossroads.name = Encruzilhada sector.karst.name = Karst -sector.origin.name = Origin +sector.origin.name = Origem sector.onset.description = O setor de tutorial. Este objetivo ainda não foi criado. Aguarde mais informações. sector.aegis.description = O inimigo é protegido por escudos. Um módulo de quebra-escudos experimental foi detectado neste setor.\nLocalize esta estrutura. Forneça munição de tungstênio e destrua a base inimiga. @@ -961,7 +981,7 @@ status.overdrive.name = Sobrecarga status.overclock.name = Overclock status.shocked.name = Chocado status.blasted.name = Impactado -status.corroded.name = Corroded +status.corroded.name = Corroído status.unmoving.name = Imóvel status.boss.name = Guardião @@ -1009,11 +1029,11 @@ stat.opposites = Opostos stat.powercapacity = Capacidade de Energia stat.powershot = Energia/tiro stat.damage = Dano -stat.frequency = Frequency +stat.frequency = Frequência stat.targetsair = Mira no ar stat.targetsground = Mira no chão -stat.crushdamage = Crush Damage -stat.legsplashdamage = Leg Splash Damage +stat.crushdamage = Dano de Esmagamento +stat.legsplashdamage = Dano de Área das Pernas stat.itemsmoved = Velocidade de movimento stat.launchtime = Tempo entre Disparos stat.shootrange = Alcance @@ -1030,13 +1050,13 @@ stat.itemcapacity = Capacidade de Itens stat.memorycapacity = Capacidade de Memória stat.basepowergeneration = Geração de poder base stat.productiontime = Tempo de produção -stat.warmuptime = Warmup Time +stat.warmuptime = Tempo de Aquecimento stat.repairtime = Tempo de reparo total do bloco stat.repairspeed = Taxa de Reparo stat.weapons = Armas stat.bullet = Projétil stat.moduletier = Tier do Módulo -stat.unittype = Unit Type +stat.unittype = Tipo de Unidade stat.speedincrease = Aumento de velocidade stat.range = Distância stat.drilltier = Brocas @@ -1045,6 +1065,7 @@ stat.boosteffect = Efeito do Impulso stat.maxunits = Máximo de unidades ativas stat.health = Saúde stat.armor = Armadura +stat.armor.info = Dano aplicado = dano recebido - armadura.\nRedução máxima de dano de até 90%. stat.buildtime = Tempo de construção stat.maxconsecutive = Máximo Consecutivo stat.buildcost = Custo de construção @@ -1054,8 +1075,8 @@ stat.reload = Tempo de recarga stat.ammo = Munição stat.shieldhealth = Vida do Escudo stat.cooldowntime = Tempo de espera -stat.regenerationrate = Regeneration Rate -stat.activationtime = Activation Time +stat.regenerationrate = Taxa de Regeneração +stat.activationtime = Tempo de Ativação stat.explosiveness = Explosividade stat.basedeflectchance = Chance Base de Esquiva stat.lightningchance = Chance de Raio @@ -1073,10 +1094,10 @@ stat.minetier = Nível de Mineração stat.payloadcapacity = Capacidade de Carga stat.abilities = Habilidades stat.canboost = Pode impulsionar -stat.boostingspeed = Boosting Speed +stat.boostingspeed = Velocidade de Impulso stat.flying = Voador stat.ammouse = Consumo de Munição -stat.ammocapacity = Ammo Capacity +stat.ammocapacity = Capacidade de Munição stat.damagemultiplier = Multiplicador de Dano stat.healthmultiplier = Multiplicador de Vida stat.speedmultiplier = Multiplicador de Velocidade @@ -1085,54 +1106,54 @@ stat.buildspeedmultiplier = Multiplicador de Velocidade de Construção stat.reactive = Reage stat.immunities = Imunidades stat.healing = Reparo -stat.efficiency = [stat]{0}% Efficiency +stat.efficiency = [stat]{0}% de Eficiência ability.forcefield = Campo de Força -ability.forcefield.description = Projects a force shield that absorbs bullets +ability.forcefield.description = Projeta um escudo de força que absorve balas ability.repairfield = Campo de Reparação -ability.repairfield.description = Repairs nearby units +ability.repairfield.description = Repara unidades próximas ability.statusfield = Campo de Status -ability.statusfield.description = Applies a status effect to nearby units +ability.statusfield.description = Aplica um efeito de status a unidades próximas ability.unitspawn = Fábrica -ability.unitspawn.description = Constructs units +ability.unitspawn.description = Constrói unidades ability.shieldregenfield = Raio de Regeneração do Escudo -ability.shieldregenfield.description = Regenerates shields of nearby units +ability.shieldregenfield.description = Regenerates escudos de unidades próximas ability.movelightning = Raio de Movimento -ability.movelightning.description = Releases lightning while moving -ability.armorplate = Armor Plate -ability.armorplate.description = Reduces damage taken while shooting +ability.movelightning.description = Libera raios ao se mover +ability.armorplate = Placa de Armadura +ability.armorplate.description = Reduz o dano recebido ao atirar ability.shieldarc = Arco do Escudo ability.shieldarc.description = Projects a force shield in an arc that absorbs bullets ability.suppressionfield = Regen Suppression Field ability.suppressionfield.description = Stops nearby repair buildings ability.energyfield = Campo de Energia -ability.energyfield.description = Zaps nearby enemies -ability.energyfield.healdescription = Zaps nearby enemies and heals allies +ability.energyfield.description = Eletrocuta inimigos próximos +ability.energyfield.healdescription = Eletrocuta inimigos próximos e cura aliados ability.regen = Regeneration -ability.regen.description = Regenerates own health over time -ability.liquidregen = Liquid Absorption -ability.liquidregen.description = Absorbs liquid to heal itself -ability.spawndeath = Death Spawns -ability.spawndeath.description = Releases units on death -ability.liquidexplode = Death Spillage -ability.liquidexplode.description = Spills liquid on death +ability.regen.description = Regenera a própria vida ao longo do tempo +ability.liquidregen = Absorção de Líquido +ability.liquidregen.description = Absorve líquido para se curar +ability.spawndeath = Criações na Morte +ability.spawndeath.description = Libera unidades ao morrer +ability.liquidexplode = Explosão de Líquido +ability.liquidexplode.description = Vaza líquido ao morrer -ability.stat.firingrate = [stat]{0}/sec[lightgray] firing rate -ability.stat.regen = [stat]{0}[lightgray] health/sec -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse +ability.stat.firingrate = [stat]{0}/sec[lightgray] cadência de tiro +ability.stat.regen = [stat]{0}[lightgray] vida/seg +ability.stat.pulseregen = [stat]{0}[lightgray] vida/pulse ability.stat.shield = [stat]{0}[lightgray] shield -ability.stat.repairspeed = [stat]{0}/sec[lightgray] repair speed -ability.stat.deflectchance = [stat]{0}%[lightgray] deflect chance -ability.stat.slurpheal = [stat]{0}[lightgray] health/liquid unit -ability.stat.cooldown = [stat]{0} sec[lightgray] cooldown -ability.stat.maxtargets = [stat]{0}[lightgray] max targets +ability.stat.repairspeed = [stat]{0}/sec[lightgray] velocidade de reparo +ability.stat.deflectchance = [stat]{0}%[lightgray] chance de deflexão +ability.stat.slurpheal = [stat]{0}[lightgray] vida/liquid unit +ability.stat.cooldown = [stat]{0} sec[lightgray] recarga +ability.stat.maxtargets = [stat]{0}[lightgray] máximo de alvos ability.stat.sametypehealmultiplier = [stat]{0}%[lightgray] same type repair amount -ability.stat.damagereduction = [stat]{0}%[lightgray] damage reduction -ability.stat.minspeed = [stat]{0} tiles/sec[lightgray] min speed -ability.stat.duration = [stat]{0} sec[lightgray] duration -ability.stat.buildtime = [stat]{0} sec[lightgray] build time +ability.stat.damagereduction = [stat]{0}%[lightgray] redução de dano +ability.stat.minspeed = [stat]{0} blocos/seg[lightgray] min velocidade +ability.stat.duration = [stat]{0} sec[lightgray] duração +ability.stat.buildtime = [stat]{0} sec[lightgray] tempo de construção -bar.displaytoolarge = Dimensions too large\n(Max: {0}x{0}) +bar.displaytoolarge = Dimensões muito grandes bar.onlycoredeposit = Somente depósito no núcleo permitido bar.drilltierreq = Broca melhor necessária. bar.nobatterypower = Insufficieny Battery Power @@ -1167,35 +1188,35 @@ bar.input = Entrada bar.output = Saída bar.strength = [stat]{0}[lightgray]x força bar.regenerationrate = [stat]{0}/sec[lightgray] regen rate -bar.activationtimer = Activates in {0} -bar.activated = Activated +bar.activationtimer = Ativa em {0} +bar.activated = Ativado units.processorcontrol = [lightgray]Controlado por Processador -weapon.pointdefense = [stat]Point Defense +weapon.pointdefense = [stat]Defesa de Ponto bullet.damage = [stat]{0}[lightgray] de dano bullet.splashdamage = [stat]{0}[lightgray] de dano em área ~[stat] {1}[lightgray] bloco(s) bullet.incendiary = [stat]Incendiário bullet.homing = [stat]Guiado bullet.armorpierce = [stat]pentração de armadura -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing -bullet.antiarmor = [stat]{0}x[lightgray] anti-armor -bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit +bullet.armorweakness = [red]{0}x[lightgray] armadura weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing +bullet.antiarmor = [stat]{0}x[lightgray] anti-armadura +bullet.maxdamagefraction = [stat]{0}%[lightgray] dano limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles bullet.empradius = [stat]{0}[lightgray] tiles EMP radius bullet.empboost = [stat]{0}%[lightgray] overdrive ~ [stat]{1}[lightgray] -bullet.empdamage = [stat]{0}%[lightgray] power damage +bullet.empdamage = [stat]{0}%[lightgray] power dano bullet.empslowdown = [stat]{0}%[lightgray] enemy power overdrive ~ [stat]{1}[lightgray] -bullet.empunitdamage = [stat]{0}%[lightgray] unit damage +bullet.empunitdamage = [stat]{0}%[lightgray] unit dano bullet.interval = [stat]{0}/sec[lightgray] interval bullets: bullet.frags = [stat]{0}[lightgray]x balas de fragmentação: bullet.lightning = [stat]{0}[lightgray]x raio ~ [stat]{1}[lightgray] dano bullet.lightninginterval = [stat]{0}[lightgray] tiles interval ~ [stat]{1}[lightgray] tiles length bullet.buildingdamage = [stat]{0}%[lightgray] dano em construção bullet.spawnBullets = [stat]{0}x[lightgray] spawned bullets: -bullet.shielddamage = [stat]{0}%[lightgray] shield damage +bullet.shielddamage = [stat]{0}%[lightgray] escudo dano bullet.knockback = [stat]{0}[lightgray] Impulso bullet.pierce = [stat]{0}[lightgray]x perfuração bullet.infinitepierce = [stat]perfuração @@ -1203,7 +1224,7 @@ bullet.healpercent = [stat]{0}[lightgray]% reparo bullet.healamount = [stat]{0}[lightgray] reparo direto bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição bullet.reload = [stat]{0}[lightgray]x cadência de tiro -bullet.range = [stat]{0}[lightgray] tiles range +bullet.range = [stat]{0}[lightgray] tiles alcance bullet.notargetsmissiles = [stat] ignores buildings bullet.notargetsbuildings = [stat] ignores missiles @@ -1215,7 +1236,7 @@ unit.liquidsecond = líquido/seg unit.itemssecond = itens/seg unit.liquidunits = unidades de líquido unit.powerunits = unidades de energia -unit.powerequilibrium = power equilibrium +unit.powerequilibrium = equilíbrio de energia unit.heatunits = unidades de calor unit.degrees = Graus unit.seconds = segundos @@ -1232,8 +1253,8 @@ unit.millions = m unit.billions = b unit.shots = shots unit.pershot = /disparo -unit.perleg = per leg -unit.perside = per side +unit.perleg = por perna +unit.perside = por lado category.purpose = Propósito category.general = Geral category.power = Energia @@ -1242,7 +1263,7 @@ category.items = Itens category.crafting = Entrada/Saída category.function = Função category.optional = Melhoras opcionais -setting.alwaysmusic.name = Always Play Music +setting.alwaysmusic.name = Sempre Tocar Música setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. setting.skipcoreanimation.name = Pular animação de lançamento/pouso do Núcleo setting.landscape.name = Travar panorama @@ -1255,11 +1276,13 @@ setting.backgroundpause.name = Pausar em segundo plano setting.buildautopause.name = Pausar Automaticamente Quando for Construir setting.doubletapmine.name = Clique Duplo Para Minerar setting.commandmodehold.name = Segure para o modo de comando -setting.distinctcontrolgroups.name = Limit One Control Group Per Unit +setting.distinctcontrolgroups.name = Limitar a Um Grupo de Controle Por Unidade setting.modcrashdisable.name = Desativar Mods em Crash de Começo setting.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados setting.playerindicators.name = Indicador de Jogadores +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicador de aliados/inimigos setting.autotarget.name = Alvo automático setting.keyboard.name = Controles de mouse e teclado @@ -1268,8 +1291,10 @@ setting.fpscap.name = FPS Máximo setting.fpscap.none = Nenhum setting.fpscap.text = {0} FPS setting.uiscale.name = Escala da\ninterface[lightgray] (reinicialização requerida)[] -setting.uiscale.description = Reinicialização necessária para aplicar as alterações. -setting.swapdiagonal.name = Sempre colocação diagonal +setting.uiscale.description = É necessário reiniciar para aplicar as mudanças. +setting.uiEdgePadding.name = Espaçamento de bordas da UI +setting.uiEdgePadding.description = Adiciona espaçamento às bordas da UI. Útil para telas com cantos arredondados ou entalhes (notches). +setting.swapdiagonal.name = Colocação sempre diagonal setting.screenshake.name = Vibração da Tela setting.bloomintensity.name = Itensidade do Bloom setting.bloomblur.name = Desfoque do Bloom @@ -1282,13 +1307,10 @@ setting.saveinterval.name = Intervalo de Auto Salvamento setting.seconds = {0} segundos setting.milliseconds = {0} milissegundos setting.fullscreen.name = Tela Cheia -setting.borderlesswindow.name = Janela sem borda[lightgray] (Pode precisar reiniciar) -setting.borderlesswindow.name.windows = Tela cheia sem borda -setting.borderlesswindow.description = Pode ser necessário reiniciar para aplicar as alterações. setting.fps.name = Mostrar FPS e Ping setting.console.name = Ativar console setting.smoothcamera.name = Suavizar movimentos da câmera -setting.detach-camera.name = Free Camera +setting.detach-camera.name = Câmera Livre setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey. setting.vsync.name = VSync setting.pixelate.name = Pixelizado [lightgray](Pode diminuir a performace) @@ -1298,19 +1320,18 @@ setting.position.name = Mostrar a posição do Jogador setting.mouseposition.name = Mostrar posição do mouse setting.musicvol.name = Volume da Música setting.atmosphere.name = Mostrar a atmosfera do planeta -setting.drawlight.name = Draw Darkness/Lighting +setting.drawlight.name = Desenhar Escuridão/Iluminação setting.ambientvol.name = Volume do Ambiente setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Enviar denúncias anônimas de erros -setting.communityservers.name = Fetch Community Server List +setting.communityservers.name = Buscar Lista de Servidores da Comunidade setting.savecreate.name = Criar salvamentos automaticamente -setting.steampublichost.name = Public Game Visibility +setting.steampublichost.name = Visibilidade do Jogo Público setting.playerlimit.name = Limites de Player setting.chatopacity.name = Opacidade do chat setting.lasersopacity.name = Opacidade do laser -setting.unitlaseropacity.name = Unit Mining Beam Opacity +setting.unitlaseropacity.name = Opacidade do Raio de Mineração da Unidade setting.bridgeopacity.name = Opacidade da ponte setting.playerchat.name = Mostrar chat em jogo setting.showweather.name = Mostrar Gráficos do Clima @@ -1319,8 +1340,8 @@ setting.macnotch.name = Adaptar a interface para exibir o entalhe setting.macnotch.description = Reinicialização necessária para aplicar as alterações steam.friendsonly = Amigos apenas steam.friendsonly.tooltip = Se apenas amigos do Steam poderão entrar no seu jogo.\nDesmarcar esta caixa tornará seu jogo público - qualquer pessoa pode entrar. -setting.maxmagnificationmultiplierpercent.name = Min Camera Distance -setting.minmagnificationmultiplierpercent.name = Max Camera Distance +setting.maxmagnificationmultiplierpercent.name = Distância Mínima da Câmera +setting.minmagnificationmultiplierpercent.name = Distância Máxima da Câmera setting.minmagnificationmultiplierpercent.description = High values may cause performance issues. public.beta = Note que as versões beta do jogo não podem fazer salas públicas. uiscale.reset = A escala da interface foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] segundos... @@ -1330,10 +1351,12 @@ keybind.title = Refazer teclas keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em dispositivos móveis. É unicamente suportado movimento básico. category.general.name = Geral category.view.name = Ver -category.command.name = Unit Command +category.command.name = Comando de Unidade category.multiplayer.name = Multijogador category.blocks.name = Selecionar bloco placement.blockselectkeys = \n[lightgray]Tecla: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Reaparecer keybind.control.name = Controlar unidade keybind.clear_building.name = Limpar construção @@ -1349,28 +1372,29 @@ keybind.pan.name = Câmera livre keybind.boost.name = Impulsionar keybind.command_mode.name = Modo de Comando keybind.command_queue.name = Unit Command Queue -keybind.create_control_group.name = Create Control Group -keybind.cancel_orders.name = Cancel Orders +keybind.create_control_group.name = Criar Grupo de Controle +keybind.cancel_orders.name = Cancelar Ordens -keybind.unit_stance_shoot.name = Unit Stance: Shoot -keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire -keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target -keybind.unit_stance_patrol.name = Unit Stance: Patrol -keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_shoot.name = Postura da Unidade: Atirar +keybind.unit_stance_hold_fire.name = Postura da Unidade: Segurar Fogo +keybind.unit_stance_pursue_target.name = Postura da Unidade: Perseguir Alvo +keybind.unit_stance_patrol.name = Postura da Unidade: Patrulha +keybind.unit_stance_ram.name = Postura da Unidade: Colisão +keybind.unit_stance_boost.name = Postura da Unidade: Impulso +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position -keybind.unit_command_move.name = Unit Command: Move -keybind.unit_command_repair.name = Unit Command: Repair -keybind.unit_command_rebuild.name = Unit Command: Rebuild -keybind.unit_command_assist.name = Unit Command: Assist -keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost -keybind.unit_command_load_units.name = Unit Command: Load Units -keybind.unit_command_load_blocks.name = Unit Command: Load Blocks -keybind.unit_command_unload_payload.name = Unit Command: Unload Payload -keybind.unit_command_enter_payload.name = Unit Command: Enter Payload -keybind.unit_command_loop_payload.name = Unit Command: Loop Unit Transfer +keybind.unit_command_move.name = Comando de Unidade: Mover +keybind.unit_command_repair.name = Comando de Unidade: Reparar +keybind.unit_command_rebuild.name = Comando de Unidade: Reconstruir +keybind.unit_command_assist.name = Comando de Unidade: Assistir +keybind.unit_command_mine.name = Comando de Unidade: Minerar +keybind.unit_command_load_units.name = Comando de Unidade: Carregar Unidades +keybind.unit_command_load_blocks.name = Comando de Unidade: Carregar Blocos +keybind.unit_command_unload_payload.name = Comando de Unidade: Descarregar Carga +keybind.unit_command_enter_payload.name = Comando de Unidade: Entrar na Carga +keybind.unit_command_loop_payload.name = Comando de Unidade: Loop de Transferência -keybind.rebuild_select.name = Rebuild Region +keybind.rebuild_select.name = Reconstruir Região keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu de Esquemas keybind.schematic_flip_x.name = Girar o Esquema no eixo X @@ -1396,10 +1420,10 @@ keybind.select.name = Selecionar keybind.diagonal_placement.name = Posicionamento Diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco -keybind.select_all_units.name = Select All Units -keybind.select_all_unit_factories.name = Select All Unit Factories -keybind.select_all_unit_transport.name = Select All Unit Transports -keybind.select_across_screen.name = Select Across Screen (Hold) +keybind.select_all_units.name = Selecionar Todas as Unidades +keybind.select_all_unit_factories.name = Selecionar Todas as Fábricas de Unidades +keybind.select_all_unit_transport.name = Selecionar Todos os Transportes de Unidades +keybind.select_across_screen.name = Selecionar Através da Tela (Segurar) keybind.deselect.name = Desmarcar keybind.pickupCargo.name = Pegar Carga keybind.dropCargo.name = Soltar Carga @@ -1407,7 +1431,7 @@ keybind.shoot.name = Atirar keybind.zoom.name = Ampliar keybind.menu.name = Menu keybind.pause.name = Pausar -keybind.skip_wave.name = Skip Wave +keybind.skip_wave.name = Pular Horda keybind.pause_building.name = Parar/Resumir a construção keybind.minimap.name = Minimapa keybind.planet_map.name = Mapa do Planeta @@ -1425,8 +1449,8 @@ keybind.chat_scroll.name = Rolar chat keybind.chat_mode.name = Mudar modo do chat keybind.drop_unit.name = Soltar unidade keybind.zoom_minimap.name = Ampliar minimapa -keybind.detach_camera.name = Toggle Free Camera -keybind.debug_hitboxes.name = Toggle Debug Hitboxes +keybind.detach_camera.name = Alternar Câmera Livre +keybind.debug_hitboxes.name = Alternar Hitboxes de Depuração mode.help.title = Descrição dos modos mode.survival.name = Sobrevivência mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. @@ -1439,73 +1463,74 @@ mode.attack.name = Ataque mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. mode.custom = Regras personalizadas -rules.invaliddata = Invalid clipboard data. -rules.hidebannedblocks = Hide Banned Blocks +rules.invaliddata = Dados da área de transferência inválidos. +rules.hidebannedblocks = Ocultar Blocos Banidos rules.infiniteresources = Recursos infinitos -rules.fillitems = Fill Core With Items +rules.fillitems = Encher Núcleo com Itens rules.onlydepositcore = Permitir apenas depósito no núcleo -rules.coreunloaders = Allow Core Unloaders -rules.coreunloaders.info = When enabled, Serpulo unloaders can take items from the core.\nDoes not affect Erekir unloaders. -rules.derelictrepair = Allow Derelict Block Repair +rules.coreunloaders = Permitir Descarregadores de Núcleo +rules.coreunloaders.info = Quando ativado, descarregadores de Serpulo podem tirar itens do núcleo.\nNão afeta descarregadores de Erekir. +rules.derelictrepair = Permitir Reparo de Blocos Abandonados rules.reactorexplosions = Reatores explodem rules.coreincinerates = Núcleo incinera itens em excesso rules.disableworldprocessors = Desativar processadores mundiais rules.schematic = Permitir Esquemas rules.wavetimer = Tempo de horda -rules.wavesending = Wave Sending -rules.allowedit = Allow Editing Rules -rules.allowedit.info = When enabled, the player can edit rules in-game via the button in the bottom left corner of the Pause menu. -rules.alloweditworldprocessors = Allow Editing World Processors -rules.alloweditworldprocessors.info = When enabled, world logic blocks can be placed and edited even outside the editor. +rules.wavesending = Envio de Horda +rules.allowedit = Permitir Editar Regras +rules.allowedit.info = Quando ativado, o jogador pode editar as regras em jogo através do botão no menu de Pausa. +rules.alloweditworldprocessors = Permitir Editar Processadores do Mundo +rules.alloweditworldprocessors.info = Quando ativado, blocos de lógica do mundo podem ser colocados e editados fora do editor. rules.waves = Hordas rules.airUseSpawns = Air units use spawn points -rules.wavespawnatcores = Waves Spawn At Cores -rules.wavespawnatcores.info = When enabled in attack mode, waves spawn near all enemy cores. +rules.wavespawnatcores = Hordas Surgem nos Núcleos +rules.wavespawnatcores.info = Quando ativado no modo de ataque, as hordas surgem perto de todos os núcleos inimigos. rules.attack = Modo de ataque -rules.buildai = Base Builder AI -rules.buildaitier = Builder AI Tier -rules.rtsai = RTS AI -rules.rtsai.campaign = RTS Attack AI -rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. -rules.clearsectoronloss = Clear Sector On Loss -rules.clearsectoronloss.info = When the sector is lost, player buildings from the previous attempt will not carry over. +rules.buildai = IA de Construção de Base +rules.buildaitier = Nível da IA de Construção +rules.rtsai = IA de RTS +rules.rtsai.campaign = IA de Ataque RTS +rules.rtsai.campaign.info = Em mapas de ataque, faz com que as unidades se agrupem e ataquem as bases do jogador de forma mais inteligente. +rules.clearsectoronloss = Limpar Setor ao Perder +rules.clearsectoronloss.info = Quando o setor é perdido, as construções do jogador da tentativa anterior não serão mantidas. rules.rtsminsquadsize = Tamanho mínimo do esquadrão rules.rtsmaxsquadsize = Tamanho máximo do esquadrão rules.rtsminattackweight = Peso Mínimo de Ataque rules.cleanupdeadteams = Limpar construções de equipes derrotadas (PvP) rules.corecapture = Capturar Núcleo na Destruição rules.polygoncoreprotection = Proteção de núcleo poligonal -rules.placerangecheck = Placement Range Check -rules.protectcores = Protect Cores -rules.protectcores.info = When disabled, the core no-build radius won't affect this team.\nPlayers won't be assigned to unprotected teams. -rules.checkplacement = Check Placement -rules.checkplacement.info = When disabled, buildings of this team are ignored in placement range checks. +rules.placerangecheck = Verificação de Alcance de Colocação +rules.protectcores = Proteger Núcleos +rules.protectcores.info = Quando desativado, o raio proibido de construção do núcleo não afetará esta equipe. +rules.checkplacement = Verificar Colocação +rules.checkplacement.info = Quando desativado, as construções desta equipe são ignoradas nas verificações de alcance de colocação. rules.enemyCheat = Recursos de IA Infinitos rules.blockhealthmultiplier = Multiplicador de vida do bloco rules.blockdamagemultiplier = Multiplicador de dano do bloco +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Multiplicador de velocidade de criação de unidade -rules.unitcostmultiplier = Unit Cost Multiplier +rules.unitcostmultiplier = Multiplicador de Custo de Unidade rules.unithealthmultiplier = Multiplicador de vida de unidade rules.unitdamagemultiplier = Multiplicador de dano de Unidade -rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier -rules.unitminespeedmultiplier = Unit Mine Speed Multiplier -rules.logicunitcontrol = Logic Unit Control -rules.logicunitbuild = Logic Unit Building -rules.logicunitdeconstruct = Logic Unit Deconstruction +rules.unitcrashdamagemultiplier = Multiplicador de Dano de Colisão de Unidade +rules.unitminespeedmultiplier = Multiplicador de Velocidade de Mineração de Unidade +rules.logicunitcontrol = Controle de Unidade por Lógica +rules.logicunitbuild = Construção de Unidade por Lógica +rules.logicunitdeconstruct = Desconstrução de Unidade por Lógica rules.solarmultiplier = Multiplicador de Energia Solar rules.unitcapvariable = Núcleos contribuem para a capacidade da unidade -rules.unitpayloadsexplode = Carried Payloads Explode With The Unit +rules.unitpayloadsexplode = Cargas Transportadas Explodem com a Unidade rules.unitcap = Capacidade base da Unidade rules.limitarea = Limitar área do mapa rules.enemycorebuildradius = Raio de "não-criação" de núcleo inimigo:[lightgray] (blocos) -rules.extracorebuildradius = Extra No-Build Radius:[lightgray] (tiles) +rules.extracorebuildradius = Raio Extra Proibido de Construção:[lightgray] (blocos) rules.wavespacing = Espaço de tempo entre hordas:[lightgray] (seg) rules.initialwavespacing = Espaçamento de onda inicial:[lightgray] (seg) rules.buildcostmultiplier = Multiplicador de custo de construção rules.buildspeedmultiplier = Multiplicador de velocidade de construção rules.deconstructrefundmultiplier = Multiplicador de reembolso de desconstrução rules.waitForWaveToEnd = Hordas esperam inimigos -rules.wavelimit = Map Ends After Wave +rules.wavelimit = Mapa Termina Após Horda rules.dropzoneradius = Raio da zona de spawn:[lightgray] (blocos) rules.unitammo = Unidades requerem munição rules.enemyteam = Time Inimigo @@ -1520,12 +1545,13 @@ rules.title.teams = Times rules.title.planet = Planeta rules.lighting = Iluminação rules.fog = Névoa de Guerra -rules.invasions = Enemy Sector Invasions -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) -rules.showspawns = Show Enemy Spawns -rules.randomwaveai = Unpredictable Wave AI +rules.invasions = Invasões de Setores Inimigos +rules.legacylaunchpads = Mecânicas Legadas de Plataforma de Lançamento +rules.legacylaunchpads.info = Permite usar plataformas de lançamento sem plataformas de pouso, como na v7.0. +landingpad.legacy.disabled = [scarlet]\ue815 Desativado[lightgray] (Plataformas de Lançamento Legadas ativadas) +rules.showspawns = Mostrar Spawns Inimigos +rules.randomwaveai = IA de Horda Imprevisível +rules.pauseDisabled = Disable Pausing rules.fire = Fogo rules.anyenv = rules.explosions = Dano de explosão de unidades/blocos @@ -1535,31 +1561,31 @@ rules.weather.frequency = Frequência: rules.weather.always = Sempre rules.weather.duration = Duração: -rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. -rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. -rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. +rules.randomwaveai.info = Faz com que unidades de horda foquem em estruturas aleatórias em vez de atacar diretamente o núcleo. +rules.placerangecheck.info = Evita que jogadores coloquem qualquer coisa perto de construções inimigas. +rules.onlydepositcore.info = Evita que as unidades depositem itens em quaisquer construções exceto núcleos. -database-category.item = Items -database-category.liquid = Fluids -database-category.unit = Units -database-category.block = Blocks -database-category.status = Status Effects -database-category.sector = Sectors -database-category.team = Factions +database-category.item = Itens +database-category.liquid = Fluidos +database-category.unit = Unidades +database-category.block = Blocos +database-category.status = Efeitos de Status +database-category.sector = Setores +database-category.team = Facções -database-tag.turret = Turret -database-tag.production = Production -database-tag.distribution = Distribution -database-tag.liquid = Liquid -database-tag.power = Power -database-tag.defense = Defense -database-tag.crafting = Crafting -database-tag.units = Units -database-tag.effect = Utility -database-tag.logic = Logic -database-tag.unit-air = Air +database-tag.turret = Torreta +database-tag.production = Produção +database-tag.distribution = Distribuição +database-tag.liquid = Líquido +database-tag.power = Energia +database-tag.defense = Defesa +database-tag.crafting = Produção +database-tag.units = Unidades +database-tag.effect = Utilitário +database-tag.logic = Lógica +database-tag.unit-air = Aéreo database-tag.unit-naval = Naval -database-tag.unit-ground = Ground +database-tag.unit-ground = Terrestre wallore = (Muro) @@ -1584,14 +1610,14 @@ item.beryllium.name = Berílio item.tungsten.name = Tungstênio item.oxide.name = Óxido item.carbide.name = Carboneto -item.dormant-cyst.name = Dormant Cyst +item.dormant-cyst.name = Cisto Dormente liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Criofluido liquid.neoplasm.name = Neoplasma -liquid.arkycite.name = Arkycite +liquid.arkycite.name = Arkycita liquid.gallium.name = Gálio liquid.ozone.name = Ozônio liquid.hydrogen.name = Hidrogênio @@ -1694,8 +1720,8 @@ block.graphite-press.name = Prensa de grafite block.multi-press.name = Multi-Prensa block.constructing = {0}\n[lightgray](Construindo) block.spawn.name = Área Inimiga -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore +block.remove-wall.name = Remover Muro +block.remove-ore.name = Remover Minério block.core-shard.name = Fragmento do Núcleo block.core-foundation.name = Fundação do Núcleo block.core-nucleus.name = Centro do Núcleo @@ -1752,10 +1778,10 @@ block.metal-tiles-13.name = Metal Tiles 13 block.metal-wall-1.name = Metal Wall 1 block.metal-wall-2.name = Metal Wall 2 block.metal-wall-3.name = Metal Wall 3 -block.colored-floor.name = Colored Floor -block.colored-wall.name = Colored Wall -block.character-overlay.name = Character Overlay -block.character-overlay-white.name = Character Overlay (White) +block.colored-floor.name = Chão Colorido +block.colored-wall.name = Muro Colorido +block.character-overlay.name = Sobreposição de Caractere +block.character-overlay-white.name = Sobreposição de Caractere (Branco) block.rune-overlay.name = Rune Overlay block.rune-overlay-crux.name = Rune Overlay (Crux) block.dark-panel-1.name = Painel Escuro 1 @@ -1795,9 +1821,9 @@ block.distributor.name = Distribuidor block.sorter.name = Ordenador block.inverted-sorter.name = Ordenador invertido block.message.name = Mensagem -block.reinforced-message.name = Reinforced Message -block.world-message.name = World Message -block.world-switch.name = World Switch +block.reinforced-message.name = Mensagem Reforçada +block.world-message.name = Mensagem do Mundo +block.world-switch.name = Interruptor do Mundo block.illuminator.name = Iluminador block.overflow-gate.name = Portão de Sobrecarga block.underflow-gate.name = Portão de Sobrecarga Invertido @@ -1874,15 +1900,15 @@ block.fuse.name = Fuse block.shock-mine.name = Mina de Choque block.overdrive-projector.name = Projetor de Sobrecarga block.force-projector.name = Projetor de Campo de Força -block.arc.name = Arc +block.arc.name = Arco block.rtg-generator.name = Gerador GTR block.spectre.name = Spectre block.meltdown.name = Meltdown block.foreshadow.name = Foreshadow block.container.name = Contêiner -block.launch-pad.name = Plataforma de Lançamento -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.launch-pad.name = Plataforma de Lançamento [lightgray](Legado) +block.advanced-launch-pad.name = Plataforma de Lançamento +block.landing-pad.name = Plataforma de Pouso block.segment.name = Segment block.ground-factory.name = Fábrica de Unidades Terrestres @@ -1897,7 +1923,7 @@ block.payload-router.name = Roteador de Carga block.duct.name = Duto block.duct-router.name = Duto Roteador block.duct-bridge.name = Duto-Ponte -block.large-payload-mass-driver.name = Large Payload Mass Driver +block.large-payload-mass-driver.name = Catapulta de Carga Grande block.payload-void.name = Destruidor de Cargas block.payload-source.name = Criador de Cargas block.disassembler.name = Desmontador @@ -1974,7 +2000,7 @@ block.red-ice-boulder.name = Pedregulho de Gelo Vermelho block.rhyolite-boulder.name = Pedregulho de Riólito block.red-stone-boulder.name = Pedregulho de Pedra Vermelha block.graphitic-wall.name = Parede Grafítica -block.silicon-arc-furnace.name = Silicon Arc Furnace +block.silicon-arc-furnace.name = Forno a Arco de Silício block.electrolyzer.name = Eletrolisador block.atmospheric-concentrator.name = Concentrador Atmosférico block.oxidation-chamber.name = Câmara de Oxidação @@ -1982,8 +2008,8 @@ block.electric-heater.name = Aquecedor Elétrico block.slag-heater.name = Aquecedor de Escória block.phase-heater.name = Aquecedor de Fase block.heat-redirector.name = Redirecionador de Calor -block.small-heat-redirector.name = Small Heat Redirector -block.heat-router.name = Heat Router +block.small-heat-redirector.name = Redirecionador de Calor Pequeno +block.heat-router.name = Roteador de Calor block.slag-incinerator.name = Incinerador de Escória block.carbide-crucible.name = Crisol de Carboneto block.slag-centrifuge.name = Centrifugador de Escória @@ -2030,7 +2056,7 @@ block.chemical-combustion-chamber.name = Câmara de Combustão Química block.pyrolysis-generator.name = Gerador de Pirólise block.vent-condenser.name = Condensador de Ventilação block.cliff-crusher.name = Esmagador de Penhasco -block.large-cliff-crusher.name = Advanced Cliff Crusher +block.large-cliff-crusher.name = Esmagador de Penhasco Avançado block.plasma-bore.name = Mineradora de Plasma block.large-plasma-bore.name = Mineradora de Plasma Grande block.impact-drill.name = Broca de Impacto @@ -2040,13 +2066,13 @@ block.core-citadel.name = Cidadela do Núcleo block.core-acropolis.name = Núcleo Acrópole block.reinforced-container.name = Contêiner Reforçado block.reinforced-vault.name = Cofre Rreforçado -block.breach.name = Breach -block.sublimate.name = Sublimate -block.titan.name = Titan -block.disperse.name = Disperse -block.afflict.name = Afflict +block.breach.name = Brecha +block.sublimate.name = Sublimador +block.titan.name = Titã +block.disperse.name = Dispersor +block.afflict.name = Aflição block.lustre.name = Lustre -block.scathe.name = Scathe +block.scathe.name = Dano block.tank-refabricator.name = Refabricador de Tanque block.mech-refabricator.name = Refabricador de Mech block.ship-refabricator.name = Refrabricador de Nave @@ -2057,9 +2083,10 @@ block.reinforced-payload-conveyor.name = Esteira de Carga Reforçada block.reinforced-payload-router.name = Roteador de Carga Reforçado block.payload-mass-driver.name = Catapulta de Carga Eletromagnética block.small-deconstructor.name = Desconstrutor Pequeno -block.canvas.name = Canvas -block.world-processor.name = World Processor -block.world-cell.name = World Cell +block.canvas.name = Tela +block.large-canvas.name = Large Canvas +block.world-processor.name = Processador do Mundo +block.world-cell.name = Célula do Mundo block.tank-fabricator.name = Fabricador de Tanque block.mech-fabricator.name = Fabricador de Mech block.ship-fabricator.name = Fabricador de Nave @@ -2067,8 +2094,8 @@ block.prime-refabricator.name = Refabricador Prime block.unit-repair-tower.name = Torre de Reparo de Unidade block.diffuse.name = Diffuse block.basic-assembler-module.name = Módulo Básico do Montador -block.smite.name = Smite -block.malign.name = Malign +block.smite.name = Punição +block.malign.name = Maligno block.flux-reactor.name = Reator de Fluxo block.neoplasia-reactor.name = Reactor de Neoplasia @@ -2078,7 +2105,7 @@ block.logic-processor.name = Processador Lógico block.hyper-processor.name = Hiper Processador block.logic-display.name = Monitor Lógico block.large-logic-display.name = Monitor Lógico Grande -block.tile-logic-display.name = Tiled Logic Display +block.tile-logic-display.name = Monitor Lógico em Mosaico block.memory-cell.name = Célula de Memória block.memory-bank.name = Banco de Memória @@ -2111,7 +2138,7 @@ hint.launch = Quando recursos suficientes forem coletados, você pode [accent]La hint.launch.mobile = Quando recursos suficientes forem coletados, você pode [accent]Lançar[] selecionando setores próximos a partir do :map: [accent]Mapa[] no :menu: [accent]Menu[]. hint.schematicSelect = Segure [accent][[F][] e arraste para selecionar blocos para copiar e colar.\n\n[accent][[Middle Click][] para copiar um bloco só. hint.rebuildSelect = Segure [accent][[B][] e arraste para selecionar blocos destruídos.\nIsso irá reconstruí-los automaticamente. -hint.rebuildSelect.mobile = Select the :copy: copy button, then tap the :wrench: rebuild button and drag to select destroyed block plans.\nThis will rebuild them automatically. +hint.rebuildSelect.mobile = Selecione o botão :copy: copiar, então toque no botão :wrench: reconstruir e arraste para selecionar planos de blocos destruídos.\nIsso os reconstruirá automaticamente. hint.conveyorPathfind = Segure [accent][[L-Ctrl][] enquanto arrasta as esteiras para gerar automaticamente um caminho. hint.conveyorPathfind.mobile = Ative o :diagonal: [accent]modo diagonal[] e arraste as esteiras para gerar automaticamente um caminho. hint.boost = Segure [accent][[L-Shift][] para voar sobre obstáculos com a sua unidade.\n\nApenas algumas unidades terrestres tem propulsores. @@ -2120,11 +2147,10 @@ hint.payloadPickup.mobile = [accent]Toque e segure[] um pequeno bloco ou unidade hint.payloadDrop = Pressione [accent]][] para soltar a carga. hint.payloadDrop.mobile = [accent]Toque e segure[] em um local vazio para soltar ali a carga. hint.waveFire = Torretas [accent]Onda[] com munição de água vão apagar automaticamente incêndios próximos. -hint.generator = :combustion-generator: [accent]Geradores a Combustão[] queimam carvão e transmitem energia aos blocos ao lado.\n\nO alcance da transmissão de energia pode ser aumentado com :power-node: [accent]Células de Energia[]. hint.guardian = Unidades [accent]Guardião[] são blindadas. Munições fracas como [accent]Cobre[] e [accent]Chumbo[] são [scarlet]não efetivas[].\n\nUse torretas melhores ou :graphite: [accent]Grafite[] :duo:Duo/:salvo:Salvo como munição para derrotar Guardiões. hint.coreUpgrade = Núcleos podem ser melhorados [accent]colocando núcelos melhores sobre eles[].\n\nColoque uma :core-foundation: [accent]Fundação do Núcleo[] sobre o :core-shard: [accent]Fragmento do Núcleo[]. Tenha certeza de que está livre de obstruções próximas. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. -hint.cannotUpgrade = A [red]:tree:[] icon over a payload unit indicates that its upgraded version is not researched yet.\n\nUnit upgrades must be researched in the [accent]:tree: tech tree[] before they can be produced in reconstructors. +hint.cannotUpgrade = Um ícone [red]:tree:[] sobre uma unidade de carga indica que sua versão melhorada ainda não foi pesquisada.\n\nMelhorias de unidade devem ser pesquisadas na [accent]:tree: árvore tecnológica[] antes de poderem ser produzidas em reconstrutores. hint.presetLaunch = [accent]Zona de setores[] cinzas, como a [accent]Floresta Congelada[], podem ser lançadas de qualquer lugar. Elas não precisam da captura de território próximo.\n\n[accent]Setores numerados[], como esse aqui, são [accent]opcionais[]. hint.presetDifficulty = Esse setor tem um [scarlet]alto nível de ameaça inimiga[].\nIr para esse setores [accent]não é recomendado[] sem ter tecnologia e preparação adequadas. hint.coreIncinerate = Depois que o núcleo ter recebido até a capacidade máxima de um item, qualquer item do mesmo tipo que ele receber será [accent]incinerado[]. @@ -2152,33 +2178,43 @@ gz.zone2 = Qualquer coisa construida nesta área será destruida quando uma hord gz.zone3 = Uma horda vai começar agora\nSe prepare. gz.finish = Construa mais torretas, minere mais recursos,\ne se defenda de todas as hordas para [accent]capturar o setor[]. -fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. -fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. +ff.coal = Use :mechanical-drill: [accent]Brocas Mecânicas[] para minerar :ore-coal: [accent]carvão[]. +ff.graphitepress = :tree: Pesquise e coloque uma :graphite-press: [accent]Prensa de Grafite[]. +ff.craft = Mova :coal: carvão para a :graphite-press: [accent]Prensa de Grafite[].\nEla enviará :graphite: grafite para todas as esteiras próximas.\nMova o :graphite: grafite de saída da :graphite-press: [accent]Prensa de Grafite[] para o núcleo. +ff.generator = :coal: Carvão também pode ser usado como combustível em :combustion-generator: [accent]Geradores de Combustão[].\nPesquise e coloque um :combustion-generator: [accent]Gerador de Combustão[]. +ff.coalpower = Coloque :coal: carvão no gerador para produzir [accent]:power: energia[]. +ff.coalpower.objective = :combustion-generator: Produzir Energia +ff.node = :power-node: [accent]Nós de Energia[] transmitem energia para blocos próximos no alcance.\nPesquise e coloque um :power-node: [accent]Nó de Energia[] perto do gerador. +ff.battery = :battery: [accent]Baterias[] armazenam energia.\nPesquise e coloque uma :battery: [accent]Bateria[] perto do nó. +ff.arc = :arc: [accent]Arc[] torretas requerem energia para funcionar. Pesquise e coloque uma torreta :arc: [accent]Arc[] perto de um nó de energia. -frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Research and reconstruct\na []:dagger:[accent] dagger to a []:mace:[accent] mace. -frontier.tutorial2 = Enemy waves send [accent]infinitely[] until all enemy cores are [unlaunched]destroyed. -frontier.tutorial3 = [accent]Attack the enemy base fast to prevent waves from getting too high[]. +fungalpass.tutorial1 = Use [accent]unidades[] para defender construções e atacar o inimigo.\nPesquise e coloque uma :ground-factory: [accent]fábrica terrestre[]. +fungalpass.tutorial2 = Selecione unidades :dagger: [accent]Dagger[] na fábrica.\nProduza 3 unidades. -atolls.destroy1 = Destroy the 2 enemy [accent]foundation cores[] first.\n[accent]Gain access to thorium[]. -atolls.mega1 = Enter [accent]command mode[] and select the :mega:[accent]Mega[] units. -atolls.mega2 = Select the \ue87b [accent]Load Units[] command to have Mega units to pick up ground units. -atolls.mega3 = Move the Mega units [accent]above[] ground units to load them in. -atolls.mega4 = [accent]Drop ground units here to attack. -atolls.mega5 = Select the \ue879 [accent]Unload Payload[] command to have Mega units drop their carried units. -atolls.mega6 = Units will be [accent]automatically dropped[] while the \ue879 Unload Payload command is selected. -atolls.mega7 = Mega units [accent]will not[] drop ground units while they are above walls or deep water. -atolls.mega8 = [accent]Drop naval units here to attack.[] -atolls.attack1 = 1: Drop ground units here to attack from this location. -atolls.attack2 = 2: Alternatively, drop naval units here to launch a surprise attack. -atolls.carry1 = Carrying ground units requires :mega:[accent]Mega[] units. -atolls.carry2 = 1: Command Mega units to [accent]move over[] the ground units. -atolls.carry3 = 2: Select the \ue87b [accent]Load Units[] command in order to pick up the ground units with the Mega units. -atolls.carry4 = 3: Command and move the Mega carriers [accent]loaded with units[]. -atolls.carry5 = 4: Select the \ue879 [accent]'Unload Payload'[] command in order for the Mega units to drop the ground units. -atolls.carry6 = These steps can be reviewed [accent]here[]. -atolls.carry7 = Follow these instructions to airdrop more units near the enemy base. -atolls.noairunit = This base is too well-fortified to destroy with air units. -atolls.2strategies = There are two strategies to destroy this base. +frontier.tutorial1 = O :additive-reconstructor: [accent]Reconstrutor Aditivo[]\nmelhora unidades de nível 1 para o nível 2\nusando :silicon: silício e :graphite: grafite.\n\n[accent]Pesquise e reconstrua\numa []:dagger:[accent] dagger para uma []:mace:[accent] mace. +frontier.tutorial2 = Hordas inimigas atacam [accent]infinitamente[] até que todos os núcleos inimigos sejam [unlaunched]destruídos. +frontier.tutorial3 = [accent]Ataque a base inimiga rápido para evitar que as hordas fiquem muito fortes[]. + +atolls.destroy1 = Destrua os 2 [accent]núcleos de fundação[] inimigos primeiro.\n[accent]Ganhe acesso ao tório[]. +atolls.mega1 = Entre no [accent]modo de comando[] e selecione as unidades :mega:[accent]Mega[]. +atolls.mega2 = Selecione o comando \ue87b [accent]Carregar Unidades[] para que as unidades Mega peguem unidades terrestres. +atolls.mega3 = Mova as unidades Mega [accent]acima[] das unidades terrestres para carregá-las. +atolls.mega4 = [accent]Solte as unidades terrestres aqui para atacar. +atolls.mega5 = Selecione o comando \ue879 [accent]Descarregar Carga[] para que as unidades Mega soltem suas unidades carregadas. +atolls.mega6 = As unidades serão [accent]automaticamente soltas[] enquanto o comando \ue879 Descarregar Carga estiver selecionado. +atolls.mega7 = Unidades Mega [accent]não[] soltarão unidades terrestres enquanto estiverem sobre muros ou águas profundas. +atolls.mega8 = [accent]Solte unidades navais aqui para atacar.[] +atolls.attack1 = 1: Solte unidades terrestres aqui para atacar desta localização. +atolls.attack2 = 2: Alternativamente, solte unidades navais aqui para lançar um ataque surpresa. +atolls.carry1 = Carregar unidades terrestres requer unidades :mega:[accent]Mega[]. +atolls.carry2 = 1: Comande as unidades Mega para [accent]se moverem sobre[] as unidades terrestres. +atolls.carry3 = 2: Selecione o comando \ue87b [accent]Carregar Unidades[] para pegar as unidades terrestres com as unidades Mega. +atolls.carry4 = 3: Comande e mova os transportadores Mega [accent]carregados com unidades[]. +atolls.carry5 = 4: Selecione o comando \ue879 [accent]'Descarregar Carga'[] para que as unidades Mega soltem as unidades terrestres. +atolls.carry6 = Estes passos podem ser revisados [accent]aqui[]. +atolls.carry7 = Siga estas instruções para lançar mais unidades perto da base inimiga. +atolls.noairunit = Esta base é muito bem fortificada para ser destruída com unidades aéreas. +atolls.2strategies = Existem duas estratégias para destruir esta base. onset.mine = Clique para minerar :beryllium: [accent]berílio[] das paredes.\n\nUse [accent][[WASD] para se mover. onset.mine.mobile = Toque para minerar :beryllium: [accent]berílio[] das paredes. @@ -2198,19 +2234,19 @@ onset.turrets = Unidades são efetivas, mas [accent]torretas[] proveem melhores onset.turretammo = Abasteça a torreta com [accent]munição de berílio.[] onset.walls = [accent]Muros[] podem previnir danos recebidos de atingir as construções.\nColoque :beryllium-wall: [accent]muros de berílio[] em volta das torretas. onset.enemies = Inimigo vindo, se prepare. -onset.defenses = [accent]Set up defenses:[lightgray] {0} +onset.defenses = [accent]Preparar defesas:[lightgray] {0} onset.attack = O inimigo está vulnerável. Contra ataque. onset.cores = Novos núcleos podem ser colocados em [accent]ladrilhos de núcleo[].\nNovos núcleos funcionam como bases avançadas e compartilham seus recursos com outros núcleos.\nColoque um :core-bastion: núcleo. onset.detect = O inimigo poderá te detectar em 2 minutos.\nConstrua defesas, mineração e produção. -onset.commandmode = Hold [accent]shift[] to enter [accent]command mode[].\n[accent]Left-click and drag[] to select units.\n[accent]Right-click[] to order selected units to move or attack. -onset.commandmode.mobile = Press the [accent]command button[] to enter [accent]command mode[].\nHold down a finger, then [accent]drag[] to select units.\n[accent]Tap[] to order selected units to move or attack. -aegis.tungsten = Tungsten can be mined using an [accent]impact drill[].\nThis structure requires [accent]water[] and [accent]power[]. +onset.commandmode = Segure [accent]shift[] para entrar no [accent]modo de comando[].\n[accent]Clique-esquerdo e arraste[] para selecionar unidades.\n[accent]Clique-direito[] para ordenar o movimento ou ataque das unidades selecionadas. +onset.commandmode.mobile = Pressione o [accent]botão de comando[] para entrar no [accent]modo de comando[].\nSegure um dedo e [accent]arraste[] para selecionar unidades.\n[accent]Toque[] para ordenar o movimento ou ataque das unidades selecionadas. +aegis.tungsten = O tungstênio pode ser minerado usando uma [accent]broca de impacto[].\nEsta estrutura requer [accent]água[] e [accent]energia[]. -split.pickup = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(Default keys are [ and ] to pick up and drop) -split.pickup.mobile = Some blocks can be picked up by the core unit.\nPick up this [accent]container[] and place it onto the [accent]payload loader[].\n(To pick up or drop something, long-press it.) -split.acquire = You must acquire some tungsten to build units. -split.build = Units must be transported to the other side of the wall.\nPlace two [accent]Payload Mass Drivers[], one on each side of the wall.\nSet up the link by pressing one of them, then selecting the other. -split.container = Similar to the container, units can also be transported using a [accent]Payload Mass Driver[].\nPlace a unit fabricator adjacent to a mass driver to load them, then send them across the wall to attack the enemy base. +split.pickup = Alguns blocos podem ser pegos pela unidade do núcleo.\nPegue este [accent]contêiner[] e coloque-o no [accent]carregador de carga[].\n(Tecla padrão [ e ] para pegar e soltar) +split.pickup.mobile = Alguns blocos podem ser pegos pela unidade do núcleo.\nPegue este [accent]contêiner[] e coloque-o no [accent]carregador de carga[].\n(Para pegar ou soltar algo, segure-o por um tempo.) +split.acquire = Você deve adquirir um pouco de tungstênio para construir unidades. +split.build = As unidades devem ser transportadas para o outro lado do muro.\nColoque duas [accent]Catapultas de Carga[], uma de cada lado do muro.\nConfigure a ligação pressionando uma delas e selecionando a outra. +split.container = Semelhante ao contêiner, as unidades também podem ser transportadas usando uma [accent]Catapulta de Carga[].\nColoque um fabricador de unidades adjacente a uma catapulta para carregá-las, depois envie-as através do muro. item.copper.description = Usado em todos os tipos de construção e munição. item.copper.details = Cobre. Metal anormalmente abundante em Serpulo. Estruturalmente fraco a não ser que seja reforçado. @@ -2258,8 +2294,8 @@ block.derelict = \uf77e [lightgray]Abandonado block.armored-conveyor.description = Move os itens com a mesma velocidade das esteiras de titânio, mas tem mais armadura. Não aceita itens dos lados de nada além de outras esteiras. block.illuminator.description = Uma fonte de luz pequena, configurável e compacta. Precisa de energia para funcionar. block.message.description = Mostra uma mensagem. Usado para comunicação entre aliados. -block.reinforced-message.description = Stores a message for communication between allies. -block.world-message.description = A message block for use in mapmaking. Cannot be destroyed. +block.reinforced-message.description = Armazena uma mensagem para comunicação entre aliados. +block.world-message.description = Um bloco de mensagem para uso na criação de mapas. Não pode ser destruído. block.graphite-press.description = Comprime carvão em Grafite. block.multi-press.description = Comprime carvão em Grafite. Usa água como refrigerador. block.silicon-smelter.description = Refina silício com carvão e areia. @@ -2296,10 +2332,10 @@ block.phase-wall.description = Um muro revestido com tecido de fase. Reflete a m block.phase-wall-large.description = Um muro revestido com tecido de fase. Reflete a maioria das balas ao impacto. Ocupa múltiplos blocos. block.surge-wall.description = Um bloco defensivo extremamente durável. Se carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. block.surge-wall-large.description = Um bloco defensivo extremamente durável. Se carrega com eletricidade no contato com as balas, soltando-as aleatoriamente. Ocupa multiplos blocos. -block.scrap-wall.description = Protects structures from enemy projectiles. -block.scrap-wall-large.description = Protects structures from enemy projectiles. -block.scrap-wall-huge.description = Protects structures from enemy projectiles. -block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. +block.scrap-wall.description = Protege estruturas de projéteis inimigos. +block.scrap-wall-large.description = Protege estruturas de projéteis inimigos. +block.scrap-wall-huge.description = Protege estruturas de projéteis inimigos. +block.scrap-wall-gigantic.description = Protege estruturas de projéteis inimigos. block.door.description = Uma pequeda porta. Pode ser aberta e fechada ao tocar. block.door-large.description = Uma grande porta. Pode ser aberta e fechada ao tocar. Ocupa múltiplos blocos. block.mender.description = Periodicamente repara blocos vizinhos.\nOpicionalmente usa silício para aumentar o alcance e a eficácia. @@ -2366,9 +2402,9 @@ block.vault.description = Armazena uma grande quantidade de itens de cada tipo. block.container.description = Armazena uma pequena quantidade de itens de cada tipo. Expande o armazenamento quando colocado próximo a um núcleo. O conteúdo pode ser recuperado com um descarregador. block.unloader.description = Descarrega o item selecionado dos blocos próximos. block.launch-pad.description = Lança lotes de itens para setores selecionados. -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.advanced-launch-pad.description = Lança lotes de itens para setores selecionados. Aceita apenas um tipo de item por vez. +block.advanced-launch-pad.details = Sistema suborbital para transporte de recursos ponto a ponto. +block.landing-pad.description = Recebe itens de plataformas de lançamento de outros setores. Requer grandes quantidades de água para proteger contra impactos de pouso. block.duo.description = Dispara balas alternadas em inimigos. block.scatter.description = Dispara tiros aglomerados de chumbo, sucata ou metavidro em unidades aéreas. block.scorch.description = Queima qualquer unidade que estiver próxima. Altamente efetivo se for de perto. @@ -2408,7 +2444,7 @@ block.memory-cell.description = Guarda informações para um processador lógico block.memory-bank.description = Guarda informações para um processador lógico. Capacidade alta. block.logic-display.description = Exibe gráficos arbitrários de um processador lógico. block.large-logic-display.description = Exibe gráficos arbitrários de um processador lógico. -block.tile-logic-display.description = Displays arbitrary graphics from a logic processor.\nSeamlessly connects to nearby tiled display blocks. +block.tile-logic-display.description = Exibe gráficos arbitrários de um processador lógico.\nConecta-se perfeitamente a blocos de exibição em mosaico próximos. block.interplanetary-accelerator.description = Uma enorme torre eletromagnética. Acelera a velocidade de fuga dos núcleos para o desdobramento interplanetário. block.repair-turret.description = Conserta continuamente a unidade danificada mais próxima a ela. Opcionalmente, aceita líquido refrigerante. @@ -2432,8 +2468,8 @@ block.electric-heater.description = Aquece blocos a frente. Requer grandes quant block.slag-heater.description = Aquece blocos a frente. Requer Escória. block.phase-heater.description = Aquece blocos a frente. Requer Tecido de Fase block.heat-redirector.description = Redireciona o calor acumulado para outros blocos. -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. -block.heat-router.description = Spreads accumulated heat in three output directions. +block.small-heat-redirector.description = Redireciona o calor acumulado para outros blocos. +block.heat-router.description = Espalha o calor acumulado em três direções de saída. block.electrolyzer.description = Converte Água em Hidrogênio e gás de Ozônio. block.atmospheric-concentrator.description = Concentra o Nitrogênio da atmosfera. Requer calor. block.surge-crucible.description = Forma Liga de Surto a partir de Escória e Silício. Requer calor. @@ -2478,7 +2514,7 @@ block.unit-cargo-loader.description = Constrói drones de carga. Os drones distr block.unit-cargo-unload-point.description = Atua como um ponto de descarga de drones de carga. Aceita itens que combinam com o filtro selecionado. block.beam-node.description = Transmite energia para outros blocos ortogonalmente. Armazena uma pequena quantidade de energia. block.beam-tower.description = Transmite energia para outros blocos ortogonalmente. Armazena uma grande quantidade de energia. Longo alcance. -block.beam-link.description = Transmits power over vast distances.\nOnly capable of connecting to adjacent structures or other beam links. +block.beam-link.description = Transmite energia por longas distâncias.\nSó é capaz de se conectar a estruturas adjacentes ou outros links de feixe. block.turbine-condenser.description = Gera energia quando colocado em ventilações. Produz uma pequena quantidade de água. block.chemical-combustion-chamber.description = Gera energia a partir de arkycite e ozônio. block.pyrolysis-generator.description = Gera grandes quantidades de energia a partir de arkycite e escória. Produz água como subproduto. @@ -2503,11 +2539,12 @@ block.small-deconstructor.description = Desconstrói as estruturas e unidades in block.reinforced-payload-conveyor.description = Movimenta cargas para frente. block.reinforced-payload-router.description = Distribui cargas em blocos adjacentes. Funciona como um ordenador quando um filtro é configurado. block.payload-mass-driver.description = = Estrutura de transporte de carga útil de longo alcance. Atira cargas recebidas para Catapultas de Carga Eletromagnéticas conectadas. -block.large-payload-mass-driver.description = Long-range payload transport structure. Shoots received payloads to linked payload mass drivers. +block.large-payload-mass-driver.description = Estrutura de transporte de carga de longo alcance. Dispara cargas recebidas para catapultas de carga ligadas. block.unit-repair-tower.description = Repara todas as unidades em sua proximidade. Requer ozônio. block.radar.description = Gradualmente descobre o terreno e as unidades inimigas em um grande raio. Requer energia. block.shockwave-tower.description = Danifica e destrói projéteis inimigos em um raio. Requer cianogênio. -block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.canvas.description = Exibe uma imagem simples com uma paleta predefinida. Editável. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Dispara projéteis padrões em todos os inimigos em volta. unit.mace.description = Dispara corrents de chamas em todos os inimigos em volta. @@ -2571,8 +2608,8 @@ unit.emanate.description = Constrói estruturas para defender o Núcelo Acrópol lst.read = Ler um número de uma célula de memória vinculada. lst.write = Escrever um número de uma célula de memória vinculada. lst.print = Adiciona texto ao buffer de impressão.\nNão exibe nada até [accent]Print Flush[] ser usado. -lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. -lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" +lst.printchar = Adiciona um caractere UTF-16 ou ícone de conteúdo ao buffer de impressão. +lst.format = Substitui o próximo espaço reservado no buffer de texto por um valor.\nNão irá fazer nada se o espaço reservado for inválido.\nEspaço reservado: "{[accent]número 0-9[]}"\nExemplo:\nformat "exemplo" lst.draw = Adicionar uma operação ao buffer de desenho.\nNão exibe nada até [accent]Draw Flush[] ser usado. lst.drawflush = Liberar operações [accent]Draw[] enfileiradas para um display. lst.printflush = Liberar operações [accent]Print[] enfileiradas para um bloco de mensagem. @@ -2595,26 +2632,26 @@ lst.getblock = Obtenha dados de blocos em qualquer local. lst.setblock = Defina os dados do bloco em qualquer local. lst.spawnunit = Gere uma unidade em um local. lst.applystatus = Aplique ou elimine um efeito de status de uma unidade. -lst.weathersense = Check if a type of weather is active. -lst.weatherset = Set the current state of a type of weather. +lst.weathersense = Verifica se um tipo de clima está ativo. +lst.weatherset = Define o estado atual de um tipo de clima. lst.spawnwave = Gerar uma onda. lst.explosion = Crie uma explosão em um local. lst.setrate = Defina a velocidade de execução do processador em instruções/tick. lst.fetch = Pesquise unidades, núcleos, jogadores ou edifícios por índice.\nOs índices começam em 0 e terminam na contagem retornada. lst.packcolor = Empacote [0, 1] componentes RGBA em um único número para desenho ou configuração de regra. -lst.unpackcolor = Unpack RGBA components from a color that was packed using Pack Color. +lst.unpackcolor = Descompacta componentes RGBA de uma cor compactada. lst.setrule = Defina uma regra do jogo. lst.flushmessage = Exibe uma mensagem na tela do buffer de texto.\nAguardará até que a mensagem anterior termine. lst.cutscene = Manipule a câmera do jogador. lst.setflag = Defina um sinalizador global que possa ser lido por todos os processadores. lst.getflag = Verifique se um sinalizador global está definido. lst.setprop = Define uma propriedade de uma unidade ou edifício. -lst.effect = Create a particle effect. +lst.effect = Criar um efeito de partícula. lst.sync = Sync a variable across the network.\nOnly invoked 10 times a second at most. -lst.playsound = Plays a sound.\nVolume and pan can be a global value, or calculated based on position. -lst.makemarker = Create a new logic marker in the world.\nAn ID to identify this marker must be provided.\nMarkers currently limited to 20,000 per world. +lst.playsound = Toca um som.\nVolume e direção podem ser globais ou calculados por posição. +lst.makemarker = Cria um novo marcador lógico no mundo.\nLimite de 20.000 por mundo. lst.setmarker = Set a property for a marker.\nThe ID used must be the same as in the Make Marker instruction. -lst.localeprint = Add map locale property value to the text buffer.\nTo set map locale bundles in map editor, check [accent]Map Info > Locale Bundles[].\nIf client is a mobile device, tries to print a property ending in ".mobile" first. +lst.localeprint = Adiciona o valor de uma propriedade de localidade do mapa ao buffer de texto.\nVeja em [accent]Info do Mapa > Pacotes de Localidade[]. lglobal.false = 0 lglobal.true = 1 @@ -2633,11 +2670,11 @@ lglobal.@waveTime = Countdown timer for waves, in seconds lglobal.@mapw = Map width in tiles lglobal.@maph = Map height in tiles -lglobal.sectionMap = Map -lglobal.sectionGeneral = General -lglobal.sectionNetwork = Network/Clientside [World Processor Only] -lglobal.sectionProcessor = Processor -lglobal.sectionLookup = Lookup +lglobal.sectionMap = Mapa +lglobal.sectionGeneral = Geral +lglobal.sectionNetwork = Rede/Lado do Cliente [Apenas Processador de Mundo] +lglobal.sectionProcessor = Processador +lglobal.sectionLookup = Consulta lglobal.@this = The logic block executing the code lglobal.@thisx = X coordinate of block executing the code @@ -2665,21 +2702,21 @@ lenum.shootp = Atire em uma unidade/edifício com previsão de velocidade. lenum.config = Configuração do edifício, por ex. item classificador. lenum.enabled = Se o bloco está ativado. -laccess.currentammotype = Current ammo item/liquid of a turret. -laccess.memorycapacity = Number of cells in a memory block. +laccess.currentammotype = Tipo de munição atual (item/líquido) de uma torreta. +laccess.memorycapacity = Número de células em um bloco de memória. laccess.color = Cor do iluminador. laccess.controller = Controlador de unidade. Se controlado pelo processador, retorna o processador.\nCaso contrário, retorna a própria unidade. laccess.dead = Se uma unidade/edifício está morta ou não é mais válida. laccess.controlled = Retorna:\n[accent]@ctrlProcessor[] se o controlador da unidade for o processador\n[accent]@ctrlPlayer[] se o controlador da unidade/edifício for o player\n[accent]@ctrlCommand[] se o controlador da unidade for um comando do player\nCaso contrário , 0. laccess.progress = Progresso da ação, 0 a 1.\nRetorna a produção, a recarga da torre ou o progresso da construção. laccess.speed = Velocidade máxima de uma unidade, em ladrilhos/seg. -laccess.size = Size of a unit/building or the length of a string. -laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. -laccess.displaywidth = Width of a display block in pixels. -laccess.displayheight = Height of a display block in pixels. +laccess.size = Tamanho de uma unidade/construção ou o comprimento de uma string. +laccess.id = ID de uma unidade/bloco/item/líquido.\nEsta é a operação inversa do lookup. +laccess.displaywidth = Largura de um bloco de monitor em pixels. +laccess.displayheight = Altura de um bloco de monitor em pixels. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display. -laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. -laccess.maxunits = Maximum units that a team can have.\nCan only be sensed from cores. +laccess.operations = Número de operações realizadas no bloco.\nPara monitores, retorna o número de operações drawflush. +laccess.maxunits = Unidades máximas que uma equipe pode ter.\nSó pode ser detectado de núcleos. lcategory.unknown = Desconhecido lcategory.unknown.description = Instruções não categorizadas. @@ -2713,13 +2750,13 @@ lenum.always = Sempre verdade. lenum.idiv = Divisão inteira. lenum.div = Divisão.\nRetorna [accent]null[] na divisão por zero. lenum.mod = Modulo. -lenum.emod = True modulo, result sign comes from the divisor. +lenum.emod = Módulo verdadeiro, o sinal do resultado vem do divisor. lenum.equal = Igual. Coage tipos.\nObjetos não nulos comparados com números tornam-se 1, caso contrário, 0. lenum.notequal = Não igual. Tipos de coerção. lenum.strictequal = Igualdade estrita. Não coage tipos.Pode ser usado para verificar [accent]null[]. lenum.shl = Deslocamento de bit para a esquerda. lenum.shr = Deslocamento de bits para a direita. -lenum.ushr = Unsigned bit-shift right. +lenum.ushr = Deslocamento de bits à direita não assinado. lenum.or = OU bit a bit. lenum.land = Lógico E. lenum.and = E bit a bit. @@ -2754,7 +2791,7 @@ lenum.attacker = Unidade com uma arma. lenum.enemy = Unidade inimiga. lenum.boss = Unidade Guardiã. lenum.flying = Unidade voadora. -lenum.ground = Ground unit. +lenum.ground = Unidade terrestre. lenum.player = Unidade controlada por um jogador. lenum.ore = Depósito de minério. @@ -2798,7 +2835,7 @@ unitlocate.outx = Coordenada X de saída. unitlocate.outy = Coordenada Y de saída. unitlocate.group = Grupo de construção para procurar. -playsound.limit = If true, prevents this sound from playing\nif it has already been played in the same frame. +playsound.limit = Se verdadeiro, evita que este som toque se já tiver sido tocado no mesmo frame. lenum.idle = Não se mova, mas continue construindo/minerando.\nO estado padrão. lenum.stop = Pare de mover/mineração/construção. @@ -2806,7 +2843,7 @@ lenum.unbind = Desabilite completamente o controle lógico.\nRetome AI padrão. lenum.move = Mover para a posição exata. lenum.approach = Aproxime-se de uma posição com um raio. lenum.pathfind = Pathfind para o spawn inimigo. -lenum.autopathfind = Automatically pathfinds to the nearest enemy core or drop point.\nThis is the same as standard wave enemy pathfinding. +lenum.autopathfind = Encontra caminho automaticamente para o núcleo inimigo ou ponto de queda mais próximo.\nIsso é o mesmo que o encontro de caminho padrão de inimigos de horda. lenum.target = Atire em uma posição. lenum.targetp = Atire em um alvo com previsão de velocidade. lenum.itemdrop = Solte um item. @@ -2817,41 +2854,41 @@ lenum.payenter = Entre/pouse no bloco de carga em que a unidade está. lenum.flag = Sinalizador de unidade numérica. lenum.mine = Mina em uma posição. lenum.build = Construa uma estrutura. -lenum.getblock = Fetch building, floor and block type at coordinates.\nUnit must be in range of the position, otherwise null is returned. +lenum.getblock = Busca construção, chão e tipo de bloco nas coordenadas.\nA unidade deve estar no alcance da posição, caso contrário, null é retornado. lenum.within = Verifique se a unidade está perto de uma posição. lenum.boost = Iniciar/parar o reforço. -lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle. -lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument. -lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size. -lenum.autoscale = Whether to scale marker corresponding to player's zoom level. -lenum.posi = Indexed position, used for line and quad markers with index zero being the first position. -lenum.uvi = Texture's position ranging from zero to one, used for quad markers. +lenum.flushtext = Envia o conteúdo do buffer de impressão para o marcador, se aplicável.\nSe fetch for verdadeiro, tenta buscar propriedades do pacote de localidade do mapa ou do jogo. +lenum.texture = Nome da textura direto do atlas do jogo (usando estilo kebab-case).\nSe printFlush for verdadeiro, consome o conteúdo do buffer de texto como argumento. +lenum.texturesize = Tamanho da textura em blocos. Valor zero escala a largura do marcador para o tamanho original da textura. +lenum.autoscale = Se deve escalar o marcador correspondente ao nível de zoom do jogador. +lenum.posi = Posição indexada, usada para marcadores de linha e quadrado com índice zero sendo a primeira posição. +lenum.uvi = Posição da textura variando de zero a um, usada para marcadores quadrados. lenum.colori = Indexed position, used for line and quad markers with index zero being the first color. -lenum.wavetimer = Whether the waves come automatically on a timer. If not, waves come when the play button is pressed. -lenum.wave = Current wave number. Can be anything in non-wave modes. -lenum.currentwavetime = Wave countdown in ticks. -lenum.waves = Whether waves are spawnable at all. -lenum.wavesending = Whether the waves can be manually summoned with the play button. -lenum.attackmode = Determines if gamemode is attack mode. -lenum.wavespacing = Time between waves in ticks. -lenum.enemycorebuildradius = No-build zone around enemy core radius. -lenum.dropzoneradius = Radius around enemy wave drop zones. -lenum.unitcap = Base unit cap. Can still be increased by blocks. -lenum.lighting = Whether ambient lighting is enabled. -lenum.buildspeed = Multiplier for building speed. -lenum.unithealth = How much health units start with. -lenum.unitbuildspeed = How fast unit factories build units. -lenum.unitcost = Multiplier of resources that units take to build. -lenum.unitdamage = How much damage units deal. -lenum.blockhealth = How much health blocks start with. -lenum.blockdamage = How much damage blocks (turrets) deal. -lenum.rtsminweight = Minimum "advantage" needed for a squad to attack. Higher -> more cautious. -lenum.rtsminsquad = Minimum size of attack squads. -lenum.maparea = Playable map area. Anything outside the area will not be interactable. -lenum.ambientlight = Ambient light color. Used when lighting is enabled. -lenum.solarmultiplier = Multiplies power output of solar panels. -lenum.dragmultiplier = Environment drag multiplier. -lenum.ban = Blocks or units that cannot be placed or built. -lenum.unban = Unban a unit or block. +lenum.wavetimer = Se as hordas vêm automaticamente por um temporizador. Se não, as hordas vêm quando o botão play é pressionado. +lenum.wave = Número da horda atual. Pode ser qualquer coisa em modos sem horda. +lenum.currentwavetime = Contagem regressiva da horda em ticks. +lenum.waves = Se hordas podem spawnar. +lenum.wavesending = Se as hordas podem ser chamadas manualmente com o botão play. +lenum.attackmode = Determina se o modo de jogo é o modo de ataque. +lenum.wavespacing = Tempo entre hordas em ticks. +lenum.enemycorebuildradius = Zona proibida de construção ao redor do núcleo inimigo. +lenum.dropzoneradius = Raio ao redor das zonas de queda de horda inimiga. +lenum.unitcap = Limite base de unidades. Pode ser aumentado por blocos. +lenum.lighting = Se a iluminação ambiente está ativada. +lenum.buildspeed = Multiplicador para a velocidade de construção. +lenum.unithealth = Quanta vida as unidades têm inicialmente. +lenum.unitbuildspeed = O quão rápido as fábricas constroem unidades. +lenum.unitcost = Multiplicador de recursos que as unidades levam para construir. +lenum.unitdamage = Quanto dano as unidades causam. +lenum.blockhealth = Quanta vida os blocos têm inicialmente. +lenum.blockdamage = Quanto dano os blocos (torretas) causam. +lenum.rtsminweight = Vantagem mínima necessária para um esquadrão atacar. Maior -> mais cauteloso. +lenum.rtsminsquad = Tamanho mínimo dos esquadrões de ataque. +lenum.maparea = Área jogável do mapa. Qualquer coisa fora da área não será interagível. +lenum.ambientlight = Cor da luz ambiente. Usada quando a iluminação está ativada. +lenum.solarmultiplier = Multiplica a saída de energia dos painéis solares. +lenum.dragmultiplier = Multiplicador de arrasto ambiental. +lenum.ban = Blocos ou unidades que não podem ser colocados ou construídos. +lenum.unban = Desbanir uma unidade ou bloco. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index bce86ed28b..2d9df339b7 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki oficial do Mindustry link.suggestions.description = Sugerir novas funcionalidades link.bug.description = Achou algum? Reporte-o aqui linkopen = Este servidor enviou-lhe um link. Tem a certeza que o quer abrir?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Falha ao abrir a ligação\nO Url foi copiado para a área de transferência screenshot = Captura de ecrã gravada em {0} screenshot.invalid = Mapa grande demais, potencialmente sem memória suficiente para captura. @@ -124,6 +125,8 @@ maps.none = [lightgray]Nenhum Mapa Encontrado! invalid = Inválido pickcolor = Pick Color color = Color +import = Import +export = Export preparingconfig = A preparar a configuração preparingcontent = A preparar o conteúdo uploadingcontent = A enviar o conteúdo @@ -212,6 +215,8 @@ campaign.none = [lightgray]Selecione um planeta para onde começar.\nIsto pode s campaign.erekir = Novo, conteúdo aperfeiçoado. Progresso de campanha quase linear.\n\nMapas e experiência geral de melhor qualidade. campaign.serpulo = Conteúdo antigo, a experiência clássica. Mais amplo.\n\nMapas e mecânicas da campanha potencialmente desbalanceados. Menos aperfeiçoado. campaign.difficulty = Dificuldade +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Completado techtree = Árvore da Tecnologia techtree.select = Árvore da Tecnologia @@ -359,6 +364,7 @@ confirm = Confirmar delete = Apagar view.workshop = Ver na Workshop workshop.listing = Editar a lista da Workshop +hide = Hide ok = OK open = Abrir customize = Customizar @@ -370,7 +376,6 @@ command.repair = reparar command.rebuild = Reconstruir command.assist = Assistir jogador command.move = Mover -command.boost = Impulsionar command.enterPayload = Inserir bloco de carga command.loadUnits = Carrgar Unidades command.loadBlocks = Carregar Blocos @@ -381,7 +386,9 @@ stance.shoot = Stance: Atirar stance.holdfire = Stance: Não disparar stance.pursuetarget = Stance: Perseguir alvo stance.patrol = Stance: Caminho de Patrulha +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Movimento em linha reta, sem trajetória +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Abrir Ligação @@ -428,6 +435,7 @@ saveimage = Salvar\nimagem unknown = Desconhecido custom = Customizado builtin = Embutido +modded = Modded map.delete.confirm = Tens a certeza que queres apagar este mapa? Esta ação não pode ser desfeita! map.random = [accent]Mapa aleatório map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um {0} núcleo ao mapa no editor. @@ -488,10 +496,14 @@ editor.center = Centrar editor.search = Procurar mapas... editor.filters = Filtrar Mapas editor.filters.mode = Modos de jogo: +editor.filters.priorities = Priorities: editor.filters.type = Tipo de Mapa: editor.filters.search = Procurar em: editor.filters.author = Autor editor.filters.description = Descrição +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Mover no eixo X editor.shifty = Mover no eixo Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Procurar hordas... waves.filter = Filtro de Unidades waves.units.hide = Ocultar Tudo waves.units.show = Mostrar Tudo +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = quantidade @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destrói: [][lightgray]{0}[]x Unidades objective.enemiesapproaching = [accent]Inimigos aproximando em [lightgray]{0}[] objective.enemyescelating = [accent]Produção inimiga a aumentar em [lightgray]{0}[] objective.enemyairunits = [accent]Produção de unidades aéreas inimigas a partir de [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destrói o Núcleo Inimigo objective.command = [accent]Comandar Unidades objective.nuclearlaunch = [accent]⚠ Lançamento Nuclear detetado: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Não foi possivel mudar de Setores sector.noswitch = Não deves trocar de setores quando existe um sobre ataque.\n\nSetor: [accent]{0}[] em [accent]{1}[] sector.view = Ver Setor sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Baixo threat.medium = Médio @@ -843,6 +858,10 @@ threat.high = Alto threat.extreme = Extremo threat.eradication = Erradicação +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Fácil difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sol sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Um bom lugar para recomeçar. Baixa ameaça inimiga. Poucos recursos.\nConsegue o máximo possível de chumbo e cobre.\nContinua. sector.frozenForest.description = Mesmo aqui, perto das montanhas, os esporos espalharam-se. As temperaturas baixas não os podem conter para sempre.\n\nComeça a aventura com energia. Constrói geradores a combustão. Aprende a usar reparadores. sector.saltFlats.description = Nos arredores do deserto ficam as planícies de sal. Poucos recursos podem ser encontrados neste local.\n\nO inimigo construiu um complexo de armazenamento de recursos aqui. Destrói o núcleo deles. Não deixes nada de sobra. -sector.craters.description = A água se acumulou nesta cratera, relíquia das guerras antigas. Reconquista a área. Recolhe areia. Faz metavidro. Usa a água para arrefecer brocas e torres. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Para além dos resíduos, está a linha costeira. Antigamente, este local abrigava uma rede de defesa costeira. Não restou muita coisa. Apenas as estruturas de defesas básicas permaneceram ilesas, o resto foi reduzido a sucata.\nContinua a expandir os teus territórios, redescobre a tecnologia. sector.stainedMountains.description = Mais para o interior estão as montanhas, ainda não contaminadas pelos esporos.\nExtrai o titânio que é abundante nesta área. Aprende a usá-lo.\n\nA presença inimiga é maior aqui. Não lhes dês tempo de trazerem unidades mais fortes. sector.overgrowth.description = Esta área coberta por vegetação, próxima ao local de origem dos esporos.\nO inimigo estabeleceu um posto de controlo aqui. Produz unidades Mace. Destrói-o. @@ -1045,6 +1065,7 @@ stat.boosteffect = Efeito do Boost stat.maxunits = Máximo de Unidades Ativas stat.health = Saúde stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Tempo de Construção stat.maxconsecutive = Máximo Consecutivo stat.buildcost = Custo de Construção @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] bullet.incendiary = [stat]incendiário bullet.homing = [stat]guiado bullet.armorpierce = [stat]perfuração de armadura -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] limite de dano bullet.suppression = [stat]{0} seg.[lightgray] supressão de reparação ~ [stat]{1}[lightgray] blocos @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Desativar Mods em Crash de Início do Jogo setting.animatedwater.name = Água Animada setting.animatedshields.name = Escudos Animados setting.playerindicators.name = Indicador de Jogadores +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicador de inimigos setting.autotarget.name = Alvo Automático setting.keyboard.name = Controlos de Rato e Teclado @@ -1268,8 +1291,10 @@ setting.fpscap.name = Limite de FPS setting.fpscap.none = Nenhum setting.fpscap.text = {0} FPS setting.uiscale.name = Escala da IU[lightgray] (reinicío requerida)[] -setting.uiscale.description = Reinicío necessário para aplicar as alterações. -setting.swapdiagonal.name = Colocação Diagonal Sempre +setting.uiscale.description = É necessário reiniciar para aplicar as mudanças. +setting.uiEdgePadding.name = Espaçamento de bordas da UI +setting.uiEdgePadding.description = Adiciona espaçamento às bordas da UI. Útil para telas com cantos arredondados ou entalhes (notches). +setting.swapdiagonal.name = Colocação sempre diagonal setting.screenshake.name = Vibração do Ecrã setting.bloomintensity.name = Intensidade do Bloom setting.bloomblur.name = Bloom Blur @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Intervalo de auto-salvamento do jogo setting.seconds = {0} segundos setting.milliseconds = {0} milissegundos setting.fullscreen.name = Ecrã Inteiro -setting.borderlesswindow.name = Janela sem Bordas -setting.borderlesswindow.name.windows = Ecrã sem Bordas -setting.borderlesswindow.description = Pode ser necessário reiniciar para aplicar as alterações. setting.fps.name = Mostrar FPS e Ping setting.console.name = Ativar Consola setting.smoothcamera.name = Câmara Suave @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volume do Ambiente setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume dos Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Enviar Relatórios de Crash Anónimos setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Criar Gravações Automaticamente setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Comando de Unidades category.multiplayer.name = Multijogador category.blocks.name = Selecionador de Blocos placement.blockselectkeys = \n[lightgray]Tecla: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Renascer keybind.control.name = Controlar Unidade keybind.clear_building.name = Limpar Construção @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Postura de Unidade: Não Disparar keybind.unit_stance_pursue_target.name = Postura de Unidade: Perseguir Alvo keybind.unit_stance_patrol.name = Postura de Unidade: Patrulha keybind.unit_stance_ram.name = Postura de Unidade: Forçar +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Controlo de Unidade: Mover keybind.unit_command_repair.name = Controlo de Unidade: Reparar keybind.unit_command_rebuild.name = Controlo de Unidade: Reconstruir keybind.unit_command_assist.name = Controlo de Unidade: Assistir keybind.unit_command_mine.name = Controlo de Unidade: Minerar -keybind.unit_command_boost.name = Controlo de Unidade: Impulsionar keybind.unit_command_load_units.name = Controlo de Unidade: Carregar Unidades keybind.unit_command_load_blocks.name = Controlo de Unidade: Carregar Blocos keybind.unit_command_unload_payload.name = Controlo de Unidade: Descarregar Carga @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Recursos Infinitos para a Equipa Inimiga rules.blockhealthmultiplier = Multiplicador de Vida do Bloco rules.blockdamagemultiplier = Multiplicador de Dano do Bloco +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Multiplicador de Velocidade de Criação de Unidades rules.unitcostmultiplier = Multiplicador de Custo de Unidades rules.unithealthmultiplier = Multiplicador de Vida de Unidades @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Mostrar Spawn de Inimigos rules.randomwaveai = IA de hordas imprevisível +rules.pauseDisabled = Disable Pausing rules.fire = Fogo rules.anyenv = rules.explosions = Dano de Explosão a Bloco/Unidade @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Roteador de Carga Reforçado block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Desconstrutor Pequeno block.canvas.name = Tela +block.large-canvas.name = Large Canvas block.world-processor.name = Processador Global block.world-cell.name = Célula Global block.tank-fabricator.name = Fabricador de Tanque @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Toca e segura[] para pegar pequenos blocos o hint.payloadDrop = Pressione [accent]][] para soltar a carga. hint.payloadDrop.mobile = [accent]Toque e segure[] em um local vazio para soltar ali a carga. hint.waveFire = Torretas [accent]Onda[] com munição de água vão apagar automaticamente incêndios próximos. -hint.generator = \uf879 [accent]Geradores a Combustão[] queimam carvão e transmitem energia aos blocos ao lado.\n\nO alcance da transmissão de energia pode ser aumentado com \uf87f [accent]Células de Energia[]. hint.guardian = Unidades [accent]Guardião[] são blindadas. Munições fracas como [accent]Cobre[] e [accent]Chumbo[] são [scarlet]não efetivas[].\n\nUse torretas melhores ou \uf835 [accent]Grafite[] \uf861Duo/\uf859Salvo como munição para derrotar Guardiões. hint.coreUpgrade = Núcleos podem ser melhorados [accent]colocando núcelos melhores sobre eles[].\n\nColoque uma \uf868 [accent]Fundação do Núcleo[] sobre o \uf869 [accent]Fragmento do Núcleo[]. Tenha certeza de que está livre de obstruções próximas. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Qualquer coisa construida nesta área será destruida quando uma hord gz.zone3 = Uma horda vai começar agora\nSe prepare. gz.finish = Construa mais torretas, minere mais recursos,\ne se defenda de todas as hordas para [accent]capturar o setor[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repara todas as unidades em sua proximidad block.radar.description = Gradualmente descobre o terreno e as unidades inimigas em um grande raio. Requer energia. block.shockwave-tower.description = Danifica e destrói projéteis inimigos em um raio. Requer cianogênio. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Dispara projéteis padrões em todos os inimigos em volta. unit.mace.description = Dispara corrents de chamas em todos os inimigos em volta. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index d3dd362a6e..60730363c8 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -15,6 +15,7 @@ link.wiki.description = Wikiul oficial al Mindustry link.suggestions.description = Sugerează noi funcții link.bug.description = Ai găsit vreunul? Raportează-l aici linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată. screenshot = Captură de ecran salvată la {0} screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran @@ -124,6 +125,8 @@ maps.none = [lightgray]Nu s-au găsit hărți! invalid = Invalid pickcolor = Alege Culoarea color = Color +import = Import +export = Export preparingconfig = Se Pregătește Configurația preparingcontent = Se Pregătește Conținutul uploadingcontent = Se Încarcă Conținutul @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Finalizat techtree = Cercetează techtree.select = Tech Tree Selection @@ -359,6 +364,7 @@ confirm = Confirmă delete = Șterge view.workshop = Vezi în Workshop workshop.listing = Editează Listarea din Workshop +hide = Hide ok = OK open = Deschide customize = Personalizează Regulile @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Deschide Linkul @@ -428,6 +435,7 @@ saveimage = Salvează Imagine unknown = Necunoscut custom = Personalizată builtin = Prestabilită +modded = Modded map.delete.confirm = Ești sigur că vrei să ștergi această hartă? Acțiunea este ireversibilă! map.random = [accent]Hartă Aleatorie map.nospawn = Harta asta nu are niciun nucleu în care vor apărea jucătorii! Adaugă un nucleu {0} acestei hărți în editor. @@ -488,10 +496,14 @@ editor.center = Centrează editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Ascunde waves.units.show = Vezi Tot +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = numere @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Scăzută threat.medium = Medie @@ -843,6 +858,10 @@ threat.high = Mare threat.extreme = Extremă threat.eradication = Eradicare +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Soare sector.impact0078.name = Impact 0078 sector.groundZero.name = Punctul Zero -sector.craters.name = Craterele +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Pădurea Glacială sector.ruinousShores.name = Țărmurile Părăsite sector.stainedMountains.name = Munții Pătați @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe. sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare. sector.saltFlats.description = La periferia deșertului stau Podișurile Saline. Puține resurse pot fi găsite în această locație.\n\nInamicul a ridicat un complex de depozitare aici. Distruge-le nucleul. Nu lăsa nimic în urmă. -sector.craters.description = Apa s-a acumulat în acest crater, rămășiță a vechilor războaie. Cucerește din nou zona. Adună nisip. Toarnă-l în metasticlă. Pompează apă pt a răci armele și burghiele. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = După deșerturi vine țărmul. Odată, locația aceasta avea un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai simple au rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea înspre exterior. Redescoperă tehnologia. sector.stainedMountains.description = Mai spre mijlocul continentului sunt munții, încă neatinși de spori.\nExtrage abundentele resurse de titan din zonă. Învață cum să-l folosești.\n\nPrezența inamicului e mai mare aici. Nu le da timp să trimită cele mai puternice unități. sector.overgrowth.description = Această zonă este plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un avanpost aici. Construiește unități Mace. Distruge-l. @@ -1045,6 +1065,7 @@ stat.boosteffect = Efect de Îmbunătățire stat.maxunits = Maxim Unități Active stat.health = Viață stat.armor = Armură +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Timp Construcție stat.maxconsecutive = Maxim Consecutive stat.buildcost = Cost Construcție @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] forță pe raza ~[stat] {1}[lightgray bullet.incendiary = [stat]incendiar bullet.homing = [stat]cu radar bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Dezactivează Modurile în Cazul unui Crash la Po setting.animatedwater.name = Suprafețe Animate setting.animatedshields.name = Scuturi Animate setting.playerindicators.name = Indicatori Jucător +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indicatori Inamic setting.autotarget.name = Auto-Țintire setting.keyboard.name = Controale Mouse+Tastatură @@ -1269,6 +1292,8 @@ setting.fpscap.none = Niciuna setting.fpscap.text = FPS {0} setting.uiscale.name = Scară Interfață setting.uiscale.description = Repornire necesară pt a aplica schimbările. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Plasează Mereu Diagonal setting.screenshake.name = Agitare Ecran setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Interval de Salvare setting.seconds = {0} secunde setting.milliseconds = {0} millisecunde setting.fullscreen.name = Ecran Complet -setting.borderlesswindow.name = Fereastră Fără Margine -setting.borderlesswindow.name.windows = Ecran Complet Fără Margine -setting.borderlesswindow.description = Repornirea poate fi necesară pt a aplica schimbările. setting.fps.name = Vezi FPS & Ping setting.console.name = Enable Console setting.smoothcamera.name = Cameră Graduală @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Volum Ambiental setting.mutemusic.name = Muzica pe Mut setting.sfxvol.name = Volum Efecte Sonore setting.mutesound.name = Sunetul pe Mut -setting.crashreport.name = Trimite Rapoarte de Crash anonime setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Creează Salvări setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Selectare Bloc placement.blockselectkeys = \n[lightgray]Taste: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Regenerare keybind.control.name = Controlează Unități keybind.clear_building.name = Șterge Clădirea @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Resurse infinite pt AI (echipa roșie) rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Multiplicatorul Vieții Unităților @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Foc rules.anyenv = rules.explosions = Explozia Deteriorează Blocul/Unitatea @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Ține apăsat[] pe un bloc mic/o unitate pt hint.payloadDrop = Apasă [accent]][] pt a descărca încărcătura. hint.payloadDrop.mobile = [accent]Ține apăsat[] pe o locație goală pt a descărca încărcătura acolo. hint.waveFire = Armele [accent]Wave[] încărcate cu apă vor stinge incendiile automat. -hint.generator = :combustion-generator: [accent]Generatoarele pe Combustie[] ard cărbunele și transmit electricitatea blocurilor învecinate.\n\nElectricitatea poate fi transmisă pe distanțe lungi folosind :power-node: [accent]Noduri Electrice[]. 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 :graphite: [accent]Grafit[] pt :duo:Duo/:salvo:Salvo 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 :core-foundation: [accent]Foundation[] peste nucleul :core-shard: [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.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Trage cu gloanțe standard către toți inamicii din apropiere. unit.mace.description = Trage cu jeturi de flacără aprinsă către toți inamicii din apropiere. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 5145f6639c..1cca8adb37 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -15,6 +15,7 @@ link.wiki.description = Официальная вики link.suggestions.description = Предложить новые возможности link.bug.description = Нашли ошибку? Доложите о ней здесь linkopen = Этот сервер отправил вам ссылку. Вы уверены, что хотите ее открыть?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. screenshot = Скриншот сохранён в {0} screenshot.invalid = Карта слишком большая, возможно, не хватает памяти для скриншота. @@ -101,8 +102,8 @@ coreattack = < Ядро находится под атакой! > nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ НЕМЕДЛЕННО[] ]\nаннигиляция неизбежна database = База данных ядра database.button = База данных -database.patched = Modified by data patches. -viewfields = View Content Fields +database.patched = Изменено с помощью патчей. +viewfields = Просмотр полей контента savegame = Сохранить игру loadgame = Загрузить игру joingame = Сетевая игра @@ -124,6 +125,8 @@ maps.none = [lightgray]Карты не найдены! invalid = Недопустимый pickcolor = Выбрать цвет color = Цвет +import = Импортировать +export = Экспортировать preparingconfig = Подготовка конфигурации preparingcontent = Подготовка содержимого uploadingcontent = Выгрузка содержимого @@ -152,13 +155,13 @@ mod.version = Версия: mod.content = Содержимое: mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. -mod.incompatiblegame = [red]Устаревшая игра -mod.incompatiblemod = [red]Несовместимый -mod.blacklisted = [red]Неподдерживаемый -mod.unmetdependencies = [red]Не найдены зависимости +mod.incompatiblegame = [scarlet]Устаревшая игра +mod.incompatiblemod = [scarlet]Несовместимый +mod.blacklisted = [scarlet]Неподдерживаемый +mod.unmetdependencies = [scarlet]Не найдены зависимости mod.erroredcontent = [scarlet]Ошибки содержимого -mod.circulardependencies = [red]Цикличные зависимости -mod.incompletedependencies = [red]Недопустимые или отсутствующие зависимости +mod.circulardependencies = [scarlet]Цикличные зависимости +mod.incompletedependencies = [scarlet]Недопустимые или отсутствующие зависимости mod.requiresversion.details = Требуется версия игры: [accent]{0}[]\nВаша игра устарела. Для работы этого мода требуется более новая версия игры (возможно, альфа/бета-версия). mod.incompatiblemod.details = Этот мод несовместим с последней версией игры. Автор должен обновить его и добавить [accent]minGameVersion: 154[] в файл [accent]mod.json[]. @@ -212,6 +215,8 @@ campaign.none = [lightgray]Выберите планету, с которой х campaign.erekir = Новый, более отточенный контент. В-основном линейное продвижение по кампании.\n\nКарты и игровой процесс более высокого качества. campaign.serpulo = Старый контент; классический опыт. Более вариативное прохождение.\n\nПотенциально несбалансированные карты и механики кампании. Менее отточено. campaign.difficulty = Сложность +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Завершено techtree = Дерево\n технологий techtree.select = Выбор дерева технологий @@ -359,6 +364,7 @@ confirm = Подтверждение delete = Удалить view.workshop = Просмотреть в Мастерской workshop.listing = Изменить информацию в Мастерской +hide = Hide ok = ОК open = Открыть customize = Настроить правила @@ -370,18 +376,19 @@ command.repair = Ремонтировать command.rebuild = Восстанавливать command.assist = Помогать игроку command.move = Двигаться -command.boost = Лететь command.enterPayload = Войти в грузовой блок command.loadUnits = Загрузить единицы command.loadBlocks = Загрузить постройки command.unloadPayload = Выгрузить груз -command.loopPayload = Зациклить передачу юнитов +command.loopPayload = Зациклить передачу единиц stance.stop = Отменить команду stance.shoot = Положение: Стрелять stance.holdfire = Положение: Удерживать огонь stance.pursuetarget = Положение: Преследовать цель stance.patrol = Положение: Патрулировать путь +stance.holdposition = Положение: Удерживать позицию stance.ram = Положение: Таран\n[lightgray]Движение по прямой, без поиска пути +stance.boost = Полёт stance.mineauto = Автоматическая добыча stance.mine = Добывать: {0} openlink = Открыть ссылку @@ -428,6 +435,7 @@ saveimage = Сохранить изображение unknown = Неизвестно custom = Пользовательская builtin = Встроенная +modded = Из модификации map.delete.confirm = Вы действительно хотите удалить эту карту? Это действие не может быть отменено! map.random = [accent]Случайная карта map.nospawn = На этой карте ни одного ядра, в котором игрок может появиться! Добавьте ядро команды {0} на эту карту в редакторе. @@ -448,9 +456,9 @@ publish.confirm = Вы уверены, что хотите опубликова publish.error = Ошибка отправки предмета: {0} steam.error = Не удалось инициализировать сервисы Steam.\nОшибка: {0} -editor.showblocks = Show Blocks -editor.showterrain = Show Terrain -editor.showfloor = Show Floor +editor.showblocks = Показывать блоки +editor.showterrain = Показывать ландшафт +editor.showfloor = Показывать покрытия editor.planet = Планета: editor.sector = Сектор: editor.seed = Сид: @@ -467,7 +475,7 @@ editor.rules = Правила: editor.generation = Генерация: editor.objectives = Цели editor.locales = Наборы локалей -editor.patches.guide = Patch Guide +editor.patches.guide = Руководство по патчам editor.patches = Патчи контента editor.patch = Набор патчей: {0} editor.patches.none = [lightgray]Ни одного набора патчей не загружено. @@ -488,10 +496,14 @@ editor.center = Центрировать editor.search = Поиск карт... editor.filters = Фильтры editor.filters.mode = Режимы игры: +editor.filters.priorities = Приоритеты: editor.filters.type = Тип карты editor.filters.search = Искать по editor.filters.author = Автору editor.filters.description = Описанию +editor.filters.modname = Название модификации +editor.filters.prioritizemod = Приоритет модификации +editor.filters.prioritizecustom = Пользовательский приоритет editor.shiftx = Сдвиг по X editor.shifty = Сдвиг по Y workshop = Мастерская @@ -527,6 +539,7 @@ waves.search = Поиск волн... waves.filter = Фильтр единиц waves.units.hide = Скрыть все waves.units.show = Показать все +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = количество единиц @@ -539,7 +552,7 @@ details = Подробности... edit = Редактировать... variables = Переменные logic.clear.confirm = Вы уверены, что хотите удалить весь код из этого процессора? -logic.restart = Restart +logic.restart = Перезапустить logic.globals = Встроенные переменные editor.name = Название: @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Уничтожьте: [][lightgray]{0}[]x бо objective.enemiesapproaching = [accent]Враги прибудут через [lightgray]{0}[] objective.enemyescelating = [accent]Вражеское производство возрастет через [lightgray]{0}[] objective.enemyairunits = [accent]Производство вражеских воздушных единиц начнется через [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Уничтожьте вражеское ядро objective.command = [accent]Дайте команду боевым единицам objective.nuclearlaunch = [accent]⚠ Обнаружен ракетный удар: [lightgray]{0} @@ -762,7 +776,7 @@ bannedblocks = Запрещённые блоки unbannedblocks = Разблокированные блоки objectives = Цели bannedunits = Запрещённые единицы -unbannedunits = Разблокированные юниты +unbannedunits = Разблокированные единицы bannedunits.whitelist = Запрещенные единицы как белый список bannedblocks.whitelist = Запрещенные блоки как белый список addall = Добавить всё @@ -810,7 +824,7 @@ sectors.wave = Волна: sectors.stored = Накоплено: sectors.resume = Продолжить sectors.launch = Высадка -sectors.nolaunchcandidate = No Launch Sector +sectors.nolaunchcandidate = Нет сектора для запуска sectors.viewsubmission = \ue80d Предложенные игроками карты sectors.select = Выбор sectors.launchselect = Выбор места высадки @@ -824,7 +838,7 @@ sectors.go = Перейти sector.abandon = Покинуть sector.abandon.confirm = Все ядра данного сектора будут самоуничтожены.\nПродолжить? sector.curcapture = Сектор захвачен -sector.lockdown = [red]:warning:[accent] Sector currently under attack\n[lightgray]production, research, export and import disabled +sector.lockdown = [red]:warning:[accent] Сектор находится под атакой\n[lightgray]производство, исследование, экспорт и импорт недоступны sector.curlost = Сектор потерян sector.missingresources = [scarlet]Недостаточно ресурсов для высадки sector.attacked = Сектор [accent]{0}[white] атакован! @@ -836,6 +850,7 @@ sector.noswitch.title = Перемещение между секторами sector.noswitch = Вы не можете переключаться между секторами, пока существующий сектор находится под атакой.\n\nСектор: [accent]{0}[] на [accent]{1}[] sector.view = Просмотр сектора sector.foundationrequired = [lightgray] Требуется Ядро: «Штаб» +sector.shielded = [lightgray] Shielded threat.low = Низкая threat.medium = Средняя @@ -843,6 +858,10 @@ threat.high = Высокая threat.extreme = Экстремальная threat.eradication = Истребляющая +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Казуальная difficulty.easy = Лёгкая difficulty.normal = Нормальная @@ -862,7 +881,7 @@ planet.sun.name = Солнце sector.impact0078.name = Крушение 0078 sector.groundZero.name = Отправная точка -sector.craters.name = Кратеры +sector.crateredBattleground.name = Поле кратеров sector.frozenForest.name = Ледяной лес sector.ruinousShores.name = Разрушенные берега sector.stainedMountains.name = Окрашенные горы @@ -884,19 +903,20 @@ sector.navalFortress.name = Прибрежная крепость sector.polarAerodrome.name = Полярный аэродром sector.atolls.name = Атоллы sector.testingGrounds.name = Испытательные площадки -sector.perilousHarbor.name = Perilous Harbor +sector.perilousHarbor.name = Проклятая гавань sector.weatheredChannels.name = Размытые протоки -sector.fallenVessel.name = Fallen Vessel +sector.fallenVessel.name = Павшее судно sector.mycelialBastion.name = Мицелиальный бастион sector.frontier.name = Граница -sector.sunkenPier.name = Sunken Pier +sector.sunkenPier.name = Затонувший пирс +sector.littoralShipyard.name = Прибрежная верфь sector.cruxscape.name = Оплот Агрессоров sector.geothermalStronghold.name = Геотермальная крепость sector.groundZero.description = Оптимальная локация чтобы начать сначала. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше. sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором. sector.saltFlats.description = На окраине пустыни лежат соляные равнины. В этой местности можно найти немного ресурсов.\n\nВраги возвели здесь комплекс хранения ресурсов. Искорените их ядро. Не оставьте камня на камне. -sector.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров. +sector.crateredBattleground.description = В этом кратере, оставшемся со времён старых войн, скопилась вода.\nВерните эту территорию под контроль. Собирайте песок. Выплавляйте метастекло.\nКачайте воду для охлаждения турелей и буров. sector.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии. sector.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Научитесь им пользоваться.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц. sector.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Булава». Уничтожьте его. Верните то, что было потеряно. @@ -1009,11 +1029,11 @@ stat.opposites = Противоположности stat.powercapacity = Вместимость энергии stat.powershot = Энергия/выстрел stat.damage = Урон -stat.frequency = Frequency +stat.frequency = Частота stat.targetsair = Воздушные цели stat.targetsground = Наземные цели -stat.crushdamage = Crush Damage -stat.legsplashdamage = Leg Splash Damage +stat.crushdamage = Урон от падения +stat.legsplashdamage = Урон по области от ног stat.itemsmoved = Скорость перемещения stat.launchtime = Интервал запусков stat.shootrange = Радиус действия @@ -1030,7 +1050,7 @@ stat.itemcapacity = Вместимость предметов stat.memorycapacity = Размер памяти stat.basepowergeneration = Базовая генерация энергии stat.productiontime = Время производства -stat.warmuptime = Warmup Time +stat.warmuptime = Время разогрева stat.repairtime = Время полного ремонта stat.repairspeed = Скорость ремонта stat.weapons = Орудия @@ -1045,6 +1065,7 @@ stat.boosteffect = Ускоряющий эффект stat.maxunits = Максимальное количество активных единиц stat.health = Прочность stat.armor = Броня +stat.armor.info = Применяемый урон = входящий урон - броня.\nМаксимальное снижение урона до 90%. stat.buildtime = Время строительства stat.maxconsecutive = Макс. последовательность stat.buildcost = Стоимость строительства @@ -1054,8 +1075,8 @@ stat.reload = Выстрелы/секунду stat.ammo = Боеприпасы stat.shieldhealth = Прочность щита stat.cooldowntime = Время восстановления -stat.regenerationrate = Regeneration Rate -stat.activationtime = Activation Time +stat.regenerationrate = Частота регенерации +stat.activationtime = Время активации stat.explosiveness = Взрывоопасность stat.basedeflectchance = Базовый шанс отражения stat.lightningchance = Шанс удара молнии @@ -1073,7 +1094,7 @@ stat.minetier = Уровень добычи stat.payloadcapacity = Грузоподъёмность stat.abilities = Способности stat.canboost = Может взлететь -stat.boostingspeed = Boosting Speed +stat.boostingspeed = Скорость взлёта stat.flying = Летающий stat.ammouse = Использование боеприпасов stat.ammocapacity = Вместимость боеприпасов @@ -1096,7 +1117,7 @@ ability.statusfield.description = Накладывает эффект на бл ability.unitspawn = Завод единиц � ability.unitspawn.description = Конструирует единицы ability.shieldregenfield = Поле восстановления щита -ability.shieldregenfield.description = Восстанавливает щиты ближайших юнитов +ability.shieldregenfield.description = Восстанавливает щиты ближайших единиц ability.movelightning = Молнии при движении ability.movelightning.description = Выпускает молнии при движении ability.armorplate = Бронепластина @@ -1122,7 +1143,7 @@ ability.stat.regen = [stat]{0}[lightgray] здоровья/сек ability.stat.pulseregen = [stat]{0}[lightgray] здоровья/раз ability.stat.shield = [stat]{0}[lightgray] щит ability.stat.repairspeed = [stat]{0}/сек[lightgray] скорость регенерации -ability.stat.deflectchance = [stat]{0}%[lightgray] deflect chance +ability.stat.deflectchance = [stat]{0}%[lightgray] шанс отражения ability.stat.slurpheal = [stat]{0}[lightgray] здоровья/единица жидкости ability.stat.cooldown = [stat]{0} сек[lightgray] перезарядка ability.stat.maxtargets = [stat]{0}[lightgray] максимум целей @@ -1166,35 +1187,35 @@ bar.launchcooldown = Лимит высадки bar.input = Ввод bar.output = Вывод bar.strength = [stat]{0}[lightgray]x эффективность -bar.regenerationrate = [stat]{0}/sec[lightgray] regen rate -bar.activationtimer = Activates in {0} -bar.activated = Activated +bar.regenerationrate = [stat]{0}/sec[lightgray] скорость регенерации +bar.activationtimer = Активируется через {0} +bar.activated = Активировано units.processorcontrol = [lightgray]Управляется процессором -weapon.pointdefense = [stat]Point Defense +weapon.pointdefense = [stat]Точечная защита bullet.damage = [stat]{0}[lightgray] урона bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков bullet.incendiary = [stat]зажигательный bullet.homing = [stat]самонаводящийся bullet.armorpierce = [stat]бронебойный -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing -bullet.antiarmor = [stat]{0}x[lightgray] anti-armor +bullet.armorweakness = [red]{0}x[lightgray] слабость к броне +bullet.partialarmorpierce = [stat]{0}%[lightgray] пробитие брони +bullet.antiarmor = [stat]{0}x[lightgray] анти-броня bullet.maxdamagefraction = [stat]{0}%[lightgray] предел урона bullet.suppression = [stat]{0} сек[lightgray] подавления регенерации в радиусе ~ [stat]{1}[lightgray] блоков -bullet.empradius = [stat]{0}[lightgray] tiles EMP radius -bullet.empboost = [stat]{0}%[lightgray] overdrive ~ [stat]{1}[lightgray] -bullet.empdamage = [stat]{0}%[lightgray] power damage -bullet.empslowdown = [stat]{0}%[lightgray] enemy power overdrive ~ [stat]{1}[lightgray] -bullet.empunitdamage = [stat]{0}%[lightgray] unit damage +bullet.empradius = [stat]{0}[lightgray] плиток радиус подавления +bullet.empboost = [stat]{0}%[lightgray] ускорение ~ [stat]{1}[lightgray] +bullet.empdamage = [stat]{0}%[lightgray] урон энергетике +bullet.empslowdown = [stat]{0}%[lightgray] замедление вражеской энергетике ~ [stat]{1}[l +bullet.empunitdamage = [stat]{0}%[lightgray] урон по единицам bullet.interval = [stat]{0}/сек[lightgray] интервальный(ых) снаряд(ов): bullet.frags = [stat]{0}[lightgray]x осколочный(ых) снаряд(ов): bullet.lightning = [stat]{0}[lightgray]x молнии ~ [stat]{1}[lightgray] урона -bullet.lightninginterval = [stat]{0}[lightgray] tiles interval ~ [stat]{1}[lightgray] tiles length +bullet.lightninginterval = [stat]{0}[lightgray] плиток ~ [stat]{1}[lightgray] длина молнии bullet.buildingdamage = [stat]{0}%[lightgray] урона по постройкам -bullet.spawnBullets = [stat]{0}x[lightgray] spawned bullets: +bullet.spawnBullets = [stat]{0}x[lightgray] созданных снарядов: bullet.shielddamage = [stat]{0}%[lightgray] урона по щитам bullet.knockback = [stat]{0}[lightgray] отбрасывания bullet.pierce = [stat]{0}[lightgray]x пробития @@ -1215,7 +1236,7 @@ unit.liquidsecond = жидкостных единиц/секунду unit.itemssecond = предметов/секунду unit.liquidunits = жидкостных единиц unit.powerunits = энерг. единиц -unit.powerequilibrium = power equilibrium +unit.powerequilibrium = энерг. равновесие unit.heatunits = единиц тепла unit.degrees = ° unit.seconds = сек @@ -1232,8 +1253,8 @@ unit.millions = М unit.billions = В unit.shots = выстрелы unit.pershot = /выстрел -unit.perleg = per leg -unit.perside = per side +unit.perleg = за ногу +unit.perside = за сторону category.purpose = Назначение category.general = Основные category.power = Энергия @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Отключение модификаций по setting.animatedwater.name = Анимированные поверхности setting.animatedshields.name = Анимированные щиты setting.playerindicators.name = Индикаторы направления игроков +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Индикаторы направления врагов setting.autotarget.name = Автозахват цели setting.keyboard.name = Мышь+Управление с клавиатуры @@ -1269,6 +1292,8 @@ setting.fpscap.none = Неограниченный setting.fpscap.text = {0} FPS setting.uiscale.name = Масштаб пользовательского интерфейса setting.uiscale.description = Для вступления изменений в силу может потребоваться перезагрузка игры. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Всегда диагональное размещение setting.screenshake.name = Тряска экрана setting.bloomintensity.name = Интенсивность свечения @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Интервал сохранения setting.seconds = {0} секунд setting.milliseconds = {0} миллисекунд setting.fullscreen.name = Полноэкранный режим -setting.borderlesswindow.name = Безрамочное окно -setting.borderlesswindow.name.windows = Полноэкранный режим без полей -setting.borderlesswindow.description = Для вступления изменений в силу может потребоваться перезагрузка игры. setting.fps.name = Показывать FPS и пинг setting.console.name = Включить консоль setting.smoothcamera.name = Плавная камера @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Громкость окружения setting.mutemusic.name = Заглушить музыку setting.sfxvol.name = Громкость эффектов setting.mutesound.name = Заглушить звук -setting.crashreport.name = Отправлять анонимные отчёты о вылетах setting.communityservers.name = Собрать список серверов сообщества setting.savecreate.name = Автоматическое создание сохранений setting.steampublichost.name = Видимость публичной игры @@ -1334,6 +1355,8 @@ category.command.name = Командование единицой category.multiplayer.name = Сетевая игра category.blocks.name = Выбор блока placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Возрождение в ядре keybind.control.name = Перехватить контроль над единицей keybind.clear_building.name = Очистить план строительства @@ -1348,27 +1371,28 @@ keybind.mouse_move.name = Следовать за курсором keybind.pan.name = Панорамирование камеры keybind.boost.name = Полёт/ускорение keybind.command_mode.name = Командование боевыми единицами -keybind.command_queue.name = Очередь команд юнита +keybind.command_queue.name = Очередь команд единицы keybind.create_control_group.name = Создать группу управления keybind.cancel_orders.name = Отменить приказы -keybind.unit_stance_shoot.name = Поведение юнита: Огонь -keybind.unit_stance_hold_fire.name = Поведение юнита: Огонь запрещён -keybind.unit_stance_pursue_target.name = Поведение юнита: Преследовать цель -keybind.unit_stance_patrol.name = Поведение юнита: Патруль -keybind.unit_stance_ram.name = Поведение юнита: Таран +keybind.unit_stance_shoot.name = Поведение единицы: Огонь +keybind.unit_stance_hold_fire.name = Поведение единицы: Огонь запрещён +keybind.unit_stance_pursue_target.name = Поведение единицы: Преследовать цель +keybind.unit_stance_patrol.name = Поведение единицы: Патруль +keybind.unit_stance_ram.name = Поведение единицы: Таран +keybind.unit_stance_boost.name = Поведение единицы: Полёт +keybind.unit_stance_hold_position.name = Поведение единицы: Удерживать позицию -keybind.unit_command_move.name = Команда юниту: Двигаться -keybind.unit_command_repair.name = Команда юниту: Ремонт -keybind.unit_command_rebuild.name = Команда юниту: Восстановить -keybind.unit_command_assist.name = Команда юниту: Помощь -keybind.unit_command_mine.name = Команда юниту: Добыча -keybind.unit_command_boost.name = Команда юниту: Ускорение -keybind.unit_command_load_units.name = Команда юниту: Загрузить юнитов -keybind.unit_command_load_blocks.name = Команда юниту: Загрузить блоки -keybind.unit_command_unload_payload.name = Команда юниту: Выгрузить груз -keybind.unit_command_enter_payload.name = Команда юниту: Войти в груз -keybind.unit_command_loop_payload.name = Команда юниту: Зациклить передачу юнитов +keybind.unit_command_move.name = Команда единице: Двигаться +keybind.unit_command_repair.name = Команда единице: Ремонт +keybind.unit_command_rebuild.name = Команда единице: Восстановить +keybind.unit_command_assist.name = Команда единице: Помощь +keybind.unit_command_mine.name = Команда единице: Добыча +keybind.unit_command_load_units.name = Команда единице: Загрузить единицы +keybind.unit_command_load_blocks.name = Команда единице: Загрузить блоки +keybind.unit_command_unload_payload.name = Команда единице: Выгрузить груз +keybind.unit_command_enter_payload.name = Команда единице: Войти в груз +keybind.unit_command_loop_payload.name = Команда единице: Зациклить передачу единиц keybind.rebuild_select.name = Перестроить в области keybind.schematic_select.name = Выбрать область @@ -1444,8 +1468,8 @@ rules.hidebannedblocks = Скрыть запрещенные блоки rules.infiniteresources = Бесконечные ресурсы rules.fillitems = Заполнить ядро предметами rules.onlydepositcore = Разрешен перенос только в ядро -rules.coreunloaders = Allow Core Unloaders -rules.coreunloaders.info = When enabled, Serpulo unloaders can take items from the core.\nDoes not affect Erekir unloaders. +rules.coreunloaders = Разрешить разгрузку ядра +rules.coreunloaders.info = При включении, разгрузчики на Серпуло могут выгружать предметы из ядра.\nНе влияет на разгрузчики на Эрекире. rules.derelictrepair = Разрешить починку покинутых построек rules.reactorexplosions = Взрывы реакторов rules.coreincinerates = Ядро сжигает избыток ресурсов @@ -1476,22 +1500,23 @@ rules.cleanupdeadteams = Очистка строений побежденных rules.corecapture = Захват ядра после уничтожения rules.polygoncoreprotection = Полигональная защита ядер rules.placerangecheck = Запретить размещение построек возле врага -rules.protectcores = Protect Cores -rules.protectcores.info = When disabled, the core no-build radius won't affect this team.\nPlayers won't be assigned to unprotected teams. -rules.checkplacement = Check Placement -rules.checkplacement.info = When disabled, buildings of this team are ignored in placement range checks. +rules.protectcores = Защита ядра +rules.protectcores.info = При отключении, радиус запрета строительства вокруг ядра не будет действовать для этой команды.\nИгроки не будут попадать в незащищенные команды. +rules.checkplacement = Проверка размещения +rules.checkplacement.info = При отключении, постройки этой команды игнорируются при проверке радиуса размещения. rules.enemyCheat = Бесконечные ресурсы у ИИ rules.blockhealthmultiplier = Множитель прочности блоков rules.blockdamagemultiplier = Множитель урона блоков +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед. rules.unitcostmultiplier = Множитель стоимости боев. ед. rules.unithealthmultiplier = Множитель прочности боев. ед. rules.unitdamagemultiplier = Множитель урона боев. ед. rules.unitcrashdamagemultiplier = Множитель урона от падения боев. ед. rules.unitminespeedmultiplier = Множитель скорости копания боев. ед. -rules.logicunitcontrol = Logic Unit Control -rules.logicunitbuild = Logic Unit Building -rules.logicunitdeconstruct = Logic Unit Deconstruction +rules.logicunitcontrol = Управление единицами через логику +rules.logicunitbuild = Строительство единицами через логику +rules.logicunitdeconstruct = Разрушение единицами через логику rules.solarmultiplier = Множитель солнечной энергии rules.unitcapvariable = Ядра увеличивают лимит единиц rules.unitpayloadsexplode = Перевозимые грузы взрываются с перевозящей единицей @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Позволяет использовать ста landingpad.legacy.disabled = [scarlet]\ue815 Выключено[lightgray] ("Старые пусковые площадки" включены) rules.showspawns = Показывать появление врагов rules.randomwaveai = Непредсказуемый ИИ волн +rules.pauseDisabled = Disable Pausing rules.fire = Огонь rules.anyenv = <Любая> rules.explosions = Урон от взрывов блоков/единиц @@ -1539,27 +1565,27 @@ rules.randomwaveai.info = Боевые единицы, появившиеся и rules.placerangecheck.info = Не даёт игрокам ставить свои постройки у вражеских построек. При постройке турели (или у вражеской турели), радиус повышается, чтобы турель не достала до построек. rules.onlydepositcore.info = Не даёт игрокам помещать предметы в любые постройки, кроме ядра. -database-category.item = Items -database-category.liquid = Fluids -database-category.unit = Units -database-category.block = Blocks -database-category.status = Status Effects -database-category.sector = Sectors -database-category.team = Factions +database-category.item = Предметы +database-category.liquid = Жидкости +database-category.unit = Единицы +database-category.block = Постройки +database-category.status = Эффекты статуса +database-category.sector = Сектора +database-category.team = Фракции -database-tag.turret = Turret -database-tag.production = Production -database-tag.distribution = Distribution -database-tag.liquid = Liquid -database-tag.power = Power -database-tag.defense = Defense -database-tag.crafting = Crafting -database-tag.units = Units -database-tag.effect = Utility -database-tag.logic = Logic -database-tag.unit-air = Air -database-tag.unit-naval = Naval -database-tag.unit-ground = Ground +database-tag.turret = Турели +database-tag.production = Производство +database-tag.distribution = Распределение +database-tag.liquid = Жидкости +database-tag.power = Энергия +database-tag.defense = Защита +database-tag.crafting = Создание +database-tag.units = Единицы +database-tag.effect = Утилиты +database-tag.logic = Логика +database-tag.unit-air = Воздушный +database-tag.unit-naval = Водный +database-tag.unit-ground = Наземный wallore = (Стена) @@ -1638,7 +1664,7 @@ unit.vela.name = Парус unit.corvus.name = Ворон unit.stell.name = Основа -unit.locus.name = Очаг +unit.locus.name = Оплот unit.precept.name = Заповедь unit.vanquish.name = Покоритель unit.conquer.name = Завоеватель @@ -1649,7 +1675,7 @@ unit.tecta.name = Текта unit.collaris.name = Колларис unit.elude.name = Уклонение unit.avert.name = Отвлечение -unit.obviate.name = Устранение +unit.obviate.name = Преграда unit.quell.name = Подавление unit.disrupt.name = Разрушение unit.evoke.name = Восход @@ -1694,8 +1720,8 @@ block.graphite-press.name = Графитный пресс block.multi-press.name = Мульти-пресс block.constructing = {0} [lightgray](Строится) block.spawn.name = Точка появления врагов -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore +block.remove-wall.name = Удалить стену +block.remove-ore.name = Удалить руду block.core-shard.name = Ядро: «Осколок» block.core-foundation.name = Ядро: «Штаб» block.core-nucleus.name = Ядро: «Атом» @@ -1748,10 +1774,10 @@ block.metal-tiles-9.name = Металлические плитки 9 block.metal-tiles-10.name = Металлические плитки 10 block.metal-tiles-11.name = Металлические плитки 11 block.metal-tiles-12.name = Металлические плитки 12 -block.metal-tiles-13.name = Metal Tiles 13 -block.metal-wall-1.name = Metal Wall 1 -block.metal-wall-2.name = Metal Wall 2 -block.metal-wall-3.name = Metal Wall 3 +block.metal-tiles-13.name = Металлические плитки 13 +block.metal-wall-1.name = Металлическая стена 1 +block.metal-wall-2.name = Металлическая стена 2 +block.metal-wall-3.name = Металлическая стена 3 block.colored-floor.name = Цветной пол block.colored-wall.name = Цветная стена block.character-overlay.name = Знак @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Укрепленный разгрузоч block.payload-mass-driver.name = Грузовая катапульта block.small-deconstructor.name = Деконструктор block.canvas.name = Холст +block.large-canvas.name = Большой холст block.world-processor.name = Мировой процессор block.world-cell.name = Мировая ячейка памяти block.tank-fabricator.name = Конструктор танков @@ -2120,11 +2147,10 @@ hint.payloadPickup.mobile = [accent]Нажмите и удерживайте[] hint.payloadDrop = Нажмите [accent]][], чтобы сбросить груз. hint.payloadDrop.mobile = [accent]Нажмите и удерживайте[] палец на пустой локации, чтобы сбросить туда груз. hint.waveFire = Турели [accent]Волна[] при подаче воды будут автоматически тушить пожары вокруг. -hint.generator = :combustion-generator: [accent]Генераторы внутреннего сгорания[] сжигают уголь и передают энергию рядом стоящим блокам.\n\nДальность передачи энергии может быть увеличена при помощи :power-node: [accent]силовых узлов[]. hint.guardian = [accent]Стражи[] бронированы. Слабые боеприпасы, такие как [accent]медь[] и [accent]свинец[], [scarlet]не эффективны[].\n\nИспользуйте турели высокого уровня или :graphite: [accent]графитные[] боеприпасы в :duo:двойных турелях/:salvo:залпах, чтобы уничтожить Стража. hint.coreUpgrade = Ядра могут быть улучшены путем [accent]размещения над ними ядер более высокого уровня[].\n\nПоместите ядро :core-foundation: [accent]Штаб[] поверх ядра :core-shard: [accent]Осколок[]. Убедитесь, что никакие препятствия не мешают ему. -hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. -hint.cannotUpgrade = A [red]:tree:[] icon over a payload unit indicates that its upgraded version is not researched yet.\n\nUnit upgrades must be researched in the [accent]:tree: tech tree[] before they can be produced in reconstructors. +hint.serpuloCoreZone = Дополнительные ядра могут быть построены на плитках :core-zone: [accent]Зоны ядра[]. +hint.cannotUpgrade = Значок [red]:tree:[] над единицей грузоподъёма указывает, что её улучшенная версия ещё не исследована.\n\nУлучшения единиц должны быть изучены в [accent]:tree: дереве технологий[], прежде чем они смогут производиться в реконструкторах. hint.presetLaunch = В серые [accent]секторы с посадочными зонами[], такие как [accent]Ледяной лес[], можно запускаться из любого места. Они не требуют захвата близлежащей территории.\n\n[accent]Нумерованные секторы[], такие как этот, [accent]не обязательны[] для прохождения. hint.presetDifficulty = У этого сектора [scarlet]высокий уровень угрозы[].\nЗапуск на такие сектора [accent]не рекомендуется[] без достаточных технологий и подготовки. hint.coreIncinerate = После того, как ядро будет заполнено предметом до отказа, любые лишние входящие предметы этого типа будут [accent]сожжены[]. @@ -2152,33 +2178,43 @@ gz.zone2 = Все, что построено в её радиусе, будет gz.zone3 = Волна начнётся прямо сейчас.\nПриготовьтесь. gz.finish = Постройте больше турелей, добудьте больше ресурсов,\nи отстойте все волны, чтобы [accent]захватить сектор[]. -fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. -fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. +ff.coal = Используйте :mechanical-drill: [accent]Механический бур[] для добычи :ore-coal: [accent]угля[]. +ff.graphitepress = :tree: Исследуйте и разместите :graphite-press: [accent]Графитный пресс[]. +ff.craft = Переместите :coal: уголь в :graphite-press: [accent]Графитный пресс[].\nОн выдаст :graphite: графит на все соседние конвейеры.\nПереместите выходной :graphite: графит из :graphite-press: [accent]Графитного пресса[] в ядро. +ff.generator = :coal: Уголь также может использоваться как топливо в :combustion-generator: [accent]генераторах[].\nИсследуйте и разместите :combustion-generator: [accent]Генератор внутреннего сгорания[]. +ff.coalpower = Подайте :coal: уголь в генератор для производства [accent]:power: энергии[]. +ff.coalpower.objective = :combustion-generator: Производство энергии +ff.node = :power-node: [accent]Энергетические узлы[] передают энергию соседним блокам в зоне действия.\nИсследуйте и разместите :power-node: [accent]Энергетический узел[] рядом с генератором. +ff.battery = :battery: [accent]Батареи[] хранят энергию.\nИсследуйте и разместите :battery: [accent]Батарею[] рядом с узлом. +ff.arc = Турели :arc: [accent]«Дуга»[] требуют энергии для работы. Исследуйте и разместите :arc: [accent]«Дугу»[] рядом с энергетическим узлом. -frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Research and reconstruct\na []:dagger:[accent] dagger to a []:mace:[accent] mace. -frontier.tutorial2 = Enemy waves send [accent]infinitely[] until all enemy cores are [unlaunched]destroyed. -frontier.tutorial3 = [accent]Attack the enemy base fast to prevent waves from getting too high[]. +fungalpass.tutorial1 = Используйте [accent]единицы[] для защиты построек и атаки на врага.\nИсследуйте и разместите :ground-factory: [accent]Наземную фабрику[]. +fungalpass.tutorial2 = Выберите единицу :dagger: [accent]«Кинжал»[] на фабрике.\nПроизведите 3 единицы. -atolls.destroy1 = Destroy the 2 enemy [accent]foundation cores[] first.\n[accent]Gain access to thorium[]. -atolls.mega1 = Enter [accent]command mode[] and select the :mega:[accent]Mega[] units. -atolls.mega2 = Select the \ue87b [accent]Load Units[] command to have Mega units to pick up ground units. -atolls.mega3 = Move the Mega units [accent]above[] ground units to load them in. -atolls.mega4 = [accent]Drop ground units here to attack. -atolls.mega5 = Select the \ue879 [accent]Unload Payload[] command to have Mega units drop their carried units. -atolls.mega6 = Units will be [accent]automatically dropped[] while the \ue879 Unload Payload command is selected. -atolls.mega7 = Mega units [accent]will not[] drop ground units while they are above walls or deep water. -atolls.mega8 = [accent]Drop naval units here to attack.[] -atolls.attack1 = 1: Drop ground units here to attack from this location. -atolls.attack2 = 2: Alternatively, drop naval units here to launch a surprise attack. -atolls.carry1 = Carrying ground units requires :mega:[accent]Mega[] units. -atolls.carry2 = 1: Command Mega units to [accent]move over[] the ground units. -atolls.carry3 = 2: Select the \ue87b [accent]Load Units[] command in order to pick up the ground units with the Mega units. -atolls.carry4 = 3: Command and move the Mega carriers [accent]loaded with units[]. -atolls.carry5 = 4: Select the \ue879 [accent]'Unload Payload'[] command in order for the Mega units to drop the ground units. -atolls.carry6 = These steps can be reviewed [accent]here[]. -atolls.carry7 = Follow these instructions to airdrop more units near the enemy base. -atolls.noairunit = This base is too well-fortified to destroy with air units. -atolls.2strategies = There are two strategies to destroy this base. +frontier.tutorial1 = :additive-reconstructor: [accent]Добавляющий реконструктор[]\nулучшает единицы 1-го уровня до 2-го\nс использованием :silicon: кремния и :graphite: графита.\n\n[accent]Исследуйте и реконструируйте\n[]:dagger:[accent] Кинжал в []:mace:[accent] Булаву. +frontier.tutorial2 = Волны врагов приходят [accent]бесконечно[] до тех пор, пока все вражеские ядра не будут [unlaunched]уничтожены[]. +frontier.tutorial3 = [accent]Атакуйте базу врага быстро, чтобы предотвратить усиление волн[]. + +atolls.destroy1 = Сначала уничтожьте 2 вражеских [accent]базовых ядра[].\n[accent]Получите доступ к торию[]. +atolls.mega1 = Войдите в [accent]режим командования[] и выберите единицы :mega: [accent]«Мега»[]. +atolls.mega2 = Выберите команду \ue87b [accent]Загрузить единицы[], чтобы «Меги» подобрали наземные единицы. +atolls.mega3 = Разместите «Меги» [accent]над[] наземными единицами, чтобы загрузить их. +atolls.mega4 = [accent]Сбросьте наземные единицы здесь[] для атаки. +atolls.mega5 = Выберите команду \ue879 [accent]Выгрузить груз[], чтобы «Меги» сбросили свои единицы. +atolls.mega6 = Единицы будут [accent]сбрасываться автоматически[] при активной команде \ue879 Выгрузки груза. +atolls.mega7 = «Меги» [accent]не будут[] сбрасывать наземные единицы, если они находятся над стенами или глубокой водой. +atolls.mega8 = [accent]Сбросьте морские единицы здесь[] для атаки. +atolls.attack1 = 1: Сбросьте наземные единицы здесь, чтобы атаковать с этой позиции. +atolls.attack2 = 2: Или сбросьте морские единицы здесь для неожиданной атаки. +atolls.carry1 = Для переноса наземных единицы нужны :mega: [accent]«Меги»[]. +atolls.carry2 = 1: Прикажите «Мегам» [accent]двигаться над[] наземными единицами. +atolls.carry3 = 2: Выберите команду \ue87b [accent]Загрузить единицы[], чтобы «Меги» подобрали наземные единицы. +atolls.carry4 = 3: Прикажите и переместите «Меги» [accent]с загруженными единицами[]. +atolls.carry5 = 4: Выберите команду \ue879 [accent]Выгрузить груз[], чтобы «Меги» сбросили наземные единицы. +atolls.carry6 = Эти шаги можно просмотреть [accent]здесь[]. +atolls.carry7 = Следуйте этим инструкциям, чтобы сбрасывать больше единицы рядом с базой врага. +atolls.noairunit = Эта база слишком хорошо укреплена, чтобы уничтожить её воздушными единицами. +atolls.2strategies = Есть две стратегии для уничтожения этой базы. onset.mine = Нажмите, чтобы добыть :beryllium: [accent]бериллий[] из стен.\n\nИспользуйте [accent][[WASD] для передвижения. onset.mine.mobile = Нажмите, чтобы добыть :beryllium: [accent]бериллий[] из стен. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Ремонтирует все союзны block.radar.description = Постепенно разведывает местность в большом радиусе. Требует энергию для работы. block.shockwave-tower.description = Повреждает и разрушает приближающиеся снаряды. Требует циан для работы. block.canvas.description = Отображает графическое изображение с предопределенной палитрой. Редактируемый. +block.large-canvas.description = Отображает большое графическое изображение с предопределенной палитрой. Редактируемый. unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости. unit.mace.description = Стреляет потоками огня по всем врагам поблизости. @@ -2679,7 +2716,7 @@ laccess.displaywidth = Ширина дисплея, в пикселях. laccess.displayheight = Высота дисплея, в пикселях. laccess.buffersize = Количество необработанных команд в графическом буфере дисплея. laccess.operations = Количество операций, выполненных в блоке.\nДля дисплеев, возвращает количество выполненных операций drawflush. -laccess.maxunits = Maximum units that a team can have.\nCan only be sensed from cores. +laccess.maxunits = Максимальное количество единиц, которое может быть у команды.\nОпределяется с помощью ядер. lcategory.unknown = Неизвестно lcategory.unknown.description = Нет категории. diff --git a/core/assets/bundles/bundle_sr.properties b/core/assets/bundles/bundle_sr.properties index f07d781df5..60d97d48e5 100644 --- a/core/assets/bundles/bundle_sr.properties +++ b/core/assets/bundles/bundle_sr.properties @@ -15,6 +15,7 @@ link.wiki.description = Zvanična Mindustry vikipedia link.suggestions.description = Preloži nove dodatke link.bug.description = Pronašao si grešku? Prijavi je ovde linkopen = Ovaj server vam je poslao link. Da li ste sigurni da ga želite otvoriti?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Nemoguće otvoriti link!\nURL adresa je iskopirana screenshot = Snimanje ekrana izvršeno {0} screenshot.invalid = Mapa je prevelika, moguće je da nema dovoljno memorije za snimanje ekrana. @@ -124,6 +125,8 @@ maps.none = [lightgray]Nijedna mapa nije pronađena! invalid = Neispravno pickcolor = Izaberi boju color = Color +import = Import +export = Export preparingconfig = Spremanje konfiguracije preparingcontent = Spremanje sadržaja uploadingcontent = Kačenje sadržaja na internet @@ -212,6 +215,8 @@ campaign.none = [lightgray]Izaberite planetu gde bi ste počeli.\nOvo se može p campaign.erekir = [accent]Preporučeno za novije igrače.[]\n\nNovije, poboljšane funkcije. Uglavnom linearni tok kampanje.\n\nKvalitetniji doživljaji i mape. Veća težina. campaign.serpulo = [scarlet]Nije preporučeno za novije igrače.[]\n\nStarije funkcije; renesansno iskustvo. Otvoreniji pristup.\n\nMoguće je da mape i tok kampanje nisu glatki i balansirani. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Završeno. techtree = Drvo Tehnologija techtree.select = Izbor Drveća Tehnologija @@ -359,6 +364,7 @@ confirm = Potvrdi delete = Izbriši view.workshop = Pogledaj u radionici workshop.listing = Edit Workshop Listing +hide = Hide ok = OK open = Otvori customize = Podesi Pravila @@ -370,7 +376,6 @@ command.repair = Popravljaj command.rebuild = Ponovna Gradnja command.assist = Pomoć Igraču command.move = Kretanje -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Otvori Link @@ -428,6 +435,7 @@ saveimage = Sačuvaj Sliku unknown = Nepoznato custom = Tkana builtin = Ugrađena +modded = Modded map.delete.confirm = Da li ste sigurni da želite obrisati ovu mapu? Ovaj čin je nepovratan! map.random = [accent]Nasumična Mapa map.nospawn = Ova mapa nema jezgra u kom će se stvoriti igrač! Dodaj {0} jezgro ovoj mapi u editor-u. @@ -488,10 +496,14 @@ editor.center = Centar editor.search = Pretraži Mape... editor.filters = Filtriraj Mape editor.filters.mode = Tip Igre: +editor.filters.priorities = Priorities: editor.filters.type = Tip Mape: editor.filters.search = Pretraži U: editor.filters.author = Autor editor.filters.description = Opis +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Pomeri X editor.shifty = Pomeri Y workshop = Radionica @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Sakrij Sve waves.units.show = Pokaži Sve +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = količina @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Uništi: [][lightgray]{0}[]x Jedinica objective.enemiesapproaching = [accent]Neprijatelji dolaze za: [lightgray]{0}[] objective.enemyescelating = [accent]Neprijateljska proizvodnja se umnožava za [lightgray]{0}[] objective.enemyairunits = [accent]Neprijateljska vazdušna proizvodnja počinje za [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Uništi Neprijateljsko Jezgro objective.command = [accent]Upravljaj Jedinicama objective.nuclearlaunch = [accent]⚠ Nuklearno lansiranje u toku: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Nije Moguće Promeniti Sektor sector.noswitch = Ne možete promeniti sektor dok je drugi napadnut.\n\nSektor: [accent]{0}[] na [accent]{1}[] sector.view = Vidi Sektor sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Nisko threat.medium = Srednje @@ -843,6 +858,10 @@ threat.high = Visoko threat.extreme = Ekstremno threat.eradication = Istrebljenje +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sunce sector.impact0078.name = Udar 0078 sector.groundZero.name = Početna Zona -sector.craters.name = Krateri +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Smrznuta Šuma sector.ruinousShores.name = Urušene Obale sector.stainedMountains.name = Zatamnjene Planine @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Savršena lokacija za ponovni početak. Niska neprijateljska pretnja, ali i mala količina resursa.\nSakupite sav bakar i svo olovo koje možete. Nastavite dalje. sector.frozenForest.description = Čak i ovde, u blizini planina, spore su se proširile… ledene temperature ih neće večno zadržati.\n\nZapočnite upotrebu elektriciteta. Graditei sagorevne generatore. Naučite primenu popravljača. sector.saltFlats.description = Na ivici pustinja nalaze se Slane Ravnice. Retko šta od resursa se može naći ovde..\n\nNeprijatelj je sazidao skladišno postrenje ovde. Uništite njihovo Jezgro. Sravnite sve sa zemljom. -sector.craters.description = Voda se nakupila u ovim kraterima, ostacima davnih ratova... Povratite sektor. Kopajte pesak. Topite olovno staklo. Pumpajte vodu da ohladite topove i bušilice. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Posle pustinja leži obala. Davno, ovde se nalazio sistem obalske odbrane. Malo šta od njega ostade do danas. Samo najosnovnije odbrane ostadoše, sve ostalo je svedeno na opiljke.\nNastavite širenje ka spoljašnjosti. Povratite tehnologiju. sector.stainedMountains.description = Dalje u unutrašnjosti nalaze se planine, još nezagađene sporama. \nKopajte titanijum, koji je prisutan u značajnoj količini. Naučite sve njegove primene. .\n\nNeprijateljsko prisustvo ovde je veće… ne dajte im vremena da pošalju svoje najmoćnije jedinice... sector.overgrowth.description = Ova oblast je potpuno zarasla, već bliska izvoru spora.\nNeprijatelj je ovde podigao utvrdu. Koristeći “Topuz” jedinice, uništite je. @@ -1045,6 +1065,7 @@ stat.boosteffect = Efekat pojačivača stat.maxunits = Maksimalne aktivne jedinice stat.health = Izdržljivost stat.armor = Oklop +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Vreme izgradnje stat.maxconsecutive = Maksimalni konzekutivni stat.buildcost = Cena izgradnje @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] oblasna šteta ~[stat] {1}[lightgray] bullet.incendiary = [stat]zapaljiv bullet.homing = [stat]samonavođenje bullet.armorpierce = [stat]proboj oklopa -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Onesposobi Modove Prilikom Ispadanja setting.animatedwater.name = Animirana Površina setting.animatedshields.name = Animirani Štitovi setting.playerindicators.name = Indikatori Igrača +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Indikatori Neprijatelja setting.autotarget.name = Auto-nišan setting.keyboard.name = Kontrole "Tastatura i Miš" @@ -1269,6 +1292,8 @@ setting.fpscap.none = Nema setting.fpscap.text = {0} FPS setting.uiscale.name = UI Skala setting.uiscale.description = Restartovanje je zahtevano da bi se učitale promene. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Uvek Dijagonalno Postavljanje setting.screenshake.name = Screen Shake setting.bloomintensity.name = Bloom Intezitet @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Interval Čuvanja setting.seconds = {0} sekundi setting.milliseconds = {0} milisekundi setting.fullscreen.name = Ceo Ekran -setting.borderlesswindow.name = Bezgranični Prozor -setting.borderlesswindow.name.windows = Ceo Bezgranični Ekran -setting.borderlesswindow.description = Restartovanje je zahtevano da bi se učitale promene. setting.fps.name = Prikazuj FPS i Ping setting.console.name = Osposobi Konzolu setting.smoothcamera.name = Glatka Kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Jačina Zvuka Ambijenta setting.mutemusic.name = Nema Muzike setting.sfxvol.name = Jačina Zvučnih Efekata setting.mutesound.name = Nema Zvuka -setting.crashreport.name = Send Anonymous Crash Reports setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Automatski Snimaj Igru setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Biranje Blokova placement.blockselectkeys = \n[lightgray]Dugme: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Prizovi iz Jezgra keybind.control.name = Kontrološi Jedinicu keybind.clear_building.name = Očisti Građevinu @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Beskonačnost Neprijateljskih Resursa rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Plamen rules.anyenv = rules.explosions = Blokovna/Jedinična Šteta Eksplozije @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Armirani Tovarni Ruter block.payload-mass-driver.name = Tovarni Akcelerator block.small-deconstructor.name = Mali Razlagač block.canvas.name = Kanvas +block.large-canvas.name = Large Canvas block.world-processor.name = Svetovni Procesor block.world-cell.name = Svetovna Ćelija block.tank-fabricator.name = Fabrikator Tenkova @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Pritisni i drži[] mali blok ili jedinicu da hint.payloadDrop = Pritisni [accent]][] da bi spustio tovar. hint.payloadDrop.mobile = [accent]Pritisni i drži[] prazno mesto da bi spustio tovar tamo. hint.waveFire = [accent]Talas[] platforma sa vodom kao municiom automatski gasi vatru. -hint.generator = :combustion-generator: [accent]Generatori Sagorevanja[] sagorevaju ugalj i proizvode energiju.\n\nDomet prenosa energije se može povećati preko :power-node: [accent]Strujnog Čvora[]. hint.guardian = [accent]Čuvari[] kao jedinice su oklopljenje. Slaba municija potput [accent]Bakra[] i [accent]Olovo[] [scarlet]nije efikasan[].\n\nKoristi platforme većeg tijera ili:graphite: [accent]Grafit[] :duo:Duo/:salvo:Salvo municiju da bi se rešio čuvara. hint.coreUpgrade = Jezgra mogu da se unaprede [accent]postavljanjem većih jezgara preko njih[].\n\nPostavi [accent]Temelj[] preko [accent]Krhotina[] jezgra. Osigurajte da bude planiran prostor čist. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Sve sagrađeno u njoj će biti uništeno kada se započne talas. gz.zone3 = Talas će uskoro započeti.\nSpremi se. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Popravlja sve jedinice u blizine. Zahteva block.radar.description = Postepeno otkriva teren i neprijateljske jedinice u visokom videokrugu. Zahteva energiju. block.shockwave-tower.description = Oštećuje i uništava neprijateljske projektile u dometu. Zahteva cianogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Ispaljuje standardne metke na sve neprijatelje u dometu. unit.mace.description = Ispaljuje mlazeve plamena na sve neprijatelje u dometu. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index d2dfdca620..2bac886e4c 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -15,6 +15,7 @@ link.wiki.description = Officiell wiki-sida för Mindustry link.suggestions.description = Föreslå nya funktioner link.bug.description = Hittat en? Rapportera den här linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Kunde inte öppna länken!\nLänken har kopierats till ditt urklipp. screenshot = Skärmdump har sparats till {0} screenshot.invalid = Karta för stor, potentiellt inte tillräckligt minne för skärmdump. @@ -124,6 +125,8 @@ maps.none = [lightgray]Inga kartor hittade! invalid = Ogiltig pickcolor = Välj Färg color = Color +import = Import +export = Export preparingconfig = Förbereder konfiguration preparingcontent = Förbereder innehåll uploadingcontent = Laddar upp innehåll @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Avklarad techtree = Teknologiträd techtree.select = Teknologiträd Väljare @@ -359,6 +364,7 @@ confirm = Bekräfta delete = Radera view.workshop = View In Workshop workshop.listing = Edit Workshop Listing +hide = Hide ok = OK open = Öppna customize = Customize Rules @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Öppna Länk @@ -428,6 +435,7 @@ saveimage = Spara bild unknown = Okänd custom = Anpassad builtin = Inbyggd +modded = Modded map.delete.confirm = Are you sure you want to delete this map? This action cannot be undone! map.random = [accent]Random Map map.nospawn = This map does not have any cores for the player to spawn in! Add a {0} core to this map in the editor. @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = Kratrarna +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Fryst skog sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Färgade berg @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Boost Effect stat.maxunits = Max Active Units stat.health = Health stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Build Time stat.maxconsecutive = Max Consecutive stat.buildcost = Build Cost @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animerat Vatten setting.animatedshields.name = Animerade Sköldar setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Enemy/Ally Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls @@ -1269,6 +1292,8 @@ setting.fpscap.none = Inga setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling[lightgray] (requires restart)[] setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Always Diagonal Placement setting.screenshake.name = Skärmskak setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Save Interval setting.seconds = {0} Sekunder setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullskärm -setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = Show FPS setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Stäng Av Musik setting.sfxvol.name = Ljudeffektvolym setting.mutesound.name = Stäng Av Ljudeffekter -setting.crashreport.name = Skicka Anonyma Krashrapporter setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Multiplayer category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Clear Building @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 49494bec60..f0e1ec5d5c 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -15,6 +15,7 @@ link.wiki.description = วิกิอย่างเป็นทางกา link.suggestions.description = นำเสนอฟีเจอร์ใหม่ link.bug.description = เจอบัค? รายงานที่นี่! linkopen = เซิร์ฟเวอร์นี้ได้ส่งลิ้งค์ให้คุณ แน่ใจหรือไม่ว่าจะเปิดลิ้งค์นี้?\n\n[sky]{0} +clipboardcopy = เซิร์ฟเวอร์นี้ต้องการที่จะคัดลอกข้อความลงในคลิปบอร์ดของคุณ คุณแน่ใจหรือว่าจะดำเนินการต่อ?\n\n[sky]{0} linkfail = ไม่สามารถเปิดลิ้งค์ได้\nได้ทำการคัดลอก URL ลงในคลิปบอร์ดแล้ว screenshot = ภาพหน้าจอได้ถูกบันทึกไปที่ {0} screenshot.invalid = แมพใหญ่เกินไป หน่วยความจำอาจจะไม่พอสำหรับภาพหน้าจอ @@ -101,8 +102,8 @@ coreattack = < แกนกลางถูกโจมตี! > nearpoint = [[ [scarlet]ออกจากจุดเกิดด่วน![] ]\nการทำลายล้างกำลังใกล้เข้ามา database = ฐานข้อมูลแกนกลาง database.button = ฐานข้อมูล -database.patched = Modified by data patches. -viewfields = View Content Fields +database.patched = ถูกปรับแต่งโดยแพตช์ข้อมูล +viewfields = ดูฟิลด์ข้อมูลของเนื้อหา savegame = เซฟเกม loadgame = โหลดเกม joingame = เข้าร่วมเกม @@ -123,7 +124,9 @@ continue = ต่อ maps.none = [lightgray]ไม่มีแมพ! invalid = ไม่ถูกต้อง pickcolor = เลือกสี -color = Color +color = สี +import = นำเข้า +export = ส่งออก preparingconfig = กำลังเตรียมค่าปรับแต่ง preparingcontent = กำลังเตรียมเนื้อหา uploadingcontent = กำลังอัปโหลดเนื้อหา @@ -134,7 +137,7 @@ feature.unsupported = อุปกรณ์ของคุณไม่รอง mods.initfailed = [red]⚠[] ไม่สามารถเปิดเกม Mindustry ได้ อาจเกิดจากม็อดที่ทำงานผิดปกติ\n\nเพื่อป้องกันการแครชต่อเนื่อง [red]ม็อดทั้งหมดได้ทำการปิดตัวลง[] mods = ม็อด -mods.name = Mod: +mods.name = ม็อด: mods.none = [lightgray]ไม่พบม็อด! mods.guide = คู่มือการทำม็อด mods.report = รายงานบัค @@ -148,7 +151,7 @@ mod.enabled = [lightgray]เปิดใช้งาน mod.disabled = [scarlet]ปิดใช้งาน mod.multiplayer.compatible = [gray]ใช้งานได้กับโหมดผู้เล่นหลายคน mod.disable = ปิดใช้งาน -mod.version = Version: +mod.version = เวอร์ชั่น: mod.content = เนื้อหา: mod.delete.error = ไม่สามารถลบม็อดออกได้ ไฟล์อาจอยู่ในระหว่างการใช้งาน @@ -161,7 +164,7 @@ mod.circulardependencies = [red]ม็อดพึ่งพาวนลูป mod.incompletedependencies = [red]ม็อดพึ่งพาไม่ครบ mod.requiresversion.details = ต้องการเวอร์ชั่นเกม: [accent]{0}[]\nเกมของคุณนั้นเก่าเกินไป ม็อดนี้ต้องการเวอร์ชั่นเกมที่ใหม่กว่านี้ (อาจเป็นรุ่น beta/alpha) เพื่อที่จะทำงานได้ -mod.incompatiblemod.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 154[] to its [accent]mod.json[] file. +mod.incompatiblemod.details = ม็อดนี้ไม่สามารถใช้งานร่วมกับเวอร์ชันล่าสุดของเกมได้ ผู้สร้างม็อดต้องอัปเดตและเพิ่ม [accent]minGameVersion: 154[] ลงในไฟล์ [accent]mod.json[] mod.blacklisted.details = ม็อดนี้ถูกขึ้นบัญชีดำเพราะทำให้เกิดข้อขัดข้องและปัญหาอื่นๆ ในเวอร์ชั่นเกมนี้ ห้ามใช้เด็ดขาด mod.missingdependencies.details = ม็อดนี้ขาดม็อดพึ่งพา: {0} mod.erroredcontent.details = เกมเกิดปัญหาในระหว่างการโหลด กรุณาสอบถามผู้พัฒนาม็อดเพื่อให้แก้ไข @@ -187,15 +190,15 @@ mod.preview.missing = ก่อนที่จะนำม็อดไปลง mod.folder.missing = ม็อดที่อยู่ในรูปแบบโฟลเดอร์เท่านั้นที่สามารถลงในเวิร์กช็อปได้\nunzip ไฟล์แล้วลบไฟล์ zip เก่า แล้วรีสตาร์ทเกมหรือรีโหลดม็อด mod.scripts.disable = เครื่องของคุณไม่รองรับม็อดที่มีสคริปต์ คุณจำเป็นต้องปิดม็อดเหล่านี้ก่อนจึงจะสามารถเล่นได้ -mod.dependencies.error = [scarlet]Mods are missing dependencies -mod.dependencies.soft = (optional) -mod.dependencies.download = Import -mod.dependencies.downloadreq = Import Required -mod.dependencies.downloadall = Import All -mod.dependencies.status = Import Results -mod.dependencies.success = Successfully downloaded: -mod.dependencies.failure = Failed to download: -mod.dependencies.imported = This mod requires dependencies. Download? +mod.dependencies.error = [scarlet]ม็อดขาดม็อดพึ่งพา +mod.dependencies.soft = (ไม่จำเป็น) +mod.dependencies.download = นำเข้า +mod.dependencies.downloadreq = จำเป็นต้องนำเข้า +mod.dependencies.downloadall = นำเข้าทั้งหมด +mod.dependencies.status = ผลลัพท์การนำเข้า +mod.dependencies.success = ดาวน์โหลดสำเร็จ: +mod.dependencies.failure = ดาวน์โหลดไม่สำเร็จ: +mod.dependencies.imported = ม็อดนี้จำเป็นต้องมีม็อดพึ่งพา ดาวน์โหลดมั้ย? about.button = เกี่ยวกับ name = ชื่อ: @@ -211,10 +214,12 @@ campaign.select = เลือกเนื้อเรื่องที่จ campaign.none = [lightgray]โปรดเลือกดาวที่จะเริ่มต้น\nคุณสามารถสลับกลับไปตอนไหนก็ได้ campaign.erekir = เนื้อหาที่ใหม่กว่าและขัดเกลามามากกว่า เนื้อเรื่องดำเนินเป็นเส้นตรงโดยซะส่วนใหญ่\n\nแมพมีคุณภาพที่ดีกว่า ให้ประสบการณ์โดยรวมที่มีคุณภาพ campaign.serpulo = ประสบการณ์สุดคลาสสิก เนื้อหาเยอะกว่า เปิดกว้างมากกว่า\n\nแมพและกลไกของแคมเปญอาจไม่สมดุล ขัดเกลามาน้อยกว่า -campaign.difficulty = Difficulty +campaign.difficulty = ระดับความยาก +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]วิจัยแล้ว -techtree = ต้นไม้เทคโนโลยี -techtree.select = เลือกต้นไม้แห่งเทคโนโลยี +techtree = ต้นไม้เทค +techtree.select = เลือกต้นไม้เทค techtree.serpulo = เซอร์ปูโล่ techtree.erekir = เอเรเกียร์ research.load = โหลด @@ -314,14 +319,14 @@ disconnect.error = การเชื่อมต่อมีปัญหา disconnect.closed = การเชื่อมต่อถูกปิดแล้ว disconnect.timeout = หมดเวลา disconnect.data = การโหลดข้อมูลของโลกผิดพลาด! -disconnect.snapshottimeout = Timed out while receiving UDP snapshots.\nThis may be caused by an unstable network or connection. +disconnect.snapshottimeout = หมดเวลาในระหว่างการรับข้อมูล UDP snapshots\nอาจเกิดจากเครือข่ายและการเชื่อมต่ออินเทอร์เน็ตที่ไม่เสถียร cantconnect = ไม่สามารถเข้าร่วมเซิร์ฟเวอร์ ([accent]{0}[]) connecting = [accent]กำลังเชื่อมต่อ... reconnecting = [accent]กำลังเชื่อมต่อใหม่... connecting.data = [accent]กำลังโหลดข้อมูลของโลก ... server.port = พอร์ต: server.invalidport = เลขพอร์ตไม่ถูกต้อง! -server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! +server.error.addressinuse = [scarlet]เกิดข้อผิดพลาดในการเปิดเซิร์ฟเวอร์บนพอร์ต 6567[]\n\nโปรดตรวจสอบให้แน่ใจว่าไม่มีเซิร์ฟเวอร์ Mindustry อื่นทำงานอยู่บนอุปกรณ์หรือเครือข่ายของคุณ! server.error = [crimson]การโฮสต์เซิร์ฟเวอร์ผิดพลาด save.new = เซฟใหม่ save.overwrite = คุณแน่ใจหรือว่าจะเซฟทับ\nเซฟนี้? @@ -353,12 +358,13 @@ save.wave = คลื่นที่ {0} save.mode = เกมโหมด: {0} save.date = เซฟล่าสุด: {0} save.playtime = เวลาที่เล่นไป: {0} -dontshowagain = Don't show again +dontshowagain = ไม่ต้องแสดงอีก warning = คำเตือน confirm = ตกลง delete = ลบ view.workshop = เปิดในเวิร์กช็อป workshop.listing = แก้ไขหน้ารายการเวิร์กช็อป +hide = Hide ok = โอเค open = เปิด customize = ตั้งค่ากฎ @@ -370,20 +376,21 @@ command.repair = ซ่อมแซม command.rebuild = สร้างใหม่ command.assist = ช่วยเหลือผู้เล่น command.move = ขยับ -command.boost = บูสต์ command.enterPayload = เข้าบล็อกบรรทุก -command.loadUnits = โหลดยูนิต -command.loadBlocks = โหลดบล็อก -command.unloadPayload = วางสิ่งบรรทุก -command.loopPayload = วนซำ้การขนถ่ายยูนิต +command.loadUnits = บรรทุกยูนิต +command.loadBlocks = บรรทุกบล็อก +command.unloadPayload = วางของที่บรรทุก +command.loopPayload = ลูปการขนถ่ายยูนิต stance.stop = ยกเลิกคำสั่ง stance.shoot = ท่าที: ยิง stance.holdfire = ท่าที: หยุดยิง stance.pursuetarget = ท่าที: ไล่ตามเป้าหมาย stance.patrol = ท่าที: ลาดตระเวน +stance.holdposition = ท่าที: คงตำแหน่ง stance.ram = ท่าที: พุ่งชน\n[lightgray]ขยับเป็นเส้นตรงโดยที่ไม่มีการตรวจสอบเส้นทาง -stance.mineauto = Automatic Mining -stance.mine = Mine Item: {0} +stance.boost = บูสต์ +stance.mineauto = ขุดอัตโนมัติ +stance.mine = ขุดไอเท็ม: {0} openlink = เปิดลิ้งค์ copylink = คัดลอกลิ้งค์ back = กลับ @@ -428,6 +435,7 @@ saveimage = เซฟรูป unknown = ไม่ทราบ custom = กำหนดเอง builtin = ค่าเริ่มต้น +modded = Modded map.delete.confirm = คุณแน่ใจหรือว่าจะลบแมพนี้? การกระทำครั้งนี้ไม่สามารถย้อนกลับได้! map.random = [accent]สุ่มแมพ map.nospawn = แมพนี้ไม่มีแกนกลางให้ผู้เล่นเกิด! กรุณาใส่แกนกลาง {0} ลงในตัวแก้ไข @@ -448,9 +456,9 @@ publish.confirm = คุณแน่ใจหรือว่าจะเผย publish.error = เกิดข้อผิดพลาดการเผยแพร่ไอเท็มดังต่อไปนี้: {0} steam.error = ไม่สามารถเริ่มการบริการ Steam ได้\nข้อผิดพลาด: {0} -editor.showblocks = Show Blocks -editor.showterrain = Show Terrain -editor.showfloor = Show Floor +editor.showblocks = แสดงบล็อก +editor.showterrain = แสดงภูมิประเทศ +editor.showfloor = แสดงพื้น editor.planet = ดาว: editor.sector = เซ็กเตอร์: editor.seed = ซีด: @@ -467,14 +475,14 @@ editor.rules = กฎ editor.generation = เจนเนอเรชั่น editor.objectives = เป้าหมาย editor.locales = ชุดภาษาท้องถิ่น -editor.patches.guide = Patch Guide -editor.patches = Content Patches -editor.patch = Patchset: {0} -editor.patches.none = [lightgray]No patchsets loaded. -editor.patches.errors = Patchset Errors -editor.patches.importerror = Failed to import patchset -editor.patches.delete.confirm = Are you sure you want to delete this patchset? -editor.patch.fields = {0} fields +editor.patches.guide = คู่มือการใช้แพตช์ +editor.patches = แพตช์เนื้อหา +editor.patch = ชุดแพตช์: {0} +editor.patches.none = [lightgray]ไม่มีชุดแพตช์ที่โหลดมา +editor.patches.errors = ข้อผิดพลาดชุดแพตช์ +editor.patches.importerror = เกิดข้อผิดพลาดในการนำเข้าชุดแพตช์ +editor.patches.delete.confirm = คุณแน่ใจหรือว่าจะลบชุดแพตช์นี้? +editor.patch.fields = {0} ฟิลด์ editor.worldprocessors = ตัวประมวลผลโลก editor.worldprocessors.editname = แก้ไขชื่อ editor.worldprocessors.none = [lightgray]ไม่พบตัวประมวลผลโลกในแมพ!\nสามารถไปเพิ่มในตัวแก้ไขแมพ หรือกดปุ่ม \ue813 เพิ่ม ด้านล่าง @@ -488,15 +496,19 @@ editor.center = ศูนย์กลางแมพ editor.search = ค้นหาแมพ... editor.filters = ตัวกรองแมพ editor.filters.mode = เกมโหมด: +editor.filters.priorities = ลำดับความสำคัญ: editor.filters.type = ประเภทแมพ: editor.filters.search = ค้นหาจาก: editor.filters.author = ผู้สร้าง editor.filters.description = คำอธิบาย +editor.filters.modname = ชื่อม็อด +editor.filters.prioritizemod = ม็อดมาก่อน +editor.filters.prioritizecustom = กำหนดเองมาก่อน editor.shiftx = เลื่อน X editor.shifty = เลื่อน Y workshop = เวิร์กช็อป waves.title = คลื่น -waves.team = Team +waves.team = ทีม waves.remove = ลบ waves.every = ทุกๆ waves.waves = คลื่น @@ -527,6 +539,7 @@ waves.search = ค้นหาคลื่น... waves.filter = ตัวกรองยูนิต waves.units.hide = ซ่อนทั้งหมด waves.units.show = แสดงทั้งหมด +pause.disabled = [scarlet]การหยุดชั่วคราวถูกปิด #these are intentionally in lower case wavemode.counts = จำนวน @@ -539,7 +552,7 @@ details = รายละเอียด... edit = แก้ไข... variables = ตัวแปร logic.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์โค้ดทั้งหมดของตัวประมวลผลนี้? -logic.restart = Restart +logic.restart = เริ่มใหม่ logic.globals = ตัวแปรค่าเริ่มต้น editor.name = ชื่อ: @@ -606,8 +619,8 @@ toolmode.fillteams = เติมทีม toolmode.fillteams.description = เติมทีมแทนที่จะเป็นบล็อก toolmode.fillerase = เติมลบล้าง toolmode.fillerase.description = ลบล้างบล็อกชนิดเดียวกัน -toolmode.fillcliffs = Fill Cliffs -toolmode.fillcliffs.description = Turns walls into cliffs. +toolmode.fillcliffs = เติมหน้าผา +toolmode.fillcliffs.description = เปลี่ยนกำแพงให้กลายเป็นหน้าผา toolmode.drawteams = วาดทีม toolmode.drawteams.description = วาดทีมแทนที่จะเป็นบล็อก #unused @@ -659,7 +672,7 @@ filter.option.percentile = เปอร์เซ็นต์ไทล์ filter.option.code = โค้ดคำสั่ง filter.option.loop = วนลูป -locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) +locales.info = ที่นี่ คุณสามารถเพิ่มชุดข้อมูลสำหรับภาษาท้องถิ่นลงในแมพของคุณได้ ในชุดภาษาท้องถิ่น แต่ละคุณสมบัติจะมีชื่อและค่า คุณสมบัติเหล่านี้จะถูกใช้สำหรับตัวประมวลผลโลกและวัตถุประสงค์ที่ใช้ชื่อของมัน โดยรองรับการจัดรูปแบบข้อความ (แทนที่ค่าตัวอย่างด้วยค่าจริง)\n\n[cyan]คุณสมบัติตัวอย่าง:\n[]ชื่อ: [accent]timer[]\nค่า: [accent]ทดสอบจับเวลา เหลือเวลา: {0}[]\n\n[cyan]การใช้งาน:\n[]ใช้ตั้งเป็นข้อความของเป้าหมายแมพ: [accent]@timer\n\n[]ใช้ปริ้นลงในตัวประมวลผลโลก:\n[accent]localeprint "timer"\nformat time\n[gray](ซึ่ง time เป็นค่าตัวแปรเวลาที่คำนวณแยกออกมา) locales.deletelocale = คุณแน่ใจหรือว่าจะลบชุดภาษาท้องถิ่นนี้? locales.applytoall = เพิ่มการเปลี่ยนแปลงไปยังทุกค่าภาษา locales.addtoother = เพิ่มไปยังภาษาอื่น @@ -670,9 +683,9 @@ locales.searchvalue = ค้นหาค่า... locales.searchlocale = ค้นหาภาษา... locales.byname = ตามชื่อ locales.byvalue = ตามค่า -locales.showcorrect = Show properties that are present in all locales and have unique values everywhere -locales.showmissing = Show properties that are missing in some locales -locales.showsame = Show properties that have same values in different locales +locales.showcorrect = แสดงคุณสมบัติที่มีในทุกภาษาท้องถิ่นและมีค่าเฉพาะตัวทุกภาษา +locales.showmissing = แสดงคุณสมบัติที่ขาดไปในบางภาษาท้องถิ่น +locales.showsame = แสดงคุณสมบัติที่มี่ค่าเหมือนกันในบางภาษา locales.viewproperty = ดูในทุกค่าภาษา locales.viewing = กำลังดูค่า "{0}" locales.addicon = เพิ่มไอคอน @@ -749,6 +762,7 @@ objective.destroyunits = [accent]ทำลาย: [][lightgray]{0}[]x ยูน objective.enemiesapproaching = [accent]ศัตรูจะปรากฏตัวใน [lightgray]{0}[] objective.enemyescelating = [accent]โรงงานศัตรูจะทวีความรุนแรงขึ้นใน [lightgray]{0}[] objective.enemyairunits = [accent]การผลิตยานบินศัตรูจะเริ่มใน [lightgray]{0}[] +objective.enemyunitproduction = [accent]การผลิตยูนิตศัตรูจะเริ่มใน [lightgray]{0}[] objective.destroycore = [accent]ทำลายแกนกลางศัตรู objective.command = [accent]สั่งการยูนิต objective.nuclearlaunch = [accent]⚠ ตรวจพบจรวดหัวรบปรมาณู: [lightgray]{0} @@ -759,18 +773,18 @@ loadout = ทรัพยากรเริ่มต้น resources = ทรัพยากร resources.max = เต็ม bannedblocks = บล็อกต้องห้าม -unbannedblocks = Unbanned Blocks +unbannedblocks = บล็อกที่อนุญาต objectives = เป้าหมาย bannedunits = ยูนิตต้องห้าม -unbannedunits = Unbanned Units +unbannedunits = ยูนิตที่อนุญาต bannedunits.whitelist = ตั้งยูนิตต้องห้ามเป็นไวท์ลิสต์ bannedblocks.whitelist = ตั้งบล็อกต้องห้ามเป็นไวท์ลิสต์ addall = เพิ่มทั้งหมด launch.from = ลงจอดจากเซ็กเตอร์: [accent]{0} launch.capacity = ความจุไอเท็มลงจอด: [accent]{0} launch.destination = จุดหมายปลายทาง: {0} -landing.sources = Source Sectors: [accent]{0}[] -landing.import = Max Total Import: {0}[accent]{1}[lightgray]/min +landing.sources = เซ็กเตอร์ต้นทาง: [accent]{0}[] +landing.import = การนำเข้ารวมสูงสุด: {0}[accent]{1}[lightgray]/นาที configure.invalid = จำนวนต้องอยู่ระหว่าง 0 ถึง {0} add = เพิ่ม... guardian = ผู้พิทักษ์ @@ -785,7 +799,7 @@ error.mapnotfound = ไม่พบไฟล์แมพ error.io = ข้อผิดพลาด I/O ของเครือข่าย error.any = ข้อผิดพลาด: เครือข่ายที่ไม่รู้จัก error.bloom = ไม่สามารถเริ่มต้นบลูมได้\nอุปกรณ์ของคุณอาจไม่รองรับ -error.moddex = Mindustry is unable to load this mod.\nYour device is blocking import of Java mods due to recent changes in Android.\nThere is no known workaround to this issue. +error.moddex = Mindustry ไม่สามารถโหลดม็อดนี้ได้\nอุปกรณ์ของคุณกำลังบล็อกการนำเข้าม็อด Java เนื่องด้วยการเปลี่ยนแปลงล่าสุดของ Android\nไม่มีวิธีการแก้ไขปัญหานี้ ณ ตอนนี้ (เปลี่ยนไปเล่นในคอมได้นะ) weather.rain.name = ฝน weather.snowing.name = หิมะตก @@ -799,7 +813,7 @@ campaign.complete = [accent]ยินดีด้วย\n\nศัตรูบน sectorlist = เซ็กเตอร์ sectorlist.attacked = {0} ถูกโจมตึ sectors.unexplored = [lightgray]ยังไม่ได้สำรวจ -sectors.attempts = Attempts: +sectors.attempts = ครั้งที่พยายาม: sectors.resources = ทรัพยากร: sectors.production = การผลิต: sectors.export = การส่งออก: @@ -810,21 +824,21 @@ sectors.wave = คลื่น: sectors.stored = คลังไอเท็ม: sectors.resume = ไปต่อ sectors.launch = ลงจอด -sectors.nolaunchcandidate = No Launch Sector -sectors.viewsubmission = \ue80d View Submissions +sectors.nolaunchcandidate = ไม่มีเซ็กเตอร์ให้ลงจอด +sectors.viewsubmission = \ue80d ดูงานต้นฉบับ sectors.select = เลือก -sectors.launchselect = Select Launch Destination +sectors.launchselect = เลือกจุดหมายปลายทาง sectors.nonelaunch = [lightgray]ไม่มี (ดวงอาทิตย์) -sectors.redirect = Redirect Launch Pads +sectors.redirect = เปลี่ยนเส้นทางฐานส่งทรัพยากร sectors.rename = เปลี่ยนชื่อเซ็กเตอร์ sectors.enemybase = [scarlet]ฐานทัพศัตรู sectors.vulnerable = [scarlet]เสี่ยงภัย -sectors.underattack = [scarlet]เซ็กเตอร์ถูกโจมตี! เสียหาย [accent]{0}% +sectors.underattack = [scarlet]ถูกโจมตี! sectors.go = ไป sector.abandon = ทอดทิ้ง sector.abandon.confirm = แกนกลางของเซ็กเตอร์นี้จะทำลายตัวเอง\nดำเนินการต่อหรือไม่? sector.curcapture = ยึดครองแล้ว -sector.lockdown = [red]:warning:[accent] Sector currently under attack\n[lightgray]production, research, export and import disabled +sector.lockdown = [red]:คำเตือน:[accent] เซ็กเตอร์กำลังถูกโจมตี\n[lightgray]การผลิต การวิจัย การนำเข้า และการส่งออกถูกปิดใช้งาน sector.curlost = เราเสียเซ็กเตอร์! sector.missingresources = [scarlet]ขาดทรัพยากรในการลงจอด sector.attacked = เซ็กเตอร์ [accent]{0}[white] ถูกโจมตี! @@ -835,7 +849,8 @@ sector.changeicon = เปลี่ยนไอคอน sector.noswitch.title = ไม่สามารถเปลี่ยนเซ็กเตอร์ได้ sector.noswitch = คุณไม่สามารถเปลี่ยนเซ็กเตอร์ได้ระหว่างที่อีกเซ็กเตอร์กำลังถูกโจมตีอยู่\n\nเซ็กเตอร์: [accent]{0}[] บนดาว [accent]{1}[] sector.view = ดูเซ็กเตอร์ -sector.foundationrequired = [lightgray] Core: Foundation Required +sector.foundationrequired = [lightgray] ต้องการ แกนกลาง: ฟาวน์เดชั่น ใกล้เคียง +sector.shielded = [lightgray] Shielded threat.low = ต่ำ threat.medium = กลาง @@ -843,16 +858,20 @@ threat.high = สูง threat.extreme = วิบัติภัย threat.eradication = ทำลายล้าง -difficulty.casual = Casual -difficulty.easy = Easy -difficulty.normal = Normal -difficulty.hard = Hard -difficulty.eradication = Eradication +difficulty.guide.title = แจ้งเตือน +difficulty.guide = หากรู้สึกว่าเซ็กเตอร์ใดยากเกินไป สามารถปรับระดับความยากของแคมเปญเพื่อให้สามารถเล่นง่ายขึ้นได้ +difficulty.guide.confirm = ปรับระดับความยาก -difficulty.enemyHealthMultiplier = Enemy Health: {0} -difficulty.enemySpawnMultiplier = Enemy Amount: {0} -difficulty.waveTimeMultiplier = Wave Timer: {0} -difficulty.nomodifiers = [lightgray](No modifiers) +difficulty.casual = ง่ายมาก +difficulty.easy = ง่าย +difficulty.normal = ปกติ +difficulty.hard = ยาก +difficulty.eradication = ทำลายล้าง + +difficulty.enemyHealthMultiplier = พลังชีวิตศัตรู: {0} +difficulty.enemySpawnMultiplier = จำนวนศัตรู: {0} +difficulty.waveTimeMultiplier = ตัวจับเวลาคลื่น: {0} +difficulty.nomodifiers = [lightgray](ไม่มีการเปลี่ยนแปลง) planets = ดาว @@ -862,7 +881,7 @@ planet.sun.name = อาทิตย์ sector.impact0078.name = อิมแพค 0078 sector.groundZero.name = กราวน์ ซีโร่ -sector.craters.name = บ่ออุกกาบาต +sector.crateredBattleground.name = สนามรบอุกกาบาต sector.frozenForest.name = ป่าหนาวเหน็บ sector.ruinousShores.name = ชายฝั่งพังทลาย sector.stainedMountains.name = ภูเขาหลากสี @@ -876,27 +895,28 @@ sector.biomassFacility.name = สถานสังเคราะห์ชี sector.windsweptIslands.name = หมู่เกาะพหุวายุ sector.extractionOutpost.name = ด่านส่งทรัพยากร sector.facility32m.name = ฐานผลิต 32 M -sector.taintedWoods.name = ป่ามลทิน +sector.taintedWoods.name = พนามลทิน sector.infestedCanyons.name = หุบเขาอันมัวหมอง sector.planetaryTerminal.name = ท่าปล่อยจรวดอวกาศยาน -sector.coastline.name = แนวชายฝั่ง +sector.coastline.name = ชายฝั่งชื้นแฉะ sector.navalFortress.name = ปราการแห่งวารี sector.polarAerodrome.name = ฐานบินขั้วโลก sector.atolls.name = อะทอลส์ -sector.testingGrounds.name = Testing Grounds -sector.perilousHarbor.name = Perilous Harbor -sector.weatheredChannels.name = Weathered Channels -sector.fallenVessel.name = Fallen Vessel -sector.mycelialBastion.name = Mycelial Bastion -sector.frontier.name = Frontier -sector.sunkenPier.name = Sunken Pier -sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold +sector.testingGrounds.name = สนามทดสอบ +sector.perilousHarbor.name = ท่าเรือวิบัติภัย +sector.weatheredChannels.name = ช่องเขาผุกร่อน +sector.fallenVessel.name = ยานร้างอับปาง +sector.mycelialBastion.name = ปราการไมซีเลียล +sector.frontier.name = เขตชายแดน +sector.sunkenPier.name = ท่าเรือบาดาล +sector.littoralShipyard.name = อู่เรือชายฝั่ง +sector.cruxscape.name = ครักซ์สเคป +sector.geothermalStronghold.name = ปราการแห่งอัคคี sector.groundZero.description = จุดที่ดีที่สุดในการตั้งต้นใหม่อีกครั้งนึง ศัตรูน้อย ทรัพยากรน้อย\nเก็บ[accent]ตะกั่ว[]และ[accent]ทองแดง[]ให้ได้มากที่สุด\nแล้วลุยต่อ sector.frozenForest.description = แม้แต่ที่นี่ ณ ที่ที่อยู่ใกล้กับภูเขา [accent]สปอร์[]ก็ยังแพร่มาถึงที่นี่ได้ อากาศอันแสนเย็นเยือกไม่สามารถหยุดยั้งพวกมันได้ตลอดไป\n\nเริ่มต้นการใช้ไฟฟ้า สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้ เรียนรู้ที่จะใช้เครื่องซ่อมแซม sector.saltFlats.description = ณ ชายขอบของทะเลทราย เป็นที่ตั้งของที่ราบเกลือ สามารถพบทรัพยากรบางอย่างได้ที่นี่\n\nศัตรูได้ตั้งฐานเก็บทรัพยากรไว้ จงทำลายแกนกลางของพวกมัน อย่าให้มีอะไรเหลือ -sector.craters.description = น้ำได้สะสมรวมตัวกันอยู่ในหลุมอุกกาบาศแห่งนี้ ซึ่งเป็นมรดกของสงครามอันเก่าแก่ ยึดครองพื้นที่นี่มา ขุดทราย และเผา[accent]กระจกเมต้า[] ปั๊มน้ำขึ้นมาเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ +sector.crateredBattleground.description = น้ำได้สะสมรวมตัวอยู่ในหลุมอุกกาบาตแห่งนี้ ร่องรอยของสงครามอันเก่าแก่ ยึดครองพื้นที่นี่มา ขุดทราย และเผา[accent]กระจกเมต้า[] ปั๊มน้ำขึ้นมาเพื่อมาหล่อเย็นป้อมปืนและเครื่องขุดเจาะ sector.ruinousShores.description = ถัดมาจากทะเลทราย เป็นที่ตั้งของชายฝั่ง ที่ครั้งก่อนเคยเป็นที่ตั้งของฐานป้องกันแนวชายฝั่ง ซึ่งทุกพังทลายไปซะส่วนใหญ่แล้ว มีเหลือแค่ระบบการป้องกันพื้นฐาน ทุกอย่างที่เหลือถูกทำลายเหลือเพียงแค่ซากเศษเหล็ก\n\nทำการขยายการสำรวจต่อไป ค้นพบกับเทคโนโลยีอีกครั้ง sector.stainedMountains.description = เข้าลึกไปในพื้นที่ จะพบกับภูเขา ซึ่งยังไม่ถูกสปอร์แตะต้อง\nขุด[accent]ไทเทเนี่ยม[]ที่อุดมสมบูรณ์ในพื้นที่นี้ เรียนรู้ที่จะใช้มัน\n\nมีศัตรูปรากฏตัวมากขึ้นในบริเวณนี้ อย่าปล่อยให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุดออกมา sector.overgrowth.description = พื้นที่แห่งนี้ถูกปกคลุมไปด้วยพืชรกร้าง เริ่มเข้าใกล้กับแหล่งต้นกำเนิดของสปอร์มากขึ้น\nศัตรูได้ตั้งฐานเฝ้าระวังไว้ที่นี่ สร้างยูนิตเมส ทำลายฐานทิ้งซะ\nวิจัย[accent]เครื่องพัฒนารุ่นยกกำลัง[]เพื่อผลิตยูนิตขนาดที่ใหญ่ขึ้น @@ -932,21 +952,21 @@ sector.origin.name = ต้นกำเนิด sector.onset.description = ตั้งต้นการบุกโจมตีเพื่อพิชิตดาว[accent]เอเรเกียร์[] เก็บทรัพยากร สร้างยูนิต และเริ่มค้นคว้าวิจัยเทคโนโลยี sector.aegis.description = พบการสะสมของแหล่งแร่ทังสเตนในพื้นที่นี้\nวิจัย[accent]เครื่องขุดแรงกระแทก[]เพื่อขุดทรัพยากรนี้ และทำลายฐานทัพศัตรูที่อยู่ในพื้นที่ -sector.lake.description = ทะเลสาบแร่หลอมในพื้นที่นี้ทำให้ไม่สามารถใช้ยูนิตธรรมดาได้ จะต้องมียูนิตที่ลอยตัวเหนื้อพื้นดินเพื่อที่จะผ่านไปได้\nวิจัย[accent]เครื่องสรรค์สร้างยานบิน[]และผลิตยูนิต[accent]เอลูด[]ให้เร็วที่สุดเท่าที่จะเป็นไปได้ -sector.intersect.description = เครื่องสแกนเสนอว่าพื้นที่นี้จะถูกโจมตีจากหลายๆ ด้านไม่นานหลังจากการลงจอด\nสร้างฐานป้องกันให้ไวและขยายพื้นที่ให้เร็วที่สุด\nจำเป็นต้องมียูนิต[accent]จักรกล[]เพื่อสำรวจผ่านบนภูมิประเทศที่หยาบและขรุขระในพื้นที่นี้ -sector.atlas.description = พื้นที่แห่งนี้มีภูมิประเทศที่หลากหลายและจำเป็นจะต้องมียูนิตหลากหลายชนิดเพื่อให้การโจมตีมีประสิทธิภาพ\nยูนิตขั้นสูงอาจจำเป็นเพื่อต่อกรกับฐานทัพศัตรูที่แข็งแกร่งขึ้นในพื้นที่นี้\nวิจัย[accent]เครื่องแยกสลายไฟฟ้า[]และ[accent]เครื่องแปลงสภาพรถถัง[] +sector.lake.description = ทะเลสาบแร่หลอมในพื้นที่นี้ทำให้ไม่สามารถใช้ยูนิตธรรมดาได้ จำเป็นจะต้องมียูนิตที่ลอยตัวเหนื้อพื้นดินเพื่อที่จะผ่านไปได้\nวิจัย[accent]เครื่องสรรค์สร้างยานบิน[]และผลิตยูนิต[accent]เอลูด[]ให้เร็วที่สุดเท่าที่จะเป็นไปได้ +sector.intersect.description = เครื่องสแกนเสนอว่าพื้นที่นี้จะถูกโจมตีจากหลายๆ ด้านไม่นานหลังจากลงจอด\nสร้างฐานป้องกันให้ไวและขยายพื้นที่ให้เร็วที่สุด\nจำเป็นต้องมียูนิต[accent]จักรกล[]เพื่อสำรวจผ่านบนภูมิประเทศที่หยาบและขรุขระในพื้นที่นี้ +sector.atlas.description = พื้นที่แห่งนี้มีภูมิประเทศที่หลากหลาย จึงจำเป็นต้องใช้ยูนิตหลากหลายชนิดเพื่อให้การโจมตีมีประสิทธิภาพ\nยูนิตขั้นสูงอาจจำเป็นเพื่อต่อกรกับฐานทัพศัตรูที่แข็งแกร่งขึ้นในพื้นที่นี้\nวิจัย[accent]เครื่องแยกสลายไฟฟ้า[]และ[accent]เครื่องแปลงสภาพรถถัง[] sector.split.description = จำนวนศัตรูอันน้อยนิดทำให้ที่นี่เป็นพื้นที่ที่เหมาะที่สุดในการทดสอบระบบการขนส่งใหม่ sector.basin.description = ตรวจพบการมีอยู่ของศัตรูจำนวนมากในพื้นที่นี้\nควรรีบสร้างยูนิตและยึดแกนกลางศัตรูเพื่อให้ตั้งหลักได้ -sector.marsh.description = พื้นที่แห่งนี้มีบ่ออาร์คย์ไซต์อยู่จำนวนมาก แต่มีปล่องจำนวนจำกัด\nสร้าง[accent]ห้องเผาไหม้ทางเคมี[]เพื่อผลิตพลังงาน -sector.peaks.description = ภูมิประเทศแบบขุนเขาในพื้นที่แห่งนี้ทำให้ยูนิตปกติใช้การไม่ได้ จำเป็นจะต้องมียูนิตที่บินได้เพื่อที่จะบุกโจมตี\nควรระวังป้อมปืนต่อต้านอากาศยานของศัตรูให้ดี มีความไปได้ที่จะสามารถตัดกำลังป้อมปืนบางส่วนได้โดยการทำลายสิ่งก่อสร้างที่รองรับพวกมัน -sector.ravine.description = ทางเชื่อมขนส่งทรัพยากรที่สำคัญของศัตรู ตรวจไม่พบแกนกลางศัตรูในพื่นที่นี้ แต่ก็ต้องเตรียมตัวรับมือกับกำลังศัตรูที่จะมาในหลากหลายรูปแบบ\nผลิต[accent]เสิร์จอัลลอย[]แล้วสร้างป้อมปืน[accent]อัฟฟลิกต์[]มาป้องกัน -sector.caldera-erekir.description = ทรัพยากรที่ถูกตรวจพบในพื้นที่นี้นั้นกระจัดกระจายไปในหลายๆ เกาะ\nวิจัยและพัฒนาเทคโนโลยีการขนส่งด้วยโดรน -sector.stronghold.description = ปราการขนาดใหญ่ของศัตรูนี้กำลังปกป้องแหล่งแร่[accent]ทอเรี่ยม[]จำนวนมหาศาลในพื้นที่แห่งนี้\nจงใช้มันเพื่อนำไปพัฒนาป้อมปืนและยูนิตขั้นสูงกว่า -sector.crevice.description = ศัตรูจะส่งกำลังโจมตีที่ดุร้ายและทรงพลังเป็นพิเศษเพื่อที่จะทำลายฐานทัพของคุณในพื้นที่นี้\nวิจัยและพัฒนา[accent]คาร์ไบต์[]กับ[accent]เครื่องกำเนิดไฟฟ้าไพโรไลซิส[]เพื่อเพิ่มโอกาสการอยู่รอดในพื้นที่นี้ -sector.siege.description = พื้นที่นี้ประกอบไปด้วยหุบเขาคู่ขนานสองแห่งที่ทำให้ต้องทำการบุกโจมตีทั้งสองฝั่งพร้อมกัน\nวิจัย[accent]ไซยาโนเจน[]เพื่อที่จะสามารถสร้างยูนิตรถถังที่แข็งแกร่งขึ้น\nโปรดระวัง: ตรวจพบขีปนาวุธพิสัยไกลของศัตรู สามารถทำลายหัวรบขีปนาวุธได้ก่อนที่มันจะระเบิด -sector.crossroads.description = ฐานทัพศัตรูในพื้นที่นี้ได้ถูกก่อสร้างในพื้นที่ที่หลากหลาย วิจัยยูนิตแต่ละตัวเพื่อปรับใช้ในสถานการณ์ต่างๆ\nเพิ่มเติม: ฐานทัพบางฐานได้รับการปกป้องด้วยโล่พลังงาน จงหาวิธีที่จะตัดพลังงานของโล่ออกให้ได้ -sector.karst.description = พื้นที่นี้มีความอุดมสมบูรณ์ เต็มไปด้วยทรัพยากร แต่มันจะถูกศัตรูหมายโจมตีเมื่อมีแกนกลางใหม่มาลงจอด\nใช้ทรัพยากรที่อุดมสมบูรณ์มาวิจัย[accent]ใยเฟส[] และต่อต้านกำลังศัตรูให้ได้ -sector.origin.description = เป้าหมายสุดท้าย ตรวจพบการมีอยู่ของศัตรูจำนวนมหาศาล\nไม่มีการวิจัยที่เป็นไปได้หลงเหลืออยู่แล้ว มุ่งแต่โจมดีฐานทัพของศัตรูให้หมดสิ้น +sector.marsh.description = พื้นที่แห่งนี้มีบ่ออาร์ไคไซต์อยู่จำนวนมาก แต่มีปล่องอยู่จำกัด\nสร้าง[accent]ห้องเผาไหม้ทางเคมี[]เพื่อผลิตไฟฟ้าจากอาร์ไคไซต์ +sector.peaks.description = ภูมิประเทศแบบขุนเขาในพื้นที่แห่งนี้ทำให้ยูนิตปกติใช้การไม่ได้ จำเป็นจะต้องมียูนิตที่บินได้เพื่อที่จะบุกโจมตี\nควรระวังป้อมปืนต่อต้านอากาศยานของศัตรูให้ดี สามารถตัดกำลังป้อมปืนบางส่วนได้ด้วยการทำลายสิ่งก่อสร้างที่รองรับพวกมัน +sector.ravine.description = ทางเชื่อมขนส่งทรัพยากรที่สำคัญของศัตรู ตรวจไม่พบแกนกลางศัตรูในพื่นที่นี้ แต่ก็จำเป็นต้องเตรียมตัวรับมือกับกำลังศัตรูที่จะมาในหลากหลายรูปแบบ\nผลิต[accent]เสิร์จอัลลอย[]แล้วสร้างป้อมปืน[accent]อัฟฟลิกต์[]มาเพื่อป้องกัน +sector.caldera-erekir.description = ทรัพยากรที่ตรวจพบในพื้นที่นี้นั้นกระจัดกระจายอยู่ในหลายๆ เกาะ\nวิจัยและพัฒนาเทคโนโลยีการขนส่งด้วยโดรน +sector.stronghold.description = ปราการขนาดใหญ่ของศัตรูนี้กำลังปกป้องแหล่งแร่[accent]ทอเรี่ยม[]จำนวนมหาศาลในพื้นที่แห่งนี้\nจงใช้มันเพื่อไปพัฒนาป้อมปืนและยูนิตขั้นที่สูงกว่า +sector.crevice.description = ศัตรูจะส่งกำลังโจมตีที่ดุร้ายและทรงพลังเป็นพิเศษเพื่อจะทำลายฐานทัพของคุณในพื้นที่นี้\nวิจัยและพัฒนา[accent]คาร์ไบต์[]กับ[accent]เครื่องกำเนิดไฟฟ้าไพโรไลซิส[]เพื่อเพิ่มโอกาสการเอาชีวิตรอดในพื้นที่นี้ +sector.siege.description = พื้นที่นี้ประกอบไปด้วยหุบเขาคู่ขนานสองแห่ง จึงต้องบุกโจมตีล้อมทั้งสองฝั่งพร้อมกัน\nวิจัย[accent]ไซยาโนเจน[]เพื่อที่จะสามารถสร้างยูนิตรถถังที่แข็งแกร่งขึ้น\nโปรดระวัง: ตรวจพบขีปนาวุธพิสัยไกลของศัตรู สามารถทำลายหัวรบขีปนาวุธได้ก่อนที่มันจะระเบิด +sector.crossroads.description = ฐานทัพศัตรูในพื้นที่นี้ถูกก่อสร้างในพื้นที่ที่หลากหลาย วิจัยยูนิตแต่ละตัวเพื่อปรับใช้ในสถานการณ์ต่างๆ\nเพิ่มเติม: ฐานทัพบางฐานนั้นถูกปกป้องด้วยโล่พลังงาน จงหาวิธีที่จะตัดพลังงานที่รองรับโล่ออกให้ได้ +sector.karst.description = พื้นที่นี้มีความอุดมสมบูรณ์ เต็มไปด้วยทรัพยากร แต่มันจะถูกศัตรูหมายโจมตีทันทีเมื่อมีแกนกลางใหม่มาลงจอด\nใช้ทรัพยากรที่อุดมสมบูรณ์มาวิจัย[accent]ใยเฟส[] และต่อต้านกำลังศัตรูให้ได้ +sector.origin.description = เป้าหมายสุดท้าย ตรวจพบการมีอยู่ของศัตรูจำนวนมหาศาล\nไม่มีการวิจัยที่เป็นไปได้หลงเหลืออยู่แล้ว - จงมุ่งแต่โจมดีกวาดล้างฐานทัพของศัตรูให้หมดสิ้น status.burning.name = เผาไหม้ status.freezing.name = แช่แข็ง @@ -961,7 +981,7 @@ status.overdrive.name = โอเวอร์ไดรฟ์ status.overclock.name = โอเวอร์คล็อก status.shocked.name = ช็อก status.blasted.name = ระเบิด -status.corroded.name = Corroded +status.corroded.name = สึกกร่อน status.unmoving.name = หยุดนิ่ง status.boss.name = ผู้พิทักษ์ @@ -1009,11 +1029,11 @@ stat.opposites = ตรงข้าม stat.powercapacity = ความจุพลังงาน stat.powershot = หน่วยพลังงาน/นัด stat.damage = ดาเมจ -stat.frequency = Frequency +stat.frequency = ความถี่ stat.targetsair = ยิงอากาศ stat.targetsground = ยิงพื้นดิน -stat.crushdamage = Crush Damage -stat.legsplashdamage = Leg Splash Damage +stat.crushdamage = ดาเมจบดขยี้ +stat.legsplashdamage = ดาเมจกระจายจากขา stat.itemsmoved = ความเร็วการเคลื่อนย้าย stat.launchtime = เวลาระหว่างการส่ง stat.shootrange = ระยะยิง @@ -1030,7 +1050,7 @@ stat.itemcapacity = ความจุไอเท็ม stat.memorycapacity = ความจุหน่วยความจำ stat.basepowergeneration = ผลิตพลังงานพื้นฐาน stat.productiontime = เวลาในการผลิต -stat.warmuptime = Warmup Time +stat.warmuptime = เวลาวอร์มอัพ stat.repairtime = เวลาในการซ่อมบล็อกให้เสร็จ stat.repairspeed = ความเร็วการซ่อม stat.weapons = อาวุธ @@ -1045,6 +1065,7 @@ stat.boosteffect = เอฟเฟกต์ของบูสต์ stat.maxunits = จำนวนยูนิตสูงสุด stat.health = พลังชีวิต stat.armor = เกราะ +stat.armor.info = ดาเมจที่เกิดขึ้น = ดาเมจที่เข้ามา - เกราะ\nลดความเสียหายได้สูงสุดถึง 90% stat.buildtime = เวลาในการสร้าง stat.maxconsecutive = ติดต่อกันได้สูงสุด stat.buildcost = ใช้ @@ -1054,8 +1075,8 @@ stat.reload = อัตราการยิง stat.ammo = กระสุน stat.shieldhealth = พลังชีวิตโล่ stat.cooldowntime = เวลาคูลดาวน์ -stat.regenerationrate = Regeneration Rate -stat.activationtime = Activation Time +stat.regenerationrate = อัตราการฟื้นฟู +stat.activationtime = เวลาการเปิดใช้งาน stat.explosiveness = แรงระเบิด stat.basedeflectchance = โอกาสกระสุนสะท้อนกลับ stat.lightningchance = โอกาสเกิดสายฟ้า @@ -1073,7 +1094,7 @@ stat.minetier = แร่ที่ขุดได้ stat.payloadcapacity = ความจุสิ่งบรรทุก stat.abilities = ทักษะ stat.canboost = บูสต์ได้ -stat.boostingspeed = Boosting Speed +stat.boostingspeed = ความเร็วการบูสต์ stat.flying = บินได้ stat.ammouse = การใช้กระสุน stat.ammocapacity = ความจุกระสุน @@ -1085,7 +1106,7 @@ stat.buildspeedmultiplier = พหุคูณความเร็วการ stat.reactive = ปฏิกิริยา stat.immunities = ต่อต้านสถานะ stat.healing = การรักษา -stat.efficiency = [stat]{0}% Efficiency +stat.efficiency = [stat]ประสิทธิภาพ {0}% ability.forcefield = โล่พลังงาน ability.forcefield.description = ฉายโล่พลังงานที่ดูดซับกระสุนต่างๆ @@ -1104,7 +1125,7 @@ ability.armorplate.description = ลดความเสียหายที ability.shieldarc = โล่พลังงานโค้ง ability.shieldarc.description = ฉายโล่พลังงานแบบโค้งงอที่ดูดซับกระสุนต่างๆ ability.suppressionfield = สนามระงับการฟื้นฟู -ability.suppressionfield.description = ระงับยั้บยั้งการทำงานของเครื่องซ่อมแซมของทีมศัตรูที่อยู่ใกล้เคียง +ability.suppressionfield.description = ระงับยั้บยั้งการทำงานของเครื่องซ่อมแซมและหอก่อสร้าง ability.energyfield = สนามพลังงาน ability.energyfield.description = ช็อตไฟฟ้าศัตรูที่อยู่รอบข้าง ability.energyfield.healdescription = ช็อตไฟฟ้าศัตรูที่อยู่รอบข้างและฟื้นฟูรักษาพันธมิตร @@ -1119,10 +1140,10 @@ ability.liquidexplode.description = กระจายของเหลวไ ability.stat.firingrate = [stat]{0}/วิ[lightgray] อัตราการยิง ability.stat.regen = [stat]{0}[lightgray] พลังชีวิต/วิ -ability.stat.pulseregen = [stat]{0}[lightgray] health/pulse +ability.stat.pulseregen = [stat]{0}[lightgray] พลังชีวิต/จังหวะ ability.stat.shield = [stat]{0}[lightgray] เกราะ ability.stat.repairspeed = [stat]{0}/วิ[lightgray] ความเร็วการซ่อมแซม -ability.stat.deflectchance = [stat]{0}%[lightgray] deflect chance +ability.stat.deflectchance = [stat]{0}%[lightgray] โอกาสการสะท้อนกลับ ability.stat.slurpheal = [stat]{0}[lightgray] พลังชีวิต/หน่วยของเหลว ability.stat.cooldown = [stat]{0} วิ[lightgray] คูลดาวน์ ability.stat.maxtargets = [lightgray]เป้าหมายสูงสุด: [white]{0} @@ -1132,10 +1153,10 @@ ability.stat.minspeed = [stat]{0} ช่อง/วิ[lightgray] ความเ ability.stat.duration = [stat]{0} วิ[lightgray] ระยะเวลา ability.stat.buildtime = [stat]{0} วิ[lightgray] ความในการสร้าง -bar.displaytoolarge = Dimensions too large\n(Max: {0}x{0}) +bar.displaytoolarge = มิติมีขนาดใหญ่เกินไป\n(สูงสุด: {0}x{0}) bar.onlycoredeposit = ขนย้ายทรัพยากรลงแกนกลางได้เท่านั้น bar.drilltierreq = ต้องมีเครื่องขุดที่ดีกว่านี้ -bar.nobatterypower = Insufficieny Battery Power +bar.nobatterypower = พลังงานแบตเตอรี่ไม่เพียงพอ bar.noresources = ขาดทรัพยากร bar.corereq = ต้องวางบนแกนกลาง bar.corefloor = ต้องวางบนช่องโซนแกนกลาง @@ -1144,7 +1165,7 @@ bar.drillspeed = ความเร็วการขุด: {0}/วิ bar.pumpspeed = ความเร็วการปั้ม: {0}/วิ bar.efficiency = ประสิทธิภาพ: {0}% bar.boost = การเร่ง: +{0}% -bar.powerbuffer = Battery Power: {0}/{1} +bar.powerbuffer = พลังงานแบตเตอรี่: {0}/{1} bar.powerbalance = พลังงาน: {0}/วิ bar.powerstored = สะสมไว้: {0}/{1} bar.poweramount = พลังงาน: {0} @@ -1155,7 +1176,7 @@ bar.capacity = ความจุ: {0} bar.unitcap = {0} {1}/{2} bar.liquid = ของเหลว bar.heat = ความร้อน -bar.cooldown = Cooldown +bar.cooldown = คูลดาวน์ bar.instability = ความไม่เสถียร bar.heatamount = ความร้อน: {0} bar.heatpercent = ความร้อน: {0} ({1}%) @@ -1166,36 +1187,36 @@ bar.launchcooldown = คูลดาวน์การส่งทรัพย bar.input = ด้านเข้า bar.output = ด้านออก bar.strength = [lightgray]ความรุนแรง [stat]{0}[lightgray]x -bar.regenerationrate = [stat]{0}/sec[lightgray] regen rate -bar.activationtimer = Activates in {0} -bar.activated = Activated +bar.regenerationrate = [stat]{0}/วิ[lightgray] อัตราการฟื้นฟู +bar.activationtimer = เปิดใช้งานใน {0} +bar.activated = เปิดใช้งานแล้ว units.processorcontrol = [lightgray]ถูกตัวประมวลผลควบคุมอยู่ -weapon.pointdefense = [stat]Point Defense +weapon.pointdefense = [stat]อาวุธสกัดกระสุน bullet.damage = [stat]{0}[lightgray] ดาเมจ bullet.splashdamage = [stat]{0}[lightgray] ดาเมจกระจาย ~[stat] {1}[lightgray] ช่อง bullet.incendiary = [stat]ติดไฟ bullet.homing = [stat]ติดตามตัว bullet.armorpierce = [stat]เจาะเกราะ -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing -bullet.antiarmor = [stat]{0}x[lightgray] anti-armor +bullet.armorweakness = [red]{0}x[lightgray] แพ้เกราะ +bullet.partialarmorpierce = [stat]{0}%[lightgray] เจาะเกราะ +bullet.antiarmor = [stat]{0}x[lightgray] ต่อต้านเกราะ bullet.maxdamagefraction = [stat]{0}%[lightgray] ความเสียหายสูงสุด bullet.suppression = [stat]{0} วิ[lightgray] ระงับการฟื้นฟู ~ [stat]{1}[lightgray] ช่อง -bullet.empradius = [stat]{0}[lightgray] tiles EMP radius -bullet.empboost = [stat]{0}%[lightgray] overdrive ~ [stat]{1}[lightgray] -bullet.empdamage = [stat]{0}%[lightgray] power damage -bullet.empslowdown = [stat]{0}%[lightgray] enemy power overdrive ~ [stat]{1}[lightgray] -bullet.empunitdamage = [stat]{0}%[lightgray] unit damage +bullet.empradius = [stat]{0}[lightgray] ช่อง ระยะของ EMP +bullet.empboost = [stat]{0}%[lightgray] เร่งประสิทธิภาพ ~ [stat]{1}[lightgray] +bullet.empdamage = [stat]{0}%[lightgray] ดาเมจต่อพลังงาน +bullet.empslowdown = [stat]{0}%[lightgray] ประสิทธิภาพพลังงานศัตรู ~ [stat]{1}[lightgray] +bullet.empunitdamage = [stat]{0}%[lightgray] ดาเมจต่อยูนิต bullet.interval = [stat]{0}/วิ[lightgray] กระสุนช่วงระยะ: bullet.frags = [stat]{0}[lightgray]x กระสุนกระจาย: bullet.lightning = [stat]{0}[lightgray]x สายฟ้า ~ [stat]{1}[lightgray] ดาเมจ -bullet.lightninginterval = [stat]{0}[lightgray] tiles interval ~ [stat]{1}[lightgray] tiles length +bullet.lightninginterval = [stat]{0}[lightgray] ช่อง ช่วงระยะ ~ [stat]{1}[lightgray] ช่อง ระยะ bullet.buildingdamage = [lightgray]ดาเมจต่อสิ่งก่อสร้าง [stat]{0}%[lightgray] -bullet.spawnBullets = [stat]{0}x[lightgray] spawned bullets: -bullet.shielddamage = [stat]{0}%[lightgray] shield damage +bullet.spawnBullets = [stat]{0}x[lightgray] เสกกระสุน: +bullet.shielddamage = [stat]{0}%[lightgray] ดาเมจต่อโล่ bullet.knockback = [stat]{0}[lightgray] ดันกลับ bullet.pierce = [lightgray]เจาะทะลุ [stat]{0}[lightgray]x bullet.infinitepierce = [stat]เจาะทะลุ @@ -1204,8 +1225,8 @@ bullet.healamount = [lightgray]รักษาโดยตรง [stat]{0}[light bullet.multiplier = [stat]{0}[lightgray] กระสุน/ไอเท็ม bullet.reload = [lightgray]ความเร็วการยิง [stat]{0}[lightgray]% bullet.range = [lightgray]ระยะยิง [stat]{0}[lightgray] ช่อง -bullet.notargetsmissiles = [stat] ignores buildings -bullet.notargetsbuildings = [stat] ignores missiles +bullet.notargetsmissiles = [stat] เมินสิ่งก่อสร้าง +bullet.notargetsbuildings = [stat] เมินขีปนาวุธ unit.blocks = บล็อก unit.blockssquared = บล็อก² @@ -1215,7 +1236,7 @@ unit.liquidsecond = หน่วย/วินาที unit.itemssecond = ไอเท็ม/วินาที unit.liquidunits = หน่วยของเหลว unit.powerunits = หน่วยพลังงาน -unit.powerequilibrium = power equilibrium +unit.powerequilibrium = สมดุลพลังงาน unit.heatunits = หน่วยความร้อน unit.degrees = องศา unit.seconds = วินาที @@ -1232,8 +1253,8 @@ unit.millions = mil unit.billions = b unit.shots = นัด unit.pershot = /การยิง -unit.perleg = per leg -unit.perside = per side +unit.perleg = ต่อขา +unit.perside = ต่อด้าน category.purpose = วัตถุประสงค์ category.general = ทั่วไป category.power = พลังงาน @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = ปิดม็อดเมื่อเกมข setting.animatedwater.name = แอนิเมชั่นพื้นและน้ำ setting.animatedshields.name = แอนิเมชั่นโล่พลังงาน setting.playerindicators.name = ตัวบอกผู้เล่น +setting.showpings.name = แสดงจุดปิง +setting.showotherbuildplans.name = แสดงแผนก่อสร้างของผู้เล่นอื่น setting.indicators.name = ตัวบอกศัตรู/พันธมิตร setting.autotarget.name = เล็งเป้าอัตโนมัติ setting.keyboard.name = การควบคุมแบบเม้าส์ + คีย์บอร์ด @@ -1269,6 +1292,8 @@ setting.fpscap.none = ∞ setting.fpscap.text = {0} FPS setting.uiscale.name = อัตราขนาด UI setting.uiscale.description = อาจจะต้องรีสตาร์ทเพื่อใช้งานการเปลี่ยนแปลง +setting.uiEdgePadding.name = การขยายขอบ UI +setting.uiEdgePadding.description = เพิ่มช่องว่างบริเวณระยะขอบของ UI เหมาะสำหรับจอแสดงผลที่มีมุมโค้งมนหรือรอยบาก setting.swapdiagonal.name = วางเป็นเส้นทแยงเสมอ setting.screenshake.name = การสั่นของจอ setting.bloomintensity.name = ความรุนแรงของบลูม @@ -1282,14 +1307,11 @@ setting.saveinterval.name = ระยะห่างระหว่างกา setting.seconds = {0} วินาที setting.milliseconds = {0} มิลลิวินาที setting.fullscreen.name = เต็มจอ -setting.borderlesswindow.name = หน้าต่างแบบไร้ขอบ -setting.borderlesswindow.name.windows = จอเต็มแบบไร้ขอบ -setting.borderlesswindow.description = อาจจะต้องรีสตาร์ทเพื่อใช้งานการเปลี่ยนแปลง setting.fps.name = แสดง FPS และ Ping setting.console.name = เปิดใช้งานคอนโซล setting.smoothcamera.name = กล้องแบบลื่นไหล -setting.detach-camera.name = Free Camera -setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey. +setting.detach-camera.name = กล้องอิสระ +setting.detach-camera.description = หากเปิดใช้งาน กล้องจะขยับแบบอิสระโดยไม่ตามยูนิตผู้เล่น\nการตั้งค่านี้สามารถตั้งปุ่มลัดได้ setting.vsync.name = VSync setting.pixelate.name = ภาพกราฟิกแบบพิกเซล setting.minimap.name = แสดงมินิแมพ @@ -1303,14 +1325,13 @@ setting.ambientvol.name = ระดับเสียงแวดล้อม setting.mutemusic.name = ปิดเสียงเพลง setting.sfxvol.name = ระดับเสียง SFX setting.mutesound.name = ปิดเสียง -setting.crashreport.name = ส่งรายงานข้อขัดข้องแบบไม่ระบุตัวตน -setting.communityservers.name = Fetch Community Server List +setting.communityservers.name = ดึงรายชื่อเซิร์ฟเวอร์ชุมชน setting.savecreate.name = สร้างเซฟโดยอัตโนมัติ setting.steampublichost.name = การมองเห็นเกมสาธารณะ setting.playerlimit.name = จำกัดผู้เล่น setting.chatopacity.name = ความโปร่งแสงของแชท setting.lasersopacity.name = ความโปร่งแสงของลำแสงพลังงาน -setting.unitlaseropacity.name = Unit Mining Beam Opacity +setting.unitlaseropacity.name = ความโปร่งแสงของลำแสงขุดเจาะของยูนิต setting.bridgeopacity.name = ความโปร่งแสงของสะพาน setting.playerchat.name = แสดงกล่องแชทบนผู้เล่น setting.showweather.name = แสดงกราฟิกสภาพอากาศ @@ -1319,9 +1340,9 @@ setting.macnotch.name = ปรับอินเตอร์เฟซให้ setting.macnotch.description = อาจจะต้องรีสตาร์ทเพื่อใช้งานการเปลี่ยนแปลง steam.friendsonly = เพื่อนเท่านั้น steam.friendsonly.tooltip = ว่าจะให้แค่เพื่อนเท่านั้นหรือไม่ที่จะสามารถเข้าร่วมเกมของคุณได้\nหากคุณติ๊กช่องนี้ออกนั้นจะทำให้เกมของคุณเปิดเป็นสาธารณะ - ใครๆก็จะสามารถเข้าร่วมเกมของคุณได้ -setting.maxmagnificationmultiplierpercent.name = Min Camera Distance -setting.minmagnificationmultiplierpercent.name = Max Camera Distance -setting.minmagnificationmultiplierpercent.description = High values may cause performance issues. +setting.maxmagnificationmultiplierpercent.name = ระยะห่างกล้องต่ำสุด +setting.minmagnificationmultiplierpercent.name = ระยะห่างกล้องสูงสุด +setting.minmagnificationmultiplierpercent.description = การตั้งค่าที่สูงมากอาจส่งผลต่อประสิทธิภาพ public.beta = เกมเวอร์ชั่นเบต้าไม่สามารถเปิดเซิร์ฟเวอร์สาธารณะได้ uiscale.reset = อัตราขนาดของ UI ได้มีการเปลี่ยนแปลง\nกด "โอเค" เพื่อยืนยันขนาด UI นี้\n[scarlet]จะเปลี่ยนกลับไปเป็นขนาดเดิมและออกในอีก[accent] {0}[] วินาที... uiscale.cancel = ยกเลิกและออก @@ -1334,6 +1355,8 @@ category.command.name = คำสั่งยูนิต category.multiplayer.name = โหมดผู้เล่นหลายคน category.blocks.name = เลือกบล็อก placement.blockselectkeys = \n[lightgray]ปุ่ม: [{0}, +ping.text = จุดปิง: +keybind.ping.name = ตำแหน่งจุดปิง keybind.respawn.name = เกิดใหม่ keybind.control.name = ควบคุมยูนิต keybind.clear_building.name = เคลียร์สิ่งก่อสร้าง @@ -1357,18 +1380,19 @@ keybind.unit_stance_hold_fire.name = ท่าทียูนิต: หยุ keybind.unit_stance_pursue_target.name = ท่าทียูนิต: ไล่ตามเป้าหมาย keybind.unit_stance_patrol.name = ท่าทียูนิต: ลาดตระเวน keybind.unit_stance_ram.name = ท่าทียูนิต: พุ่งชน +keybind.unit_stance_boost.name = ท่าทียูนิต: บูสต์ +keybind.unit_stance_hold_position.name = ท่าทียูนิต: คงตำแหน่ง keybind.unit_command_move.name = คำสั่งยูนิต: ขยับ keybind.unit_command_repair.name = คำสั่งยูนิต: ซ่อมแซม keybind.unit_command_rebuild.name = คำสั่งยูนิต: สร้างใหม่ keybind.unit_command_assist.name = คำสั่งยูนิต: ช่วยเหลือผู้เล่น keybind.unit_command_mine.name = คำสั่งยูนิต: ขุด -keybind.unit_command_boost.name = คำสั่งยูนิต: บูสต์ -keybind.unit_command_load_units.name = คำสั่งยูนิต: โหลดยูนิต -keybind.unit_command_load_blocks.name = คำสั่งยูนิต: โหลดบล็อก -keybind.unit_command_unload_payload.name = คำสั่งยูนิต: วางสิ่งบรรทุก +keybind.unit_command_load_units.name = คำสั่งยูนิต: บรรทุกยูนิต +keybind.unit_command_load_blocks.name = คำสั่งยูนิต: บรรทุกบล็อก +keybind.unit_command_unload_payload.name = คำสั่งยูนิต: วางของที่บรรทุก keybind.unit_command_enter_payload.name = คำสั่งยูนิต: เข้าบล็อกบรรทุก -keybind.unit_command_loop_payload.name = คำสั่งยูนิต: วนซำ้การขนถ่ายยูนิต +keybind.unit_command_loop_payload.name = คำสั่งยูนิต: ลูปการขนถ่ายยูนิต keybind.rebuild_select.name = เลือกพื้นที่สร้างใหม่ keybind.schematic_select.name = เลือกพื้นที่ @@ -1398,8 +1422,8 @@ keybind.pick.name = เลือกบล็อก keybind.break_block.name = ทุบบล็อก keybind.select_all_units.name = เลือกยูนิตทั้งหมด keybind.select_all_unit_factories.name = เลือกโรงงานยูนิตทั้งหมด -keybind.select_all_unit_transport.name = Select All Unit Transports -keybind.select_across_screen.name = Select Across Screen (Hold) +keybind.select_all_unit_transport.name = เลือกขนส่งยูนิตทั้งหมด +keybind.select_across_screen.name = เลือกทั้งหน้าจอ (กดค้าง) keybind.deselect.name = ยกเลิกการเลือก keybind.pickupCargo.name = ยกสิ่งบรรทุกขึ้น keybind.dropCargo.name = วางสิ่งบรรทุกลง @@ -1407,7 +1431,7 @@ keybind.shoot.name = ยิง keybind.zoom.name = ซูม keybind.menu.name = เมนู keybind.pause.name = หยุดชั่วคราว -keybind.skip_wave.name = Skip Wave +keybind.skip_wave.name = ข้ามคลื่น keybind.pause_building.name = หยุด/สร้างต่อ keybind.minimap.name = มินิแมพ keybind.planet_map.name = แผนที่ดาวเคราะห์ @@ -1425,8 +1449,8 @@ keybind.chat_scroll.name = เลื่อนแชท keybind.chat_mode.name = เปลี่ยนโหมดแชท keybind.drop_unit.name = วางยูนิต keybind.zoom_minimap.name = ซูมมินิแมพ -keybind.detach_camera.name = Toggle Free Camera -keybind.debug_hitboxes.name = Toggle Debug Hitboxes +keybind.detach_camera.name = เปิด/ปิด กล้องอิสระ +keybind.debug_hitboxes.name = เปิด/ปิด ดีบักช่องฮิตบ็อกซ์ mode.help.title = คำอธิบายโหมด mode.survival.name = เอาชีวิตรอด mode.survival.description = โหมดปกติ ทรัพยากรมีจำกัดและคลื่นมาโดยอัตโนมัติ\n[gray]ต้องมีจุดเกิดของศัตรูเพื่อที่จะเล่น @@ -1442,10 +1466,10 @@ mode.custom = กฎแบบกำหนดเอง rules.invaliddata = ข้อมูลคลิปบอร์ดไม่ถูกต้อง rules.hidebannedblocks = ซ่อนบล็อกต้องห้าม rules.infiniteresources = ทรัพยากรไม่จำกัด -rules.fillitems = Fill Core With Items +rules.fillitems = เติมแกนกลางด้วยทรัพยากร rules.onlydepositcore = ขนย้ายทรัพยากรลงแกนกลางได้เท่านั้น -rules.coreunloaders = Allow Core Unloaders -rules.coreunloaders.info = When enabled, Serpulo unloaders can take items from the core.\nDoes not affect Erekir unloaders. +rules.coreunloaders = อนุญาตการถ่ายไอเท็มออกจากแทนกลาง +rules.coreunloaders.info = เมื่อเปิดใช้งาน ตัวถ่ายไอเท็มในเซอร์ปูโล่จะสามารถดึงไอเท็มออกจากแกนกลางได้\nไม่มีผลต่อตัวถ่ายไอเท็มในเอเรเกียร์ rules.derelictrepair = อนุญาตการซ่อมแซมบล็อกทิ้งร้าง rules.reactorexplosions = เปิดการระเบิดของเตาปฏิกร rules.coreincinerates = แกนกลางเผาทรัพยากรส่วนเกิน @@ -1459,16 +1483,16 @@ rules.alloweditworldprocessors = อนุญาตการแก้ไขต rules.alloweditworldprocessors.info = เมื่อเปิดใช้งาน ตัวประมวลผลโลกจะสามารถถูกวางและแก้ไขได้แม้จะอยู่ภายนอกตัวแก้ไข rules.waves = คลื่น rules.airUseSpawns = ยูนิตอากาศใช้จุดเกิด -rules.wavespawnatcores = Waves Spawn At Cores -rules.wavespawnatcores.info = When enabled in attack mode, waves spawn near all enemy cores. +rules.wavespawnatcores = คลื่นเกิดที่แกนกลาง +rules.wavespawnatcores.info = เมื่อเปิดใช้งานในโหมดการโจมตี คลื่นจะเกิดที่บริเวณแกนกลางทั้งหมดของศัตรู rules.attack = โหมดการโจมตี rules.buildai = AI สร้างฐานทัพ rules.buildaitier = ระดับการสร้างของ AI -rules.rtsai = RTS AI [red](ไม่เสถียร) +rules.rtsai = RTS AI rules.rtsai.campaign = AI โจมตีแบบ RTS rules.rtsai.campaign.info = ในแมพโจมตี จะทำให้ยูนิตรวมตัวกันและจู่โจมฐานทัพของผู้เล่นในวิถีการคำนวณที่ฉลาดมากกว่า -rules.clearsectoronloss = Clear Sector On Loss -rules.clearsectoronloss.info = When the sector is lost, player buildings from the previous attempt will not carry over. +rules.clearsectoronloss = ล้างเซ็กเตอร์เมื่อแพ้ +rules.clearsectoronloss.info = เมื่อสูญเสียเซ็กเตอร์ใด ๆ สิ่งก่อสร้างของผู้เล่นเมื่อรอบก่อนจะไม่ปรากฎในรอบใหม่ rules.rtsminsquadsize = ขนาดกองทัพเล็กที่สุด rules.rtsmaxsquadsize = ขนาดกองทัพใหญ่ที่สุด rules.rtsminattackweight = ขนาดน้ำหนักการโจมตีน้อยที่สุด @@ -1476,29 +1500,30 @@ rules.cleanupdeadteams = ลบล้างสิ่งก่อสร้าง rules.corecapture = ยืดแกนกลางเมื่อทำลาย rules.polygoncoreprotection = รัศมีปกป้องแกนกลางแบบหลายเหลี่ยม rules.placerangecheck = ตรวจสอบระยะห่างการวาง -rules.protectcores = Protect Cores -rules.protectcores.info = When disabled, the core no-build radius won't affect this team.\nPlayers won't be assigned to unprotected teams. -rules.checkplacement = Check Placement -rules.checkplacement.info = When disabled, buildings of this team are ignored in placement range checks. +rules.protectcores = ปกป้องแกนกลาง +rules.protectcores.info = หากปิดใช้งาน รัศมีห้ามสร้างบริเวณรอบแกนกลางจะไม่มีผลสำหรับทีมนี้ \nผู้เล่นจะไม่ถูกจัดให้อยู่ในทีมที่ไม่มีการป้องกัน +rules.checkplacement = ตรวจสอบระยะการวาง +rules.checkplacement.info = หากปิดใช้งาน สิ่งก่อสร้างของทีมนี้จะถูกเมินในการตรวจสอบระยะการวาง rules.enemyCheat = ทีมศัตรูมีทรัพยากรไม่จำกัด rules.blockhealthmultiplier = พหุคูณพลังชีวิตของบล็อก rules.blockdamagemultiplier = พหุคูณดาเมจของบล็อก +rules.unitfactoryactivation = ดีเลย์การเปิดใช้งานโรงงานยูนิต rules.unitbuildspeedmultiplier = พหุคูณความเร็วในการสร้างยูนิต rules.unitcostmultiplier = พหูคุณราคาทรัพยากรของยูนิต rules.unithealthmultiplier = พหุคูณพลังชีวิตของยูนิต rules.unitdamagemultiplier = พหุคูณพลังโจมตีของยูนิต -rules.unitcrashdamagemultiplier = พหูคูณดาเมจการตกของยานยูนิต -rules.unitminespeedmultiplier = Unit Mine Speed Multiplier -rules.logicunitcontrol = Logic Unit Control -rules.logicunitbuild = Logic Unit Building -rules.logicunitdeconstruct = Logic Unit Deconstruction +rules.unitcrashdamagemultiplier = พหุคูณดาเมจการตกของยานยูนิต +rules.unitminespeedmultiplier = พหุคูณความเร็วการขุดของยูนิต +rules.logicunitcontrol = ลอจิกควบคุมยูนิต +rules.logicunitbuild = ลอจิกยูนิตสร้างก่อสร้าง +rules.logicunitdeconstruct = ลอจิกลบทำลายยูนิต rules.solarmultiplier = พหูคุณพลังงานแสงอาทิตย์ rules.unitcapvariable = เพิ่มจำนวนยูนิตสูงสุดต่อแกนกลาง rules.unitpayloadsexplode = สิ่งบรรทุกระเบิดไปพร้อมกับยูนิต rules.unitcap = ขีดกำจัดยูนิตสูงสุดพื้นฐาน rules.limitarea = จำกัดพื้นที่แมพ rules.enemycorebuildradius = รัศมีห้ามสร้างบริเวณแกนกลางของศัตรู:[lightgray] (ช่อง) -rules.extracorebuildradius = Extra No-Build Radius:[lightgray] (tiles) +rules.extracorebuildradius = รัศมีห้ามสร้างเพิ่มเติม:[lightgray] (ช่อง) rules.wavespacing = ระยะเวลาระหว่างคลื่น:[lightgray] (วินาที) rules.initialwavespacing = ระยะเวลาระหว่างคลื่นแรก:[lightgray] (วินาที) rules.buildcostmultiplier = พหุคูณราคาทรัพยากรในการสร้าง @@ -1521,11 +1546,12 @@ rules.title.planet = ดาว rules.lighting = แสง rules.fog = หมอกแห่งสงคราม rules.invasions = การรุกรานของฐานทัพศัตรู -rules.legacylaunchpads = Legacy Launch Pad Mechanics -rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. -landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) +rules.legacylaunchpads = กลไกฐานส่งทรัพยากรแบบเก่า +rules.legacylaunchpads.info = อนุญาตการใช้ฐานส่งทรัพยากรรุ่นเก่า (เวอร์ชั่น 7.0) โดยไม่ต้องใช้ฐานลงจอดทรัพยากร +landingpad.legacy.disabled = [scarlet]\ue815 ปิดใช้งาน[lightgray] (เปิดใช้งานกลไกฐานส่งทรัพยากรแบบเก่าอยู่) rules.showspawns = แสดงจุดเกิดศัตรู rules.randomwaveai = AI คลื่นแบบคาดเดาไม่ได้ +rules.pauseDisabled = ปิดการหยุดชั่วคราว rules.fire = ไฟ rules.anyenv = <อะไรก็ได้> rules.explosions = ดาเมจการระเบิดของบล็อก/ยูนิต @@ -1539,27 +1565,27 @@ rules.randomwaveai.info = ทำให้ยูนิตที่เกิดจ rules.placerangecheck.info = ป้องกันผู้เล่นไม่ให้วางอะไรใกล้ๆกับสิ่งก่อสร้างศัตรู เมื่อวางป้อมปืน ระยะนั้นจะขยายออกมากขึ้น เพื่อไม่ให้ป้อมปืนนั้นมีระยะยิงถึงศัตรู rules.onlydepositcore.info = ป้องกันยูนิตไม่ให้โอนถ่ายไอเท็มลงสิ่งก่อสร้างใดๆ ยกเว้นแกนกลาง -database-category.item = Items -database-category.liquid = Fluids -database-category.unit = Units -database-category.block = Blocks -database-category.status = Status Effects -database-category.sector = Sectors -database-category.team = Factions +database-category.item = ไอเท็ม +database-category.liquid = ของเหลว +database-category.unit = ยูนิต +database-category.block = บล็อก +database-category.status = เอฟเฟ็กต์สถานะ +database-category.sector = เซ็กเตอร์ +database-category.team = ทีม -database-tag.turret = Turret -database-tag.production = Production -database-tag.distribution = Distribution -database-tag.liquid = Liquid -database-tag.power = Power -database-tag.defense = Defense -database-tag.crafting = Crafting -database-tag.units = Units -database-tag.effect = Utility -database-tag.logic = Logic -database-tag.unit-air = Air -database-tag.unit-naval = Naval -database-tag.unit-ground = Ground +database-tag.turret = ป้อมปืน +database-tag.production = การผลิต +database-tag.distribution = การขนส่ง +database-tag.liquid = ของเหลว +database-tag.power = พลังงาน +database-tag.defense = การป้องกัน +database-tag.crafting = โรงงาน +database-tag.units = ยูนิต +database-tag.effect = สารประโยชน์ +database-tag.logic = ลอจิก +database-tag.unit-air = อากาศ +database-tag.unit-naval = เรือ +database-tag.unit-ground = พื้นดิน wallore = (กำแพง) @@ -1582,7 +1608,7 @@ item.scrap.name = เศษเหล็ก item.fissile-matter.name = สสารฟิซไซล์ item.beryllium.name = เบริลเลี่ยม item.tungsten.name = ทังสเตน -item.oxide.name = อ๊อกไซด์ +item.oxide.name = ออกไซด์ item.carbide.name = คาร์ไบด์ item.dormant-cyst.name = ดอร์แมนท์ซิสต์ @@ -1591,7 +1617,7 @@ liquid.slag.name = แร่หลอม liquid.oil.name = น้ำมัน liquid.cryofluid.name = สารหล่อเย็น liquid.neoplasm.name = นีโอพลาสม์ -liquid.arkycite.name = อาร์คย์ไซต์ +liquid.arkycite.name = อาร์ไคไซต์ liquid.gallium.name = แกลเลียม liquid.ozone.name = โอโซน liquid.hydrogen.name = ไฮโดรเจน @@ -1640,7 +1666,7 @@ unit.corvus.name = คอร์วัส unit.stell.name = สเตลล์ unit.locus.name = โลคัส unit.precept.name = พรีเซ็ปต์ -unit.vanquish.name = แวนควิซ +unit.vanquish.name = แวนควิช unit.conquer.name = คอนเควอร์ unit.merui.name = เมรุย unit.cleroi.name = เคลอรอย @@ -1671,7 +1697,7 @@ block.space.name = อวกาศ block.salt.name = เกลือ block.salt-wall.name = กำแพงเกลือ block.pebbles.name = ก้อนกรวด -block.tendrils.name = เถาวัลย์ +block.tendrils.name = ไม้เลื้อย block.sand-wall.name = กำแพงทราย block.spore-pine.name = ต้นสนสปอร์ block.spore-wall.name = กำแพงสปอร์ @@ -1680,9 +1706,9 @@ block.snow-boulder.name = ก้อนหิมะ block.snow-pine.name = ต้นสนหิมะ block.shale.name = หินดินดาน block.shale-boulder.name = ก้อนหินดินดาน -block.moss.name = ตะไคร่น้ำ +block.moss.name = มอส block.shrubs.name = พุ่มไม้ -block.spore-moss.name = สปอร์ติดมอส +block.spore-moss.name = มอสติดสปอร์ block.shale-wall.name = กำแพงหินดินดาน block.scrap-wall.name = กำแพงเศษเหล็ก block.scrap-wall-large.name = กำแพงเศษเหล็กขนาดใหญ่ @@ -1694,8 +1720,8 @@ block.graphite-press.name = เครื่องอัดกราไฟต์ block.multi-press.name = เครื่องอัดสารพัดอย่าง block.constructing = {0} [lightgray](กำลังก่อสร้าง) block.spawn.name = จุดเกิดศัตรู -block.remove-wall.name = Remove Wall -block.remove-ore.name = Remove Ore +block.remove-wall.name = ลบกำแพง +block.remove-ore.name = ลบแร่ block.core-shard.name = แกนกลาง: ชาร์ด block.core-foundation.name = แกนกลาง: ฟาวน์เดชั่น block.core-nucleus.name = แกนกลาง: นิวเคลียส @@ -1736,28 +1762,28 @@ block.metal-floor-3.name = พื้นโลหะ 3 block.metal-floor-4.name = พื้นโลหะ 4 block.metal-floor-5.name = พื้นโลหะ 5 block.metal-floor-damaged.name = พื้นเหล็กผุพัง -block.metal-tiles-1.name = Metal Tiles 1 -block.metal-tiles-2.name = Metal Tiles 2 -block.metal-tiles-3.name = Metal Tiles 3 -block.metal-tiles-4.name = Metal Tiles 4 -block.metal-tiles-5.name = Metal Tiles 5 -block.metal-tiles-6.name = Metal Tiles 6 -block.metal-tiles-7.name = Metal Tiles 7 -block.metal-tiles-8.name = Metal Tiles 8 -block.metal-tiles-9.name = Metal Tiles 9 -block.metal-tiles-10.name = Metal Tiles 10 -block.metal-tiles-11.name = Metal Tiles 11 -block.metal-tiles-12.name = Metal Tiles 12 -block.metal-tiles-13.name = Metal Tiles 13 -block.metal-wall-1.name = Metal Wall 1 -block.metal-wall-2.name = Metal Wall 2 -block.metal-wall-3.name = Metal Wall 3 -block.colored-floor.name = Colored Floor -block.colored-wall.name = Colored Wall -block.character-overlay.name = Character Overlay -block.character-overlay-white.name = Character Overlay (White) -block.rune-overlay.name = Rune Overlay -block.rune-overlay-crux.name = Rune Overlay (Crux) +block.metal-tiles-1.name = กระเบื้องโลหะ 1 +block.metal-tiles-2.name = กระเบื้องโลหะ 2 +block.metal-tiles-3.name = กระเบื้องโลหะ 3 +block.metal-tiles-4.name = กระเบื้องโลหะ 4 +block.metal-tiles-5.name = กระเบื้องโลหะ 5 +block.metal-tiles-6.name = กระเบื้องโลหะ 6 +block.metal-tiles-7.name = กระเบื้องโลหะ 7 +block.metal-tiles-8.name = กระเบื้องโลหะ 8 +block.metal-tiles-9.name = กระเบื้องโลหะ 9 +block.metal-tiles-10.name = กระเบื้องโลหะ 10 +block.metal-tiles-11.name = กระเบื้องโลหะ 11 +block.metal-tiles-12.name = กระเบื้องโลหะ 12 +block.metal-tiles-13.name = กระเบื้องโลหะ 13 +block.metal-wall-1.name = กำแพงโลหะ 1 +block.metal-wall-2.name = กำแพงโลหะ 2 +block.metal-wall-3.name = กำแพงโลหะ 3 +block.colored-floor.name = พื้นทาสี +block.colored-wall.name = กำแพงทาสี +block.character-overlay.name = อักขระลอย +block.character-overlay-white.name = อักขระลอย (ขาว) +block.rune-overlay.name = รูนลอย +block.rune-overlay-crux.name = รูนลอย (ครักซ์) block.dark-panel-1.name = แผ่นดำ 1 block.dark-panel-2.name = แผ่นดำ 2 block.dark-panel-3.name = แผ่นดำ 3 @@ -1835,7 +1861,7 @@ block.power-void.name = หลุมดูดพลังงาน block.power-source.name = จุดกำเนิดพลังงาน block.unloader.name = ตัวถ่ายไอเท็ม block.vault.name = ตู้นิรภัย -block.wave.name = คลื่นสมุทร +block.wave.name = เวฟ block.tsunami.name = สึนามิ block.swarmer.name = สวอร์มเมอร์ block.salvo.name = ซัลโว @@ -1880,9 +1906,9 @@ block.spectre.name = สเป็คเตอร์ block.meltdown.name = เมลท์ดาวน์ block.foreshadow.name = ฟอร์ชาโดว์ block.container.name = ตู้เก็บของ -block.launch-pad.name = ฐานส่งทรัพยากร -block.advanced-launch-pad.name = Launch Pad -block.landing-pad.name = Landing Pad +block.launch-pad.name = ฐานส่งทรัพยากร [lightgray](รุ่นเก่า) +block.advanced-launch-pad.name = ฐานส่งทรัพยากร +block.landing-pad.name = ฐานลงจอดทรัพยากร block.segment.name = เซ็กเมนต์ block.ground-factory.name = โรงงานยูนิตพื้นดิน @@ -1921,38 +1947,38 @@ block.heat-source.description = ส่งออกความร้อนอย block.empty.name = ว่างเปล่า block.rhyolite-crater.name = หลุมไรโอไลต์ block.rough-rhyolite.name = ไรโอไลต์หยาบ -block.regolith.name = เรโกลิทธ์ +block.regolith.name = เรโกลิธ block.yellow-stone.name = หินเหลือง block.carbon-stone.name = หินคาร์บอน block.ferric-stone.name = หินเฟอร์ริก block.ferric-craters.name = หลุมเฟอร์ริก -block.beryllic-stone.name = หินเบริลลิค +block.beryllic-stone.name = หินเบริลลิก block.crystalline-stone.name = หินตกผลึก block.crystal-floor.name = พื้นคริสตัล block.yellow-stone-plates.name = แผ่นหินเหลือง block.red-stone.name = หินแดง block.dense-red-stone.name = หินแดงหนาแน่น block.red-ice.name = น้ำแข็งแดง -block.arkycite-floor.name = พื้นอาร์คย์ไซต์ -block.arkyic-stone.name = หินอาร์ยคิค +block.arkycite-floor.name = พื้นอาร์ไคไซต์ +block.arkyic-stone.name = หินอาร์คยิก block.rhyolite-vent.name = ปล่องไรโอไลต์ block.carbon-vent.name = ปล่องคาร์บอน -block.arkyic-vent.name = ปล่องอาร์ยคิค +block.arkyic-vent.name = ปล่องอาร์คยิก block.yellow-stone-vent.name = ปล่องหินเหลือง block.red-stone-vent.name = ปล่องหินแดง block.crystalline-vent.name = ปล่องหินตกผลืก -block.stone-vent.name = Stone Vent -block.basalt-vent.name = Basalt Vent +block.stone-vent.name = ปล่องหิน +block.basalt-vent.name = ปล่องบะซอลต์ block.redmat.name = แมตแดง block.bluemat.name = แมตน้ำเงิน block.core-zone.name = โซนแกนกลาง -block.regolith-wall.name = กำแพงเรโกลิทธ์ +block.regolith-wall.name = กำแพงเรโกลิธ block.yellow-stone-wall.name = กำแพงหินเหลือง block.rhyolite-wall.name = กำแพงไรโอไลต์ block.carbon-wall.name = กำแพงคาร์บอน block.ferric-stone-wall.name = กำแพงหินเฟอร์ริก -block.beryllic-stone-wall.name = กำแพงหินเบริลลิค -block.arkyic-wall.name = กำแพงหินอาร์ยคิค +block.beryllic-stone-wall.name = กำแพงหินเบริลลิก +block.arkyic-wall.name = กำแพงหินอาร์คยิก block.crystalline-stone-wall.name = กำแพงหินตกผลึก block.red-ice-wall.name = กำแพงน้ำแข็งแดง block.red-stone-wall.name = กำแพงหินแดง @@ -1962,9 +1988,9 @@ block.pur-bush.name = พุ่มเพอร์ block.yellowcoral.name = ปะการังเหลือง block.carbon-boulder.name = ก้อนหินคาร์บอน block.ferric-boulder.name = ก้อนหินเฟอร์ริก -block.beryllic-boulder.name = ก้อนหินเบริลลิค +block.beryllic-boulder.name = ก้อนหินเบริลลิก block.yellow-stone-boulder.name = ก้อนหินเหลือง -block.arkyic-boulder.name = ก้อนหินอาร์ยคิค +block.arkyic-boulder.name = ก้อนหินอาร์คยิก block.crystal-cluster.name = กระจุกคริสตัล block.vibrant-crystal-cluster.name = กระจุกคริสตัลสดใส block.crystal-blocks.name = ก้อนบล็อกคริสตัล @@ -1981,8 +2007,8 @@ block.oxidation-chamber.name = ห้องผสมผสานออกซิ block.electric-heater.name = เครื่องอุ่นไฟฟ้า block.slag-heater.name = เครื่องอุ่นแร่หลอม block.phase-heater.name = เครื่องอุ่นใยเฟส -block.heat-redirector.name = เครื่องเปลี่ยนเส้นทางความร้อน -block.small-heat-redirector.name = Small Heat Redirector +block.heat-redirector.name = ตัวนำความร้อน +block.small-heat-redirector.name = ตัวนำความร้อนขนาดเล็ก block.heat-router.name = เร้าเตอร์ความร้อน block.slag-incinerator.name = เตาเผาสลายแร่หลอม block.carbide-crucible.name = เบ้าหลอมคาร์ไบด์ @@ -2030,7 +2056,7 @@ block.chemical-combustion-chamber.name = ห้องเผาไหม้ทา block.pyrolysis-generator.name = เครื่องกำเนิดไฟฟ้าไพโรไลซิส block.vent-condenser.name = เครื่องควบแน่นปล่อง block.cliff-crusher.name = เครื่องบดหน้าผา -block.large-cliff-crusher.name = Advanced Cliff Crusher +block.large-cliff-crusher.name = เครื่องบดหน้าผาขั้นสูง block.plasma-bore.name = เครื่องขุดเจาะพลาสม่า block.large-plasma-bore.name = เครื่องขุดเจาะพลาสม่าขนาดใหญ่ block.impact-drill.name = เครื่องขุดแรงกระแทก @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = เร้าเตอร์บรรท block.payload-mass-driver.name = เครื่องโอนถ่ายสิ่งบรรทุก block.small-deconstructor.name = เครื่องลบทำลายขนาดเล็ก block.canvas.name = หน้าจอวาดรูป +block.large-canvas.name = หน้าจอวาดรูปขนาดใหญ่ block.world-processor.name = ตัวประมวลผลโลก block.world-cell.name = เซลล์โลก block.tank-fabricator.name = เครื่องสรรค์สร้างรถถัง @@ -2078,7 +2105,7 @@ block.logic-processor.name = ตัวประมวลผลลอจิก block.hyper-processor.name = ตัวประมวลผลไฮเปอร์ block.logic-display.name = หน้าจอลอจิก block.large-logic-display.name = หน้าจอลอจิกขนาดใหญ่ -block.tile-logic-display.name = Tiled Logic Display +block.tile-logic-display.name = หน้าจอลอจิกแบบไร้รอยต่อ block.memory-cell.name = เซลล์ความจำ block.memory-bank.name = ธนาคารความจำ @@ -2119,12 +2146,11 @@ hint.payloadPickup = กด [accent][[[] เพื่อหยิบบล็อ hint.payloadPickup.mobile = [accent]กดค้างไว้[]ที่บล็อกเล็กๆ หรือตัวยูนิตเพื่อหยิบขึ้นมา hint.payloadDrop = กด [accent]][] เพื่อวางสิ่งที่บรรทุกอยู่ hint.payloadDrop.mobile = [accent]กดค้างไว้[]ที่พื้นที่โล่งๆ เพื่อวางสิ่งที่บรรทุกอยู่ -hint.waveFire = ป้อมปืน[accent]คลื่นน้ำ[]หากเติมน้ำเข้าไปจะช่วยดับไฟรอบข้างให้อัตโนมัติ -hint.generator = :combustion-generator: [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[]จะเผาถ่านและส่งพลังงานไปยังบล็อกที่อยู่ใกล้ๆ\n\nระยะของพลังงานสามารถขยายได้ด้วย :power-node: [accent]ตัวจ่ายพลังงาน[] +hint.waveFire = ป้อมปืน[accent]เวฟ[]หากเติมน้ำเข้าไปจะช่วยดับไฟรอบข้างให้อัตโนมัติ hint.guardian = หน่วย[accent]ผู้พิทักษ์[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ :graphite: [accent]กราไฟท์[]ใส่ใน :duo: ดูโอ/ :salvo: ซัลโวเป็นกระสุนเพื่อทำลายผู้พิทักษ์ hint.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง :core-foundation: [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ :core-shard: [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง -hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. -hint.cannotUpgrade = A [red]:tree:[] icon over a payload unit indicates that its upgraded version is not researched yet.\n\nUnit upgrades must be researched in the [accent]:tree: tech tree[] before they can be produced in reconstructors. +hint.serpuloCoreZone = สามารถสร้างแกนกลางเพิ่มเติมได้บนช่อง :core-zone: [accent]โซนแกนกลาง[] +hint.cannotUpgrade = ไอคอน [red]:tree:[] เหนือยูนิตในเครื่องแปลว่าคุณยังไม่ได้วิจัยรุ่นอัปเกรดของยูนิตนี้\n\nจำเป็นต้องวิจัยรุ่นอัปเกรดของยูนิตที่ [accent]:tree: ต้นไม้เทค[] ก่อนถึงจะสามารถผลิตในเครื่องพัฒนาได้ hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง hint.presetDifficulty = เซ็กเตอร์นี้มี[scarlet]ระดับภัยคุกคามศัตรูสูง[]\n[accent]ไม่แนะนำ[]ให้ลงจอดไปยังเซ็กเซอร์พวกนั้นหากไม่มีการเตรียมพร้อมและเทคโนโลยี hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่กักเก็บไว้เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[] @@ -2133,8 +2159,8 @@ hint.factoryControl.mobile = เพื่อที่จะตั้ง[accent] gz.mine = ขยับเข้าไปใกล้ๆ กับ :ore-copper: [accent]แร่ทองแดง[]ที่อยู่บนพื้นแล้วคลิ๊กเพื่อเริ่มการขุด gz.mine.mobile = ขยับเข้าไปใกล้ๆ กับ :ore-copper: [accent]แร่ทองแดง[]ที่อยู่บนพื้นแล้วกดที่แร่เพื่อเริ่มการขุด -gz.research = เปิด :tree: ต้นไม้แห่งเทคโนโลยี\nวิจัย :mechanical-drill: [accent]เครื่องขุดเชิงกล[] แล้วกดเลือกจากเมนูตรงแถบขวาล่าง\nคลิ๊กที่กลุ่มแร่ทองแดงเพื่อวางที่ขุด -gz.research.mobile = เปิด :tree: ต้นไม้แห่งเทคโนโลยี\nวิจัย :mechanical-drill: [accent]เครื่องขุดเชิงกล[] แล้วกดเลือกจากเมนูตรงแถบขวาล่าง\nกดที่กลุ่มแร่ทองแดงเพื่อวางที่ขุด\n\nกดปุ่ม \ue800 [accent]ติ๊กถูก[]ที่แถบล่างขวาเพื่อยืนยัน +gz.research = เปิด :tree: ต้นไม้เทค\nวิจัย :mechanical-drill: [accent]เครื่องขุดเชิงกล[] แล้วกดเลือกจากเมนูตรงแถบขวาล่าง\nคลิ๊กที่กลุ่มแร่ทองแดงเพื่อวางที่ขุด +gz.research.mobile = เปิด :tree: ต้นไม้เทค\nวิจัย :mechanical-drill: [accent]เครื่องขุดเชิงกล[] แล้วกดเลือกจากเมนูตรงแถบขวาล่าง\nกดที่กลุ่มแร่ทองแดงเพื่อวางที่ขุด\n\nกดปุ่ม \ue800 [accent]ติ๊กถูก[]ที่แถบล่างขวาเพื่อยืนยัน gz.conveyors = วิจัยและวาง :conveyor: [accent]สายพาน[] เพื่อเคลื่อนย้ายทรัพยากรที่ขุดมาได้\nจากที่ขุดไปยังแกนกลาง\n\nกดคลิ๊กแล้วลากเพื่อวางสายพานหลายๆ อันให้เป็นทาง\n[accent]หมุนเม้าส์[]เพื่อหมุน gz.conveyors.mobile = วิจัยและวาง :conveyor: [accent]สายพาน[] เพื่อเคลื่อนย้ายทรัพยากรที่ขุดมาได้\nจากที่ขุดไปยังแกนกลาง\n\nใช้นิ้วกดค้างที่ตำแหน่งซักวิแล้วลากเพื่อวางสายพานหลายๆ อันให้เป็นทาง gz.drills = ขยายปฎิบัติการขุด\nวางเครื่องขุดเชิงกลเพิ่ม\nขุดทองแดง 100 ชิ้น @@ -2152,37 +2178,47 @@ gz.zone2 = สิ่งก่อสร้างทุกอย่างในร gz.zone3 = คลื่นกำลังจะเริ่มขึ้นแล้ว\nเตรียมตัวให้พร้อม gz.finish = สร้างป้อมปืนเพิ่ม ขุดทรัพยากรให้ได้มากกว่านี้\nแล้วป้องกันคลื่นทั้งหมดเพื่อ[accent]ยึดครองเซ็กเตอร์[] -fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. -fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. +ff.coal = ใช้ :mechanical-drill: [accent]เครื่องขุดเชิงกล[] เพื่อขุด :ore-coal: [accent]ถ่านหิน[] +ff.graphitepress = :tree: วิจัยและวาง :graphite-press: [accent]เครื่องอัดกราไฟต์[] +ff.craft = นำ :coal: ถ่านหินใส่เข้าไปใน :graphite-press: [accent]เครื่องอัดกราไฟต์[]\nเครื่องนี้จะผลิต :graphite: กราไฟต์ และส่งออกสู่สายพานรอบข้าง\nนำ :graphite: กราไฟต์ ที่ได้จาก :graphite-press: [accent]เครื่องอัดกราไฟต์[] ไปที่แกนกลาง +ff.generator = :coal: ถ่านหิน สามารถนำไปใช้เป็นเชื้อเพลิงให้กับ :combustion-generator: [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[].\nวิจัยและวาง :combustion-generator: [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[] +ff.coalpower = นำ :coal: ถ่านหิน ใส่เข้าไปในเครื่องกำเนิดไฟฟ้าเผื่อผลิต [accent]:power: ไฟฟ้า[] +ff.coalpower.objective = :combustion-generator: ผลิตไฟฟ้า +ff.node = :power-node: [accent]ตัวจ่ายพลังงาน[] จะจ่ายไฟฟ้าให้บล็อกที่อยู่ในรัศมีใกล้เคียง\nวิจัยและวาง :power-node: [accent]ตัวจ่ายพลังงาน[] ไว้ใกล้กับเครื่องกำเนิดไฟฟ้า +ff.battery = :battery: [accent]แบตเตอรี่[] จะช่วยกักเก็บพลังงาน\nวิจัยและวาง :battery: [accent]แบตเตอรี่[] ใกล้กับตัวจ่ายไฟฟ้า +ff.arc = ป้อมปืน :arc: [accent]อาร์ค[] จำเป็นต้องใช้ไฟฟ้าในการทำงาน วิจัยและวาง :arc: [accent]อาร์ค[] ใกล้กับตัวจ่ายไฟฟ้า -frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Research and reconstruct\na []:dagger:[accent] dagger to a []:mace:[accent] mace. -frontier.tutorial2 = Enemy waves send [accent]infinitely[] until all enemy cores are [unlaunched]destroyed. -frontier.tutorial3 = [accent]Attack the enemy base fast to prevent waves from getting too high[]. +fungalpass.tutorial1 = ใช้ [accent]ยูนิต[] เพื่อปกป้องสิ่งก่อสร้างและโจมตีศัตรู\nวิจัยและวาง :ground-factory: [accent]โรงงานยูนิตพื้นดิน[] +fungalpass.tutorial2 = เลือกยูนิต :dagger: [accent]แด็กเกอร์[] ในโรงงาน\nผลิตยูนิต 3 ตัว -atolls.destroy1 = Destroy the 2 enemy [accent]foundation cores[] first.\n[accent]Gain access to thorium[]. -atolls.mega1 = Enter [accent]command mode[] and select the :mega:[accent]Mega[] units. -atolls.mega2 = Select the \ue87b [accent]Load Units[] command to have Mega units to pick up ground units. -atolls.mega3 = Move the Mega units [accent]above[] ground units to load them in. -atolls.mega4 = [accent]Drop ground units here to attack. -atolls.mega5 = Select the \ue879 [accent]Unload Payload[] command to have Mega units drop their carried units. -atolls.mega6 = Units will be [accent]automatically dropped[] while the \ue879 Unload Payload command is selected. -atolls.mega7 = Mega units [accent]will not[] drop ground units while they are above walls or deep water. -atolls.mega8 = [accent]Drop naval units here to attack.[] -atolls.attack1 = 1: Drop ground units here to attack from this location. -atolls.attack2 = 2: Alternatively, drop naval units here to launch a surprise attack. -atolls.carry1 = Carrying ground units requires :mega:[accent]Mega[] units. -atolls.carry2 = 1: Command Mega units to [accent]move over[] the ground units. -atolls.carry3 = 2: Select the \ue87b [accent]Load Units[] command in order to pick up the ground units with the Mega units. -atolls.carry4 = 3: Command and move the Mega carriers [accent]loaded with units[]. -atolls.carry5 = 4: Select the \ue879 [accent]'Unload Payload'[] command in order for the Mega units to drop the ground units. -atolls.carry6 = These steps can be reviewed [accent]here[]. -atolls.carry7 = Follow these instructions to airdrop more units near the enemy base. -atolls.noairunit = This base is too well-fortified to destroy with air units. -atolls.2strategies = There are two strategies to destroy this base. +frontier.tutorial1 = :additive-reconstructor: [accent]เครื่องพัฒนารุ่นบวก[]\nจะอัปเกรดยูนิตรุ่นที่ 1 ให้เป็นยูนิตรุ่นที่ 2\nโดยใช้ :silicon: ซิลิกอนและ :graphite: กราไฟต์\n\n[accent]วิจับและพัฒนา\n[]:dagger:[accent] แด็กเกอร์ ให้เป็น []:mace:[accent] เมส +frontier.tutorial2 = คลื่นศัตรูจะปล่อยออกมา[accent]อย่างไม่มีที่สิ้นสุด[] จนกว่าแกนกลางของฐานทัพศัตรูทั้งหมดจะ[unlaunched]ถูกทำลาย +frontier.tutorial3 = [accent]โจมตีฐานทัพศัตรูอย่างรวดเร็วเพื่อป้องกันไม่ให้คลื่นเพิ่มสูงมากเกินไป[] + +atolls.destroy1 = ทำลายฐานทัพศัตรูที่มี [accent]แกนกลาง: ฟาวน์เดชั่น[] สองฐานนี้ก่อน\n[accent]เข้ายึดครองแหล่งทอเรี่ยม[] +atolls.mega1 = เข้าไปยัง [accent]โหลดสั่งการ[] และเลือกยูนิต :mega:[accent]เมก้า[] +atolls.mega2 = เลือกคำสั่ง \ue87b [accent]บรรทุกยูนิต[] เพื่อให้เมก้าหยิบยูนิตพื้นดินขึ้นมา +atolls.mega3 = ขยับยูนิตเมก้าให้อยู่[accent]เหนือ[]ยูนิตพื้นดินเพื่อบรรทุกมันเข้าไปในเมก้า +atolls.mega4 = [accent]ส่งยูนิตพื้นดินลงตรงนี้เพื่อโจมตี +atolls.mega5 = เลือกคำสั่ง \ue879 [accent]วางของที่บรรทุก[] เพื่อให้ยูนิตเมก้าวางยูนิตที่บรรทุกมาลง +atolls.mega6 = ยูนิตจะ[accent]ถูกปล่อยโดยอัตโนมัติ[]ในระหว่างที่คำสั่ง \ue879 วางของที่บรรทุกนั้นถูกเลือกอยู่ +atolls.mega7 = ยูนิตเมก้า[accent]จะไม่[]วางยูนิตพื้นดินลงในระหว่างที่มันลอยอยู่เหนือกำแพงหรือน้ำลึก +atolls.mega8 = [accent]วางยูนิตเรือตรงนี้เพื่อโจมตี[] +atolls.attack1 = 1: ส่งยูนิตภาคพื้นดินลงมาตรงนี้เพื่อเริ่มโจมตีจากตำแหน่งนี้ +atolls.attack2 = 2: มีอีกวิธีคือ ส่งยูนิตเรือลงมาตรงนี้เพื่อเปิดฉากโจมตี +atolls.carry1 = การบรรทุกยูนิตพื้นดินจำเป็นต้องใช้ :mega:[accent]เมก้า[] +atolls.carry2 = 1: สั่งการยูนิตเมก้าให้ [accent]ขนย้าย[] ยูนิตพื้นดิน +atolls.carry3 = 2: เลือกคำสั่ง \ue87b [accent]บรรทุกยูนิต[] เพื่อหยิบยูนิตพื้นดินขึ้นมาด้วยเมก้า +atolls.carry4 = 3: สั่งการและเคลื่อนย้ายยูนิตเมก้าที่[accent]บรรทุกยูนิตมาด้วย[] +atolls.carry5 = 4: เลือกคำสั่ง \ue879 [accent]'วางของที่บรรทุก'[] เพื่อให้เมก้าวางยูนิตพื้นดินลง +atolls.carry6 = คุณสามารถดูขั้นตอนเหล่านี้อีกครั้งได้ [accent]ที่นี่[] +atolls.carry7 = ทำตามคำแนะนำเหล่านี้เพื่อส่งยูนิตเพิ่มเติมไปใกล้กับฐานทัพของศัตรู +atolls.noairunit = ฐานทัพนี้มีการป้องกันที่แน่นหนาเกินกว่าที่จะทำลายด้วยยูนิตอากาศได้ +atolls.2strategies = มีสองกลยุทธ์เพื่อที่จะทำลายฐานทัพนี้ onset.mine = กดคลิ๊กซ้ายเพื่อขุด :beryllium: [accent]เบริลเลี่ยม[] จากกำแพง\n\nกด [accent][[WASD][] เพื่อขยับ onset.mine.mobile = กดที่หน้าจอเพื่อขุด :beryllium: [accent]เบริลเลี่ยม[] จากกำแพง -onset.research = เปิดหน้า :tree: ต้นไม้แห่งเทคโนโลยี\nวิจัย แล้ววาง :turbine-condenser: [accent]เครื่องควบแน่นกังหัน[] บนปล่อง\nเครื่องนี้จะผลิต[accent]พลังงาน[] +onset.research = เปิดที่หน้า :tree: ต้นไม้เทค\nวิจัย แล้ววาง :turbine-condenser: [accent]เครื่องควบแน่นกังหัน[] บนปล่อง\nเครื่องนี้จะผลิต[accent]พลังงาน[] onset.bore = วิจัยและวาง :plasma-bore: [accent]เครื่องขุดเจาะพลาสม่า[]\nเครื่องนี้จะขุดทรัพยากรที่อยู่ในกำแพงให้โดยอัตโนมัติ onset.power = เพื่อที่จะ[accent]จ่ายพลังงาน[]ให้กับเครื่องขุดเจาะพลาสม่า วิจัยและวาง :beam-node: [accent]โหนดลำแสง[]\nลากโหนดเพื่อเชื่อมต่อเครื่องควบแน่นกังหันกับเครื่องขุดเจาะพลาสม่า onset.ducts = วิจัยและวาง :duct: [accent]ท่อสูญญากาศ[]เพื่อเคลื่อนย้ายทรัพยากรที่ขุดมาได้จากเครื่องขุดเจาะพลาสม่าไปยังแกนกลาง\nกดคลิ๊กแล้วลากเพื่อวางท่อสูญญากาศหลายๆ ท่อให้เป็นทาง\n[accent]หมุนเม้าส์[]เพื่อหมุน @@ -2196,15 +2232,15 @@ onset.fabricator = ใช้[accent]ยูนิต[]เพื่อสำรว onset.makeunit = ผลิตยูนิตขึ้นมา\nใช้ปุ่ม "?" เพื่อดูความต้องการทรัพยากรของแต่ละโรงงานที่เลือกมา onset.turrets = ยูนิตนั้นมีประสิทธิภาพ แต่[accent]ป้อมปืน[]นั้นสามารถที่จะใช้ตั้งรับได้ดีกว่าหากใช้อย่างมีประสิทธิภาพ\nวางป้อมปืน :breach: [accent]บรีช[]\nป้อมปืนจำเป็นจะต้องใช้ :beryllium: [accent]กระสุน[] onset.turretammo = เติมกระสุนให้แก่ป้อมปืนด้วย[accent]กระสุนเบริลเลี่ยม[] -onset.walls = [accent]กำแพง[]สามารถป้องกันความเสียหายที่จะมาถึงให้ไม่ไปโดนสิ่งก่อสร้างได้\nวางกำแพง :beryllium-wall: [accent]กำแพงเบริลเลี่ยม[]รอบๆ ป้อมปืน +onset.walls = [accent]กำแพง[] สามารถป้องกันความเสียหายที่จะมาถึงให้ไม่ไปโดนสิ่งก่อสร้างได้\nวางกำแพง :beryllium-wall: [accent]กำแพงเบริลเลี่ยม[]รอบๆ ป้อมปืน onset.enemies = ศัตรูกำลังจะเข้ามา เตรียมตัวป้องกันให้ดี onset.defenses = [accent]ติดตั้งแนวป้องกัน:[lightgray] {0} onset.attack = ศัตรูอ่อนแอลงแล้ว ตอบโต้กลับ onset.cores = แกนกลางใหม่สามารถวางได้บน[accent]โซนแกนกลาง[]\nแกนกลางใหม่จะทำหน้าที่เป็นฐานทัพด่านหน้าและจะแบ่งปันทรัพยากรกับแกนกลางอื่นๆ\nวาง :core-bastion: แกนกลาง onset.detect = ศัตรูจะสามารถตรวจจับการมีอยู่ของคุณได้ในอีก 2 นาที\nจัดตั้งกองกำลังป้องกัน ปฏิบัติการขุด และการผลิต -onset.commandmode = Hold [accent]shift[] to enter [accent]command mode[].\n[accent]Left-click and drag[] to select units.\n[accent]Right-click[] to order selected units to move or attack. -onset.commandmode.mobile = Press the [accent]command button[] to enter [accent]command mode[].\nHold down a finger, then [accent]drag[] to select units.\n[accent]Tap[] to order selected units to move or attack. -aegis.tungsten = Tungsten can be mined using an [accent]impact drill[].\nThis structure requires [accent]water[] and [accent]power[]. +onset.commandmode = กด [accent]shift[] เพื่อเข้าสู่ [accent]โหมดสั่งการ[]\n[accent]คลิ๊กซ้ายแล้วลาก[] เพื่อเลือกยูนิต\n[accent]คลิ๊กขวา[] เพื่อสั่งการยูนิตที่เลือกให้ขยับหรือโจมตี +onset.commandmode.mobile = กด [accent]ปุ่มสั่งการ[] เพื่อเข้าสู่ [accent]โหมดสั่งการ[]\nจิ้มนิ้วลงไปแล้ว [accent]ลาก[] เพื่อเลือกยูนิต\n[accent]กด[] เพื่อสั่งการยูนิตที่เลือกให้ขยับหรือโจมตี +aegis.tungsten = สามารถขุดทังสเตนได้ด้วย [accent]เครื่องขุดแรงกระแทก[]\nโดยเครื่องนี้จำเป็นต้องใช้ [accent]น้ำ[] และ [accent]พลังงาน[] split.pickup = บล็อกบางชนิดสามารถถูกหยิบขึ้นมาได้ด้วยยูนิตแกนกลาง\nบรรทุก[accent]ที่เก็บของ[]นี้มาแล้วเอาไปวางใน[accent]เครื่องโหลดสิ่งบรรทุก[]\n(ปุ่มค่าเริ่มต้นคือ [ สำหรับหยิบและ ] สำหรับวางบล็อก) split.pickup.mobile = บล็อกบางชนิดสามารถถูกหยิบขึ้นมาได้ด้วยยูนิตแกนกลาง\nบรรทุก[accent]ตู้เก็บของ[]นี้มาแล้วเอาไปวางใน[accent]เครื่องโหลดสิ่งบรรทุก[]\n(เพื่อจะหยิบหรือวางสิ่งใดๆ ให้กดค้างที่ตำแหน่งที่ต้องการหยิบหรือวาง) @@ -2296,10 +2332,10 @@ block.phase-wall.description = ป้องกันสิ่งก่อสร block.phase-wall-large.description = ป้องกันสิ่งก่อสร้างจากศัตรู ทนทานและแข็งแรง\nเคลือบด้วยวัสดุพิเศษที่สะท้อนกระสุนส่วนใหญ่ที่รับมา\nครอบคลุมหลายช่อง block.surge-wall.description = ป้องกันสิ่งก่อสร้างจากศัตรู แข็งแกร่งอย่างมาก\nจะปล่อยพลังงานสายฟ้าออกมาเป็นระยะๆ เมื่อถูกโจมตี block.surge-wall-large.description = ป้องกันสิ่งก่อสร้างจากศัตรู แข็งแกร่งอย่างมาก\nจะปล่อยพลังงานสายฟ้าออกมาเป็นระยะๆ เมื่อถูกโจมตี\nครอบคลุมหลายช่อง -block.scrap-wall.description = Protects structures from enemy projectiles. -block.scrap-wall-large.description = Protects structures from enemy projectiles. -block.scrap-wall-huge.description = Protects structures from enemy projectiles. -block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. +block.scrap-wall.description = ป้องกันสิ่งก่อสร้างจากศัตรู ทำมาจากเศษเหล็ก +block.scrap-wall-large.description = ป้องกันสิ่งก่อสร้างจากศัตรู ทำมาจากเศษเหล็ก ครอบคลุมหลายช่อง +block.scrap-wall-huge.description = ป้องกันสิ่งก่อสร้างจากศัตรู ทำมาจากเศษเหล็ก ขนาดใหญ่มากๆ +block.scrap-wall-gigantic.description = ป้องกันสิ่งก่อสร้างจากศัตรู ทำมาจากเศษเหล็ก ขนาดใหญ่มหึมา block.door.description = กำแพงที่สามารถเปิดและปิดได้ ไว้ใช้เพื่อให้ยูนิตเดินผ่าน block.door-large.description = กำแพงที่สามารถเปิดและปิดได้ ไว้ใช้เพื่อให้ยูนิตเดินผ่าน\nครอบคลุมหลายช่อง block.mender.description = ซ่อมแซมสิ่งก่อสร้างในวงของมันอย่างช้าๆ\nสามารถใช้ซิลิกอนเพื่อเพิ่มระยะและประสิทธิภาพได้ @@ -2366,9 +2402,9 @@ block.vault.description = เก็บไอเท็มแต่ละชนิ block.container.description = เก็บไอเท็มแต่ละชนิดได้นิดหน่อย สามารถใช้ตัวถ่ายไอเท็มในการดึงไอเท็มออกมาได้ block.unloader.description = ดึงไอเท็มที่กำหนดไว้ออกมาจากบล็อกใกล้เคียง block.launch-pad.description = ส่งไอเท็มเป็นชุดๆ ไปยังเซ็กเตอร์ที่กำหนดไว้ -block.advanced-launch-pad.description = Launches batches of items to selected sectors. Only accepts one item type at a time. -block.advanced-launch-pad.details = Sub-orbital system for point-to-point transportation of resources. -block.landing-pad.description = Receives items from launch pads in other sectors. Requires large amounts of water to protect against impacts of landings. +block.advanced-launch-pad.description = ส่งไอเท็มเป็นชุดๆ ไปยังเซ็กเตอร์ที่กำหนดไว้ รับไอเท็มแค่ชนิดเดียวต่อรอบเท่านั้น +block.advanced-launch-pad.details = ระบบยานวงโคจรย่อยสำหรับการขนส่งทรัพยากรแบบจุดต่อจุด +block.landing-pad.description = รับไอเท็มจากฐานส่งทรัพยากรที่มาจากเซ็กเตอร์อื่นๆ จำเป็นต้องใช้น้ำปริมาณมากเพื่อป้องกันแรงกระแทกจากการลงจอด block.duo.description = ป้อมปืนขนาดเล็ก ยิงกระสุนที่อยู่ในตัวมันใส่เป้าหมายศัตรู block.scatter.description = ยิงก้อนตะกั่ว เศษเหล็กหรือกระจกเมต้าใส่ยานบินศัตรูที่อยู่ใกล้เคียง block.scorch.description = เผาศัตรูพื้นดินที่อยู่ใกล้ๆ มีประสิทธิภาพสูงสุดเมื่อใช้ในระยะใกล้ @@ -2408,7 +2444,7 @@ block.memory-cell.description = เก็บข้อมูลเป็นตั block.memory-bank.description = เก็บข้อมูลเป็นตัวเลขสำหรับตัวประมวลผลลอจิกไว้สื่อสารกันไปมา มีพื้นที่เยอะมาก block.logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก block.large-logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก มีขนาดใหญ่กว่า -block.tile-logic-display.description = Displays arbitrary graphics from a logic processor.\nSeamlessly connects to nearby tiled display blocks. +block.tile-logic-display.description = แสดงกราฟิกโดยควบคุมจากตัวประมวลผลลอจิก\nเชื่อมต่อกับหน้าจอลอจิกชนิดเดียวกันได้แบบไร้รอยต่อ block.interplanetary-accelerator.description = หอคอยเรลกันแม่เหล็กไฟฟ้าขนาดมหึมา เร่งความเร็วแกนกลางเพื่อบินสู่อวกาศไปยังดาวเคราะห์อื่นๆ block.repair-turret.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีของมันอย่างต่อเนื่อง สามารถใช้ของเหลวมาหล่อเย็นเพื่อเพิ่มประสิทธิภาพได้ @@ -2427,25 +2463,25 @@ block.scathe.description = ป้อมปืนพิสัยไกลอย block.smite.description = บทลงโทษจากสวรรค์ ปะทุยิงแนวกระสุนสายฟ้าเจาะกราะใส่เป้าหมายศัตรู block.malign.description = ระดมยิงกระสุนเลเซอร์สายฟ้าติดตามตัวจำนวนมากใส่เป้าหมายศัตรู ต้องใช้ความร้อนจำนวนมากเพื่อที่จะทำงานได้อย่างเต็มประสิทธิภาพ block.silicon-arc-furnace.description = ผลิตซิลิกอนจากการหลอมทรายและกราไฟต์เข้าด้วยกัน -block.oxidation-chamber.description = แปลงเบริลเลี่ยมและโอโซนให้กลายเป็นอ๊อกไซด์ ปล่อยความร้อนออกมาซึ่งเป็นผลมาจากปฎิบัติการ +block.oxidation-chamber.description = แปลงเบริลเลี่ยมและโอโซนให้กลายเป็นออกไซด์ ปล่อยความร้อนออกมาซึ่งเป็นผลมาจากปฎิบัติการ block.electric-heater.description = สร้างความร้อนขึ้นมาจากพลังงาน ใช้พลังงานจำนวนมาก ใช้โดยการหันหน้าลูกศรไปในทางที่ต้องการจะปล่อยความร้อนออกมา block.slag-heater.description = สร้างความร้อนขึ้นมาจากแร่หลอม ใช้โดยการหันหน้าลูกศรไปในทางที่ต้องการจะปล่อยความร้อนออกมา block.phase-heater.description = สร้างความร้อนขึ้นมาจากการอุ่นใยเฟส ใช้โดยการหันหน้าลูกศรไปในทางที่ต้องการจะปล่อยความร้อนออกมา block.heat-redirector.description = เปลี่ยนทิศทางของความร้อนที่สะสมมาให้ไปหาบล็อกที่มันหันหน้าเข้าใส่ -block.small-heat-redirector.description = Redirects accumulated heat to other blocks. +block.small-heat-redirector.description = เปลี่ยนทิศทางของความร้อนที่สะสมมาให้ไปหาบล็อกที่มันหันหน้าเข้าใส่ block.heat-router.description = กระจายความร้อนที่สะสมมาออกไปในสามทิศทาง block.electrolyzer.description = เปลี่ยนน้ำให้กลายเป็นแก็สไฮโดรเจนและโอโซนด้วยขบวนการทางเคมี block.atmospheric-concentrator.description = หลอมรวมไนโตรเจนจากชั้นบรรยากาศ ใช้ความร้อนในการทำงาน block.surge-crucible.description = หลอมรวมแร่หลอมและซิลิกอนเพื่อผลิตโลหะผสมเสิร์จ ใช้ความร้อนในการทำงาน block.phase-synthesizer.description = สังเคราะห์ใยเฟสจากทอเรี่ยม ทรายและแก็สโอโซน ใช้ความร้อนในการทำงาน block.carbide-crucible.description = หลอมรวมกราไฟต์และทังสเตนเพื่อผลิตคาร์ไบต์ ใช้ความร้อนในการทำงาน -block.cyanogen-synthesizer.description = สังเคราะห์ไซยาโนเจนจากอาร์คย์ไซต์และกราไฟต์ ใช้ความร้อนในการทำงาน +block.cyanogen-synthesizer.description = สังเคราะห์ไซยาโนเจนจากอาร์ไคไซต์และกราไฟต์ ใช้ความร้อนในการทำงาน block.slag-incinerator.description = เผาทำลายไอเท็มหรือของเหลวที่เสถียรทั้งหมดที่ได้รับมา ต้องใช้แร่หลอมเพื่อทำงาน block.vent-condenser.description = ควบแน่นแก็สในปล่องให้กลายเป็นน้ำ ต้องใช้พลังงาน block.plasma-bore.description = เมื่อหันหน้าเข้าหาแร่กำแพง จะขุดแร่นั้นและส่งออกมาอย่างช้าๆ ไปเรื่อยๆ ไม่มีที่สิ้นสุด จำเป็นต้องใช้พลังงานเล็กน้อย สามารถใช้ไฮโดรเจนเพื่อเพิ่มประสิทธิภาพการขุดได้ block.large-plasma-bore.description = เครื่องขุดเจาะพลาสม่าที่ใหญ่กว่า สามารถขุดแร่ทังสเตนและทอเรี่ยมได้ ต้องใช้ไฮโดรเจนและพลังงานในการทำงาน สามารถใช้ไนโตรเจนเพื่อเพิ่มประสิทธิภาพการขุดได้ block.cliff-crusher.description = เมื่อหันหน้าเข้าหากำแพงที่ต้องการ จะบดขยี้กำแพงนั้น และส่งออกผงทรายละเอียดออกมาอย่างไม่มีที่สิ้นสุด จำเป็นต้องใช้พลังงาน ประสิทธิภาพของการบดขึ้นอยู่กับชนิดของกำแพงที่บด -block.large-cliff-crusher.description = Crushes walls, outputting sand indefinitely. Requires power and ozone. Efficiency varies based on type of wall. Optionally consumes tungsten to increase efficiency. +block.large-cliff-crusher.description = เมื่อหันหน้าเข้าหากำแพงที่ต้องการ จะบดขยี้กำแพงนั้น และส่งออกผงทรายละเอียดออกมาอย่างไม่มีที่สิ้นสุด จำเป็นต้องใช้พลังงานและโอโซน ประสิทธิภาพของการบดขึ้นอยู่กับชนิดของกำแพงที่บด สามารถใช้ทังสเตนเพื่อเพิ่มประสิทธิภาพการขุดได้ block.impact-drill.description = เมื่อวางบนพื้นแร่ จะขุดแร่นั้นและส่งออกมาเป็นกลุ่มไปเรื่อยๆ ไม่มีที่สิ้นสุด จำเป็นต้องใช้พลังงานและน้ำ block.eruption-drill.description = เครื่องขุดแรงกระแทกที่ได้รับการปรับปรุง สามารถขุดทอเรี่ยมได้ จำเป็นต้องใช้ไฮโดรเจน block.reinforced-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า ไม่รับของเหลวจากด้านข้างยกเว้นว่าจะเป็นท่อน้ำด้วยกันเอง @@ -2478,12 +2514,12 @@ block.unit-cargo-loader.description = สร้างโดรนบรรทุ block.unit-cargo-unload-point.description = เป็นจุดสำหรับโดรนบรรทุกที่จะถ่ายไอเท็มลง จะรับไอเท็มที่ตรงกับตัวกรองที่ได้ตั้งไว้เท่านั้น block.beam-node.description = ส่งพลังงานไปยังโหนดลำแสงอื่นในแนวตั้งฉาก กักเก็บพลังงานได้จำนวนเล็กน้อย block.beam-tower.description = ส่งพลังงานไปยังโหนดลำแสงอื่นในแนวตั้งฉาก กักเก็บพลังงานได้จำนวนมาก ระยะไกลกว่าโหนดลำแสง -block.beam-link.description = Transmits power over vast distances.\nOnly capable of connecting to adjacent structures or other beam links. +block.beam-link.description = ส่งพลังงานได้ในระยะทางที่ไกลมากๆ\nแต่สามารถเชื่อมต่อได้แค่สิ่งก่อสร้างที่อยู่ติดกันหรือลิ้งค์ลำแสงอื่นๆ เท่านั้น block.turbine-condenser.description = ผลิตพลังงานออกมาเมื่อวางบนปล่อง ผลิตน้ำจำนวนเล็กน้อยเป็นผลมาจากการควบแน่น -block.chemical-combustion-chamber.description = ผลิตพลังงานจากการเผาไหม้ทางเคมีระหว่างอาร์คย์ไซต์และโอโซน -block.pyrolysis-generator.description = ผลิตพลังงานจำนวนมากจากอาร์คย์ไซต์และแร่หลอม ผลิตน้ำออกมาซึ่งเป็นผลมาจากปฎิบัติการ +block.chemical-combustion-chamber.description = ผลิตพลังงานจากการเผาไหม้ทางเคมีระหว่างอาร์ไคไซต์และโอโซน +block.pyrolysis-generator.description = ผลิตพลังงานจำนวนมากจากอาร์ไคไซต์และแร่หลอม ผลิตน้ำออกมาซึ่งเป็นผลมาจากปฎิบัติการ block.flux-reactor.description = ผลิตพลังงานจำนวนมากออกมาเมื่อได้รับความร้อน จำเป็นต้องใช้ไซยาโนเจนเป็นสารคงความเสถียรของเตาปฏิกรณ์ พลังงานที่ผลิตและจำนวนไซยาโนเจนที่ต้องการ\nจะแปรผันตรงกับความร้อนที่ได้รับมา\nจะระเบิดหากเตาปฏิกรณ์ไม่ได้รับไซยาโนเจนที่เพียงพอ -block.neoplasia-reactor.description = ใช้อาร์คย์ไซต์ น้ำ และใยเฟสเพื่อผลิตพลังงานจำนวนมาก ปล่อยความร้อนและนีโอพลาสม์อันตรายซึ่งเป็นผลมาจากปฎิบัติการ\nจะระเบิดอย่างรุนแรงหากไม่ได้ใช้ท่อน้ำกำจัดนีโอพลาสม์ออก\nจากเตาปฏิกรณ์ให้ทันเวลา +block.neoplasia-reactor.description = ใช้อาร์ไคไซต์ น้ำ และใยเฟสเพื่อผลิตพลังงานจำนวนมาก ปล่อยความร้อนและนีโอพลาสม์อันตรายซึ่งเป็นผลมาจากปฎิบัติการ\nจะระเบิดอย่างรุนแรงหากไม่ได้ใช้ท่อน้ำกำจัดนีโอพลาสม์ออก\nจากเตาปฏิกรณ์ให้ทันเวลา block.build-tower.description = สร้างสิ่งก่อสร้างในระยะที่ถูกทำลายให้ใหม่โดยอัตโนมัติและช่วยเหลือยูนิตอื่นในการก่อสร้าง block.regen-projector.description = ซ่อมแซมสิ่งก่อสร้างพันธมิตรในพื้นที่สี่เหลี่ยมของมันอย่างช้าๆ ต้องใช้ไฮโดรเจน block.reinforced-container.description = เก็บไอเท็มแต่ละชนิดได้นิดหน่อย สามารถใช้ตัวถ่ายไอเท็มในการดึงไอเท็มออกมาได้ จะไม่เพิ่มความจุไอเท็มของแกนกลาง @@ -2507,18 +2543,19 @@ block.large-payload-mass-driver.description = บล็อกขนส่งส block.unit-repair-tower.description = ซ่อมแซมยูนิตทั้งหมดที่อยู่ในรัศมีของมัน ต้องใช้โอโซนเพื่อทำงาน block.radar.description = ค่อยๆ เปิดเผยพื้นที่และยูนิตศัตรูในรัศมีขนาดใหญ่ ต้องใช้พลังงาน block.shockwave-tower.description = สร้างความเสียหายและทำลายกระสุนของศัตรูในรัศมีของมัน ต้องใช้ไซยาโนเจนเพื่อทำงาน -block.canvas.description = แสดงผลรูปวาดที่เรียบง่ายด้วยสีที่มีอยู่จำกัด สามารถปรับแต่งได้ +block.canvas.description = แสดงผลรูปวาดที่เรียบง่ายด้วยเฉดสีที่กำหนดไว้ สามารถปรับแต่งได้ +block.large-canvas.description = แสดงผลรูปวาดที่เรียบง่ายด้วยเฉดสีที่กำหนดไว้ สามารถปรับแต่งได้ unit.dagger.description = ยิงกระสุนธรรมดาใส่เป้าหมายศัตรู unit.mace.description = ยิงเปลวไฟเผาไหม้ใส่เป้าหมายศัตรู unit.fortress.description = ยิงกระสุนปืนใหญ่พิสัยไกลไปที่เป้าหมายศัตรูพื้นดิน unit.scepter.description = ยิงกระสุนชาร์จไฟฟ้าใส่เป้าหมายศัตรู กระสุนจะระเบิดออกเป็นพลังงานสายฟ้า สร้างความเสียหายแก่ยูนิตรอบข้าง unit.reign.description = ยิงกระสุนเจาะทะลุขนาดใหญ่ใส่เป้าหมายศัตรู กระสุนสามารถกระจายตัวไปโจมตีป้อมปืนที่หลบอยู่หลังกำแพงได้ -unit.nova.description = ยิงเลเซอร์ที่สร้างความเสียหายให้กับเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของ\nพันธมิตร สามารถบินได้ -unit.pulsar.description = ยิงสายฟ้าที่สร้างความเสียหายให้เป้าหมายกับศัตรูและซ่อมแซมสิ่งก่อสร้างของ\nพันธมิตร สามารถบินได้ -unit.quasar.description = ยิงลำแสงเลเซอร์เจาะทะลุที่สร้างความเสียหายให้กับเป้าหมายศัตรูและซ่อมแซม\nสิ่งก่อสร้างของพันธมิตร มีโล่พลังงานเพื่อป้องกันร่างกายอันบอบบาง\nสามารถบินได้ -unit.vela.description = ยิงลำแสงเลเซอร์ต่อเนื่องขนาดใหญ่ที่สร้างความเสียหายให้กับเป้าหมายศัตรู ทำให้เกิดไฟไหม้ และซ่อมแซมสิ่งก่อสร้างของพันธมิตร\nสามารถบินได้ -unit.corvus.description = ยิงลำแสงเลเซอร์พลังงานขนาดใหญ่ที่สร้างความเสียหายอย่างหนัก\nให้กับเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร สามารถเหยียบข้ามกำแพงได้ +unit.nova.description = ยิงเลเซอร์ที่ทำลายเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร สามารถบินได้ +unit.pulsar.description = ยิงสายฟ้าที่ทำลายเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร สามารถบินได้ +unit.quasar.description = ยิงลำแสงเลเซอร์เจาะทะลุที่ทำลายเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร สามารถบินได้ ป้องกันตัวเองด้วยโล่พลังงาน +unit.vela.description = ยิงลำแสงเลเซอร์ขนาดใหญ่อย่างต่อเนื่องที่ทำลายเป้าหมายศัตรู ทำให้เกิดไฟไหม้ และซ่อมแซมสิ่งก่อสร้างของพันธมิตร สามารถบินได้ +unit.corvus.description = ยิงลำแสงเลเซอร์พลังงานขนาดยักษ์ที่ทำลายเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร สามารถเหยียบข้ามกำแพงได้ unit.crawler.description = ขยับเข้าหาเป้าหมายศัตรูแล้วระเบิดตัวเอง เกิดเป็นระเบิดขนาดใหญ่ unit.atrax.description = ยิงลูกแก้วหลอมละลายใส่เป้าหมายศัตรูพื้นดิน ทำให้เป้าหมายถูกเผาไหม้ สามารถเหยียบข้ามกำแพงได้ unit.spiroct.description = ยิงเลเซอร์ลดทอนกำลังใส่เป้าหมายศัตรู ซ่อมแซมตัวเองไปในตัว สามารถเหยียบข้ามกำแพงได้ @@ -2530,7 +2567,7 @@ unit.zenith.description = ระดมยิงขีปนาวุธติด unit.antumbra.description = สาดกระสุนระเบิดและยิงขีปนาวุธติดตามตัวใส่เป้าหมายศัตรู unit.eclipse.description = ยิงเลเซอร์เจาะทะลุสองกระบอกและยิงกระสุนระเบิดใส่เป้าหมายศัตรู unit.mono.description = ขุดทองแดงและตะกั่วให้โดยอัตโนมัติ แล้วนำกลับเข้าไปยังแกนกลาง -unit.poly.description = สร้างสิ่งก่อสร้างที่ถูกทำลายให้ใหม่โดยอัตโนมัติและคอยช่วยเหลือ\nยูนิตอื่นๆ ในการก่อสร้าง +unit.poly.description = สร้างสิ่งก่อสร้างที่ถูกทำลายให้ใหม่โดยอัตโนมัติและคอยช่วยเหลือยูนิตอื่นๆ ในการก่อสร้าง unit.mega.description = ซ่อมแซมสิ่งก่อสร้างที่เสียหายให้โดยอัตโนมัติ สามารถบรรทุกบล็อกและยูนิตพื้นดินขนาดเล็กได้ unit.quad.description = ทิ้งระเบิดขนาดใหญ่ลงบนเป้าหมายพื้นดิน ซ่อมแซมสิ่งก่อสร้างของพันธมิตรและสร้างความเสียหายแก่เป้าหมายศัตรู สามารถบรรทุกยูนิตพื้นดินขนาดกลางได้ unit.oct.description = ปกป้องพันธมิตรที่อยู่ใกล้เคียงด้วยโล่พลังงาน สามารถบรรทุกยูนิตภาคพื้นดินได้แทบทุกตัว @@ -2538,41 +2575,41 @@ unit.risso.description = ยิงขีปนาวุธและสาดก unit.minke.description = ยิงทั้งกระสุนหนักและกระสุนธรรมดาไปยังเป้าหมายศัตรูพื้นดิน unit.bryde.description = ยิงกระสุนปืนใหญ่พิสัยไกลและขีปนาวุธติดตามตัวใส่เป้าหมายศัตรู unit.sei.description = ยิงขีปนาวุธติดตามตัวและกระสุนเจาะเกราะใส่เป้าหมายศัตรู -unit.omura.description = ยิงลำแสงปืนรางไฟฟ้าเจาะทะลุระยะไกลใส่เป้าหมายศัตรู สร้างยูนิตแฟลร์ +unit.omura.description = ยิงลำแสงเรลกันเจาะทะลุระยะไกลใส่เป้าหมายศัตรู unit.alpha.description = ปกป้องแกนกลางชาร์ดจากศัตรู สร้างสิ่งต่างๆ unit.beta.description = ปกป้องแกนกลางฟาวน์เดชั่นจากศัตรู สร้างสิ่งต่างๆ unit.gamma.description = ปกป้องแกนกลางนิวเคลียสจากศัตรู สร้างสิ่งต่างๆ -unit.retusa.description = ยิงตอร์ปิโดติดตามตัวใส่ศัตรูที่อยู่ใกล้เคียง และซ่อมแซมยูนิตพันธมิตรที่อยู่ใกล้เคียง -unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียงและซ่อมแซมสิ่งก่อสร้างของพันธมิตร\nทำลายกระสุนที่กำลังเข้ามาด้วยปืนป้องกันจุด\nให้สถานะ[accent]โอเวอร์คล็อก[]แก่พันธมิตรรอบข้าง ทำให้ยิงเร็วและแรงขึ้น -unit.cyerce.description = ยิงขีปนาวุธพลาสม่าติดตามตัวเป็นกระจุกระเบิดใส่ศัตรู\nซ่อมแซมยูนิตพันธมิตรที่อยู่ใกล้เคียงด้วยปืนซ่อมแซม -unit.aegires.description = ช็อตทุกๆ สิ่งก่อสร้างและยูนิตศัตรูที่เข้ามาในสนามพลังงานของมัน\nด้วยสายฟ้าฟาด ซ่อมแซมสิ่งก่อสร้างและยูนิตพันธมิตร -unit.navanax.description = ยิงลูกระเบิดคลื่นชีพจรแม่เหล็กขนาดใหญ่ สร้างความเสียหายอย่างหนักให้กับเครือข่ายพลังงานศัตรู\nและซ่อมแซมสิ่งก่อสร้างของพันธมิตร\nหลอมละลายศัตรูที่อยู่ใกล้เคียงด้วยป้อมปืนเลเซอร์อัตโนมัติสี่ป้อม +unit.retusa.description = ยิงตอร์ปิโดติดตามตัวและเลเซอร์ใส่เป้าหมายศัตรู ซ่อมแซมยูนิตพันธมิตรที่อยู่ใกล้เคียง +unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ที่ทำลายเป้าหมายศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร สกัดกระสุนที่กำลังเข้ามาด้วยปืนสกัดกระสุน ให้สถานะ[accent]โอเวอร์คล็อก[]แก่พันธมิตรรอบข้าง ทำให้ยิงเร็วและแรงขึ้น +unit.cyerce.description = ยิงขีปนาวุธพลาสม่าติดตามตัวเป็นกระจุกระเบิดใส่ศัตรู ซ่อมแซมยูนิตพันธมิตรที่อยู่ใกล้เคียง +unit.aegires.description = ช็อตสิ่งก่อสร้างและยูนิตศัตรูทั้งหมดที่เข้ามาในสนามพลังงานของมันด้วยสายฟ้าฟาด ซ่อมแซมสิ่งก่อสร้างและยูนิตพันธมิตร +unit.navanax.description = ยิงลูกระเบิด EMP ขนาดใหญ่ สร้างความเสียหายอย่างหนักให้กับเครือข่ายพลังงานศัตรูและซ่อมแซมสิ่งก่อสร้างของพันธมิตร หลอมละลายศัตรูที่อยู่ใกล้เคียงด้วยป้อมปืนเลเซอร์อัตโนมัติสี่ป้อม #Erekir unit.stell.description = ยิงกระสุนธรรมดาใส่เป้าหมายศัตรู unit.locus.description = สลับยิงกระสุนเลเซอร์ใส่เป้าหมายศัตรู -unit.precept.description = ยิงกระจุกกระสุนเจาะทะลุใส่เป้าหมายศัตรู -unit.vanquish.description = ยิงกระสุนแตกกระจายเจาะทะลุขนาดใหญ่ใส่เป้าหมายศัตรู ล้อขนาดยักษ์สามารถเหยียบทับสร้างความเสียหายให้กับสิ่งก่อสร้างศัตรูได้ -unit.conquer.description = ระดมสาดกระสุนเจาะทะลุในแนวตรงใส่เป้าหมายศัตรู ล้อขนาดยักษ์สามารถเหยียบทับสร้างความเสียหายให้กับสิ่งก่อสร้างศัตรูได้ +unit.precept.description = ยิงกระจุกกระสุนเจาะทะลุใส่เป้าหมายศัตรู ได้รับผลกระทบจากแรงต้านน้ำน้อยกว่า +unit.vanquish.description = ยิงกระสุนแตกกระจายเจาะทะลุขนาดใหญ่ใส่เป้าหมายศัตรู ล้อขนาดยักษ์สามารถเหยียบทับสร้างความเสียหายให้กับสิ่งก่อสร้างศัตรูได้ ได้รับผลกระทบจากแรงต้านน้ำน้อยกว่า +unit.conquer.description = ระดมสาดกระสุนเจาะทะลุในแนวตรงใส่เป้าหมายศัตรู ล้อขนาดยักษ์สามารถเหยียบทับสร้างความเสียหายให้กับสิ่งก่อสร้างศัตรูได้ ได้รับผลกระทบจากแรงต้านน้ำน้อยกว่า unit.merui.description = ยิงกระสุนปืนใหญ่พิสัยไกลใส่เป้าหมายศัตรูพื้นดิน สามารถเหยียบข้ามกำแพงได้ -unit.cleroi.description = ยิงกระสุนหนักคู่ใส่เป้าหมายศัตรู ทำลายกระสุนของศัตรูด้วยปืนป้องกันจุด สามารถเหยียบข้ามกำแพงได้ +unit.cleroi.description = ยิงกระสุนหนักคู่ใส่เป้าหมายศัตรู ทำลายกระสุนของศัตรูด้วยปืนสกัดกระสุน สามารถเหยียบข้ามกำแพงได้ unit.anthicus.description = ยิงขีปนาวุธติดตามตัวพิสัยไกลใส่เป้าหมายศัตรู สามารถเหยียบข้ามกำแพงได้ unit.tecta.description = ยิงกระสุนพลาสม่าติดตามตัวใส่เป้าหมายศัตรู ป้องกันตัวเองด้วยโล่พลังงานแบบโค้ง สามารถเหยียบข้ามกำแพงได้ unit.collaris.description = ยิงกระสุนปืนใหญ่แตกกระจายพิสัยไกลใส่เป้าหมายศัตรู สามารถเหยียบข้ามกำแพงได้ unit.elude.description = ยิงกระสุนติดตามตัวคู่ใส่เป้าหมายศัตรู สามารถลอยตัวเหนือผิวน้ำได้ unit.avert.description = ยิงกระสุนหมุนวนคู่ใส่เป้าหมายศัตรู unit.obviate.description = ยิงลูกแก้วสายฟ้าหมุนวนใส่เป้าหมายศัตรู -unit.quell.description = ยิงจรวดติดตามตัวใส่เป้าหมายศัตรูพื้นดิน ยับยั้งเครื่องซ่อมแซมสิ่งก่อสร้างของศัตรู +unit.quell.description = ยิงจรวดติดตามตัวเคลือบโล่พลาสม่าใส่เป้าหมายศัตรูพื้นดิน ยับยั้งเครื่องซ่อมแซมสิ่งก่อสร้างของศัตรู unit.disrupt.description = ยิงจรวดยับยั้งติดตามตัวใส่เป้าหมายศัตรูพื้นดิน ยับยั้งเครื่องซ่อมแซมสิ่งก่อสร้างของศัตรู -unit.evoke.description = สร้างสิ่งต่างๆ เพื่อปกป้องแกนกลางบาสเชี่ยนจากศัตรู\nซ่อมแซมสิ่งก่อสร้างด้วยลำแสงฟื้นฟู -unit.incite.description = สร้างสิ่งต่างๆ เพื่อปกป้องแกนกลางซิทาเดลจากศัตรู\nซ่อมแซมสิ่งก่อสร้างด้วยลำแสงฟื้นฟู -unit.emanate.description = สร้างสิ่งต่างๆ เพื่อปกป้องแกนกลางอะโครโพลิสจากศัตรู\nซ่อมแซมสิ่งก่อสร้างด้วยลำแสงฟื้นฟู +unit.evoke.description = สร้างสิ่งต่างๆ เพื่อปกป้องแกนกลางบาสเชี่ยนจากศัตรู ซ่อมแซมสิ่งก่อสร้างด้วยลำแสงฟื้นฟู สามารถบรรทุกสิ่งก่อสร้างขนาด 2x2 ได้ +unit.incite.description = สร้างสิ่งต่างๆ เพื่อปกป้องแกนกลางซิทาเดลจากศัตรู ซ่อมแซมสิ่งก่อสร้างด้วยลำแสงฟื้นฟู สามารถบรรทุกสิ่งก่อสร้างขนาด 2x2 ได้ +unit.emanate.description = สร้างสิ่งต่างๆ เพื่อปกป้องแกนกลางอะโครโพลิสจากศัตรู ซ่อมแซมสิ่งก่อสร้างด้วยลำแสงฟื้นฟู สามารถบรรทุกสิ่งก่อสร้างขนาด 2x2 ได้ -lst.read = อ่านเลขจากเซลล์ความจำที่เชื่อมต่อไว้ -lst.write = เขียนเลขไปยังเซลล์ความจำที่เชื่อมต่อไว้ +lst.read = อ่านเลขจากเซลล์ความจำที่เชื่อมต่อไว้ สามารถอ่านค่าตัวแปรของตัวประมวลผลอื่นได้ +lst.write = เขียนเลขไปยังเซลล์ความจำที่เชื่อมต่อไว้ สามารถเขียนค่าตัวแปรของตัวประมวลผลอื่นได้ lst.print = เพิ่มข้อความไปยังคิวข้อความ\nข้อความจะยังไม่แสดงจนกว่าจะใช้คำสั่ง [accent]Print Flush[] -lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. -lst.format = แทนที่ข้อความตัวแทนถัดไปในบัฟเฟอร์ข้อความด้วยค่า\nจะไม่ทำอะไรหากรูปแบบข้อความแทนที่นั้นไม่ถูกต้อง\nรูปแบบข้อความแทนที่: "{[accent]ตัวเลข 0-9[]}"\nตัวอย่าง:\n[accent]print "ทดสอบ {0}"\nformat "สวัสดี" +lst.printchar = เพิ่มอักขระ UTF-16 หรือไอคอนเนื้อหาไปยังคิวข้อความ\nข้อความจะยังไม่แสดงจนกว่าจะใช้คำสั่ง [accent]Print Flush[] +lst.format = แทนที่ข้อความตัวแทนถัดไปในคิวข้อความด้วยค่า\nจะไม่ทำอะไรหากรูปแบบข้อความแทนที่นั้นไม่ถูกต้อง\nรูปแบบข้อความแทนที่: "{[accent]ตัวเลข 0-9[]}"\nตัวอย่าง:\n[accent]print "ทดสอบ {0}"\nformat "สวัสดี" lst.draw = เพิ่มรูปไปยังคิวการวาด\nภาพจะยังไม่แสดงจนกว่าจะใช้คำสั่ง [accent]Draw Flush[] lst.drawflush = ปล่อยคิว [accent]Draw[] ไปยังหน้าจอลอจิกที่เชื่อมต่อไว้ lst.printflush = ปล่อยคิว [accent]Print[] ไปยังตัวเก็บข้อความที่เชื่อมต่อไว้ @@ -2602,7 +2639,7 @@ lst.explosion = สร้างระเบิดที่ตำแหน่ง lst.setrate = ตั้งค่าความเร็วการสั่งเป็นคำสั่งใน คำสั่ง/ติก lst.fetch = ค้นหายูนิต แกนกลาง ผู้เล่น หรือสิ่งก่อสร้างตามดัชนี\nดัชนีเริ่มที่ 0 และจบที่ค่าที่จะส่งกลับ lst.packcolor = แพ็ค [0, 1] ส่วนประกอบ RGBA มาเป็นเลขบรรทัดเดียวสำหรับการวาดหรือการตั้งค่ากฎ -lst.unpackcolor = Unpack RGBA components from a color that was packed using Pack Color. +lst.unpackcolor = ถอดแพ็คส่วนประกอบ RGBA จากสีที่ถูกแพ็คด้วยคำสั่ง Pack Color lst.setrule = ตั้งค่ากฎของเกม lst.flushmessage = แสดงข้อความบนหน้าจอจากบัฟเฟอร์ข้อความ\nถ้าตัวแปรผลลัพธ์ออกมาเป็น [accent]@wait[]\nจะรอจนกว่าข้อความก่อนหน้าจะเสร็จสิ้น\nนอกจากนั้น จะส่งออกว่าการแสดงผลข้อความสำเร็จหรือไม่ lst.cutscene = ควบคุมมุมกล้องของผู้เล่น @@ -2614,7 +2651,7 @@ lst.sync = ซิงค์หนึ่งตัวแปรทั่วทั้ lst.playsound = เล่นเสียง\nระดับเสียงและการแพนสามารถใช้เป็นค่าสากลได้ หรือคำนวณเอาจากตำแหน่งก็ได้ lst.makemarker = สร้างเครื่องหมายลอจิกใหม่ขึ้นมาในแมพ\nจะต้องเพิ่ม ID เข้าไปเพื่อบ่งชี้เครื่องหมายนี้\nเครื่องหมายจำกัดได้แค่ 20,000 ต่อแมพในตอนนี้ lst.setmarker = ตั้งค่าคุณสมบัติให้กับเครื่องหมาย\nID ของเครื่องหมายที่ใช้จะต้องเป็น ID เดียวกันกับในคำสั่ง Make Marker\nค่า[accent]ว่างเปล่า[]จะถูกข้าม -lst.localeprint = เพิ่มค่าชุดภาษาท้องถิ่นของแมพลงไปในบัฟเฟอร์ข้อความเพื่อตั้งค่าชุดภาษาของแมพในตัวแก้ไข ให้เปิด [accent]ข้อมูลแมพ > ชุดภาษาท้องถิ่น[].\nถ้าหากผู้เล่นอยู่ในมือถือ ให้ลองปริ้นค่าโดยลงท้ายด้วย ".mobile" ก่อน +lst.localeprint = เพิ่มค่าชุดภาษาท้องถิ่นของแมพลงไปยังคิวข้อความเพื่อตั้งค่าชุดภาษาของแมพในตัวแก้ไข ให้เปิด [accent]ข้อมูลแมพ > ชุดภาษาท้องถิ่น[].\nถ้าหากผู้เล่นอยู่ในมือถือ ให้ลองปริ้นค่าโดยลงท้ายด้วย ".mobile" ก่อน lglobal.false = 0 lglobal.true = 1 @@ -2666,20 +2703,20 @@ lenum.config = การกำหนดค่าของสิ่งก่อ lenum.enabled = ว่าบล็อกเปิดใช้งาน/ทำงานอยู่หรือเปล่า laccess.currentammotype = ประเภทของกระสุนไอเท็ม/ของเหลวในปัจจุบันของป้อมปืน -laccess.memorycapacity = Number of cells in a memory block. +laccess.memorycapacity = จำนวนหน่วยความจำในบล็อกความจำ laccess.color = สีของตัวเปล่งแสง laccess.controller = ผู้ควบคุมยูนิต ถ้าผู้ควบคุมคือตัวประมวลผล จะส่งกลับค่า processor\nนอกนั้น จะส่งกลับค่าตัวยูนิตเอง laccess.dead = ว่าสิ่งก่อสร้าง/ยูนิตนั้นตายแล้วหรือใช้งานไม่ได้แล้ว laccess.controlled = จะส่งกลับ:\n[accent]@ctrlProcessor[] ถ้าผู้ควบคุมคือตัวประมวลผลลอจิก\n[accent]@ctrlPlayer[] ถ้าสิ่งก่อสร้าง/ยูนิตถูกควบคุมโดยผู้เล่น\n[accent]@ctrlCommand[] ถ้ายูนิตถูกสั่งการโดยผู้เล่นอยู่\nนอกนั้นจะเป็น 0 laccess.progress = ความคืบหน้าการดำเนินการจาก 0 ถึง 1\nจะส่งกลับค่าการผลิต การรีโหลดของป้อมปืน หรือความคืบหน้าในการสร้างสิ่งก่อสร้าง laccess.speed = ความเร็วสูงสุดของยูนิตในหน่วย ช่อง/วินาที -laccess.size = Size of a unit/building or the length of a string. +laccess.size = ขนาดของยูนิต/สิ่งก่อสร้าง หรือความยาวของค่าสตริง laccess.id = ID ของยูนิต/บล็อก/ไอเท็ม/ของเหลว\nคำสั่งนี้จะตรงกันข้ามกับคำสั่ง lookup -laccess.displaywidth = Width of a display block in pixels. -laccess.displayheight = Height of a display block in pixels. -laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display. -laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. -laccess.maxunits = Maximum units that a team can have.\nCan only be sensed from cores. +laccess.displaywidth = ความกว้างของบล็อกแสดงผล เป็นพิกเซล +laccess.displayheight = ความสูงของบล็อกแสดงผล เป็นพิกเซล +laccess.buffersize = จำนวนคำสั่งที่ยังไม่ได้ประมวลผลในคิวการวาดของหน้าจอแสดงผล +laccess.operations = จำนวนคำสั่งที่ปฏิบัติการกับบล็อกนี้\nสำหรับจอแสดงผล จะคืนค่าจำนวนปฎิบัติการ drawflush +laccess.maxunits = จำนวนยูนิตสูงสุดที่ทีมจะสามารถมีได้\nตรวจสอบได้จากบล็อกแกนกลางเท่านั้น lcategory.unknown = ไม่ทราบ lcategory.unknown.description = คำสั่งที่ไม่อยู่ในหมวดหมู่ใดๆเลย @@ -2707,27 +2744,27 @@ graphicstype.poly = เติมรูปหลายเหลี่ยมปก graphicstype.linepoly = วาดโครงร่างรูปหลายเหลี่ยมปกติ graphicstype.triangle = เติมสามเหลี่ยม graphicstype.image = วาดรูปสิ่งต่างๆ \nตัวอย่างเช่น: [accent]@router[] หรือ [accent]@dagger[] -graphicstype.print = วาดข้อความจากบัฟเฟอร์ข้อความ\nใช้ตัวอักษร ASCII ได้เท่านั้น\nจะเคลียร์บัฟเฟอร์ข้อความ +graphicstype.print = วาดข้อความจากคิวข้อความ\nใช้ตัวอักษร ASCII ได้เท่านั้น\nจะเคลียร์คิวข้อความ lenum.always = เป็นจริงเสมอ lenum.idiv = หารจำนวนเต็ม lenum.div = หาร\nจะส่งกลับ[accent]ค่าว่าง[] หากหารศูนย์ lenum.mod = โมดูโล่ (หารหาเศษ) -lenum.emod = True modulo, result sign comes from the divisor. +lenum.emod = ทรูโมดูโล่ เครื่องหมายของผลลัพธ์จะมาจากตัวหาร lenum.equal = เท่ากับ แบบบังคับประเภท\nสิ่งที่ไม่ใช่ค่าว่างเมื่อเทียบกับตัวเลขจะส่งกลับค่า 1 นอกนั้นจะส่งกลับค่า 0 lenum.notequal = ไม่เท่ากับ บังคับประเภท lenum.strictequal = เท่ากับที่เข้มงวด ไม่บังคับประเภท\nสามารถใช้ตรวจสอบหา[accent]ค่าว่าง[]ได้ lenum.shl = เลื่อนบิตไปทางซ้าย lenum.shr = เลื่อนบิตไปทางขวา -lenum.ushr = Unsigned bit-shift right. +lenum.ushr = เลื่อนบิตไปทางขวา แบบไม่ติดเครื่องหมาย lenum.or = หรือ แบบบิต lenum.land = และ เชิงตรรกะ lenum.and = และ แบบบิต lenum.not = กลับด้าน แบบบิต lenum.xor = แยกเฉพาะ แบบบิต -lenum.min = เทียบต่ำสุดของสองหมายเลข -lenum.max = เทียบสูงสุดของสองหมายเลข +lenum.min = เทียบต่ำสุดระหว่างสองหมายเลข +lenum.max = เทียบสูงสุดระหว่างสองหมายเลข lenum.angle = มุมของเวกเตอร์ หน่วยเป็นองศา lenum.anglediff = ระยะทางสัมบูรณ์ระหว่างมุมสองมุม หน่วยเป็นองศา lenum.len = ความยาวของเวกเตอร์ @@ -2829,29 +2866,29 @@ lenum.posi = ตำแหน่งในดัชนี ใช้สำหรั lenum.uvi = ตำแหน่งของเทกเจอร์ในคาบระหว่างศูนย์ถึงหนึ่ง ใช้สำหรับเครื่องหมายสี่เหลี่ยม lenum.colori = ค่าสีในดัชนี ใช้สำหรับเครื่องหมายเส้นตรงและสี่เหลี่ยมที่มีดัชนีศูนย์เป็นสีเริ่มต้น -lenum.wavetimer = Whether the waves come automatically on a timer. If not, waves come when the play button is pressed. -lenum.wave = Current wave number. Can be anything in non-wave modes. -lenum.currentwavetime = Wave countdown in ticks. -lenum.waves = Whether waves are spawnable at all. -lenum.wavesending = Whether the waves can be manually summoned with the play button. -lenum.attackmode = Determines if gamemode is attack mode. -lenum.wavespacing = Time between waves in ticks. -lenum.enemycorebuildradius = No-build zone around enemy core radius. -lenum.dropzoneradius = Radius around enemy wave drop zones. -lenum.unitcap = Base unit cap. Can still be increased by blocks. -lenum.lighting = Whether ambient lighting is enabled. -lenum.buildspeed = Multiplier for building speed. -lenum.unithealth = How much health units start with. -lenum.unitbuildspeed = How fast unit factories build units. -lenum.unitcost = Multiplier of resources that units take to build. -lenum.unitdamage = How much damage units deal. -lenum.blockhealth = How much health blocks start with. -lenum.blockdamage = How much damage blocks (turrets) deal. -lenum.rtsminweight = Minimum "advantage" needed for a squad to attack. Higher -> more cautious. -lenum.rtsminsquad = Minimum size of attack squads. -lenum.maparea = Playable map area. Anything outside the area will not be interactable. -lenum.ambientlight = Ambient light color. Used when lighting is enabled. -lenum.solarmultiplier = Multiplies power output of solar panels. -lenum.dragmultiplier = Environment drag multiplier. -lenum.ban = Blocks or units that cannot be placed or built. -lenum.unban = Unban a unit or block. +lenum.wavetimer = ว่าจะให้คลื่นดำเนินอัตโนมัติภายใต้การนับเวลาถอยหลังหรือไม่ ถ้าไม่ คลื่นจะดำเนินเมื่อผู้เล่นกดปุ่ม +lenum.wave = หมายเลขคลื่นที่ปัจจุบัน อาจเป็นเลขอะไรก็ได้ในโหมดที่ไม่มีคลื่น +lenum.currentwavetime = เวลานับถอยคลื่นคลื่น เป็นติก +lenum.waves = ว่าจะเปิดใช้งานคลื่นหรือไม่ +lenum.wavesending = ว่าจะให้ผู้เล่นสามารถดำเนินคลื่นเองด้วยการกดปุ่มหรือไม่ +lenum.attackmode = ว่าเกมนี้จะอยู่ในโหมดการโจมตีหรือไม่ +lenum.wavespacing = เวลาระหว่างคลื่น เป็นติก +lenum.enemycorebuildradius = รัศมีห้ามสร้างบริเวณรอบแกนกลางของศัตรู +lenum.dropzoneradius = รัศมีรอบๆ จุดปล่อยคลื่นของศัตรู +lenum.unitcap = ขีดจำกัดยูนิตสูงสุดพื้นฐาน โดยขีดจำกัดยังคงสามารถเพิ่มจากบล็อกได้ +lenum.lighting = ว่าจะเปิดใช้งานไฟส่องสว่างโดยรอบหรือไม่ +lenum.buildspeed = พหุคุณความเร็วการสร้างสิ่งก่อสร้าง +lenum.unithealth = พลังชีวิตที่ยูนิตเริ่มต้นมา +lenum.unitbuildspeed = ความเร็วการผลิตของโรงงานยูนิต +lenum.unitcost = พหุคูณค่าใช้จ่ายทรัพยากรที่ใช้ในการสร้างยูนิต +lenum.unitdamage = พลังโจมตีของยูนิต +lenum.blockhealth = พลังชีวิตที่บล็อกเริ่มต้นมา +lenum.blockdamage = พลังโจมตีของบล็อก (ป้อมปืน) +lenum.rtsminweight = ระดับ "ความได้เปรียบ" ขั้นต่ำที่จำเป็นสำหรับหน่วยจู่โจมในการโจมตี ยิ่งสูง -> ยิ่งระมัดระวังมากขึ้น +lenum.rtsminsquad = ขนาดขั้นต่ำของหน่วยจู่โจม +lenum.maparea = ขนาดมิติของแมพที่เล่นได้ สิ่งใดก็ตามที่อยู่นอกขอบแมพจะไม่สามารถปฏิสัมพันธ์ด้วยได้ +lenum.ambientlight = สีของแสงโดยรอบ จะใช้เมื่อเปิดใช้งานแสงโดยรอบ +lenum.solarmultiplier = พหุคุณความแรงการผลิตพลังงานของแผงโซล่าร์ +lenum.dragmultiplier = พหุคุณแรงเฉื่อยจากสิ่งแวดล้อม +lenum.ban = บล็อกหรือยูนิตที่ห้ามไม่ให้สร้างหรือผลิต +lenum.unban = ปลดแบนบล็อกหรือยูนิต diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 5653e5fce0..170ca0faa4 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -15,6 +15,7 @@ link.wiki.description = Orjinal Mindustry Bilgilendirme Sayfasi link.suggestions.description = Suggest new features link.bug.description = Found one? Report it here linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Link Acilamadi!\nLink sizin icin kopyalandi. screenshot = Screenshot saved to {0} screenshot.invalid = Map too large, potentially not enough memory for screenshot. @@ -124,6 +125,8 @@ maps.none = [lightgray]Harita bulunamadi! invalid = Invalid pickcolor = Pick Color color = Color +import = Import +export = Export preparingconfig = Preparing Config preparingcontent = Preparing Content uploadingcontent = Uploading Content @@ -212,6 +215,8 @@ campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience. campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Completed techtree = Tech Tree techtree.select = Tech Tree Selection @@ -359,6 +364,7 @@ confirm = Onayla delete = Sil view.workshop = View In Workshop workshop.listing = Edit Workshop Listing +hide = Hide ok = Tamam open = Ac customize = Customize @@ -370,7 +376,6 @@ command.repair = Repair command.rebuild = Rebuild command.assist = Assist Player command.move = Move -command.boost = Boost command.enterPayload = Enter Payload Block command.loadUnits = Load Units command.loadBlocks = Load Blocks @@ -381,7 +386,9 @@ stance.shoot = Stance: Shoot stance.holdfire = Stance: Hold Fire stance.pursuetarget = Stance: Pursue Target stance.patrol = Stance: Patrol Path +stance.holdposition = Stance: Hold Position stance.ram = Stance: Ram\n[lightgray]Straight line movement, no pathfinding +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Linki ac @@ -428,6 +435,7 @@ saveimage = Resimi kaydet unknown = Bilinmeyen custom = Ozel builtin = Yapilandirilmis +modded = Modded map.delete.confirm = Haritayi silmek istedigine emin misin? Bu geri alinamaz! map.random = [accent]Rasgele harita map.nospawn = Haritada Oyncularin cikmasi icin cekirdek yok! Haritaya {0} cekirdek ekle. @@ -488,10 +496,14 @@ editor.center = Center editor.search = Search maps... editor.filters = Filter Maps editor.filters.mode = Gamemodes: +editor.filters.priorities = Priorities: editor.filters.type = Map Type: editor.filters.search = Search In: editor.filters.author = Author editor.filters.description = Description +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Shift X editor.shifty = Shift Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Search waves... waves.filter = Unit Filter waves.units.hide = Hide All waves.units.show = Show All +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = counts @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Destroy: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Enemies approaching in [lightgray]{0}[] objective.enemyescelating = [accent]Enemy production escalating in [lightgray]{0}[] objective.enemyairunits = [accent]Enemy air unit production beginning in [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Destroy Enemy Core objective.command = [accent]Command Units objective.nuclearlaunch = [accent]⚠ Nuclear launch detected: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Unable to Switch Sectors sector.noswitch = You may not switch sectors while an existing sector is under attack.\n\nSector: [accent]{0}[] on [accent]{1}[] sector.view = View Sector sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Low threat.medium = Medium @@ -843,6 +858,10 @@ threat.high = High threat.extreme = Extreme threat.eradication = Eradication +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Sun sector.impact0078.name = Impact 0078 sector.groundZero.name = Ground Zero -sector.craters.name = The Craters +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Frozen Forest sector.ruinousShores.name = Ruinous Shores sector.stainedMountains.name = Stained Mountains @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -sector.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. sector.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. sector.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build Titan units. Destroy it. Reclaim that which was lost. @@ -1045,6 +1065,7 @@ stat.boosteffect = Boost Effect stat.maxunits = Max Active Units stat.health = Can stat.armor = Armor +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Build Time stat.maxconsecutive = Max Consecutive stat.buildcost = Build Cost @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] area dmg ~[stat] {1}[lightgray] tiles bullet.incendiary = [stat]incendiary bullet.homing = [stat]homing bullet.armorpierce = [stat]armor piercing -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] damage limit bullet.suppression = [stat]{0} sec[lightgray] repair suppression ~ [stat]{1}[lightgray] tiles @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Disable Mods On Startup Crash setting.animatedwater.name = Animated Water setting.animatedshields.name = Animated Shields setting.playerindicators.name = Player Indicators +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Ally Indicators setting.autotarget.name = Auto-Target setting.keyboard.name = Mouse+Keyboard Controls @@ -1269,6 +1292,8 @@ setting.fpscap.none = Yok setting.fpscap.text = {0} FPS setting.uiscale.name = UI Scaling[lightgray] (requires restart)[] setting.uiscale.description = Restart required to apply changes. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Always Diagonal Placement setting.screenshake.name = Ekran sallanmasi setting.bloomintensity.name = Bloom Intensity @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Otomatik kaydetme suresi setting.seconds = {0} Saniye setting.milliseconds = {0} milliseconds setting.fullscreen.name = Tam ekran -setting.borderlesswindow.name = Borderless Window[lightgray] (may require restart) -setting.borderlesswindow.name.windows = Borderless Fullscreen -setting.borderlesswindow.description = Restart may be required to apply changes. setting.fps.name = FPS'i goster setting.console.name = Enable Console setting.smoothcamera.name = Smooth Camera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Sesi kapat setting.sfxvol.name = Ses seviyesi setting.mutesound.name = Sesi kapat -setting.crashreport.name = Send Anonymous Crash Reports setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Auto-Create Saves setting.steampublichost.name = Public Game Visibility @@ -1334,6 +1355,8 @@ category.command.name = Unit Command category.multiplayer.name = Cok oyunculu category.blocks.name = Block Select placement.blockselectkeys = \n[lightgray]Key: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Respawn keybind.control.name = Control Unit keybind.clear_building.name = Clear Building @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Unit Stance: Hold Fire keybind.unit_stance_pursue_target.name = Unit Stance: Pursue Target keybind.unit_stance_patrol.name = Unit Stance: Patrol keybind.unit_stance_ram.name = Unit Stance: Ram +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Infinite AI Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unitcostmultiplier = Unit Cost Multiplier rules.unithealthmultiplier = Unit Health Multiplier @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Reinforced Payload Router block.payload-mass-driver.name = Payload Mass Driver block.small-deconstructor.name = Small Deconstructor block.canvas.name = Canvas +block.large-canvas.name = Large Canvas block.world-processor.name = World Processor block.world-cell.name = World Cell block.tank-fabricator.name = Tank Fabricator @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick hint.payloadDrop = Press [accent]][] to drop a payload. hint.payloadDrop.mobile = [accent]Tap and hold[] an empty location to drop a payload there. hint.waveFire = [accent]Wave[] turrets with water as ammunition will automatically put out nearby fires. -hint.generator = :combustion-generator: [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with :power-node: [accent]Power Nodes[]. 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 :graphite: [accent]Graphite[] :duo:Duo/:salvo:Salvo ammunition to take Guardians down. hint.coreUpgrade = Cores can be upgraded by [accent]placing higher-tier cores over them[].\n\nPlace a :core-foundation: [accent]Foundation[] core over the :core-shard: [accent]Shard[] core. Make sure it is free from nearby obstructions. hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Anything built in the radius is destroyed when a wave starts. gz.zone3 = A wave will begin now.\nGet ready. gz.finish = Build more turrets, mine more resources,\nand defend against all the waves to [accent]capture the sector[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Repairs all units in its vicinity. Require block.radar.description = Gradually uncovers terrain and enemy units in a large radius. Requires power. block.shockwave-tower.description = Damages and destroys enemy projectiles in a radius. Requires cyanogen. block.canvas.description = Displays a simple image with a pre-defined palette. Editable. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Fires standard bullets at all nearby enemies. unit.mace.description = Fires streams of flame at all nearby enemies. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 3b9a0d122a..2bfb7594d5 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -15,6 +15,7 @@ link.wiki.description = Resmi Mindustry vikisi link.suggestions.description = Yeni özellikler öner link.bug.description = Hata mı buldun? Hemen şikayet et! linkopen = Bu server sana bir link gönderdi. Açmak istediğine emin misin?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Link açılamadı!\nURL kopyalandı. screenshot = Ekran görüntüsü {0} konumuna kaydedildi screenshot.invalid = Harita çok büyük, muhtemelen ekran görüntüsü için yeterli bellek yok. @@ -124,6 +125,8 @@ maps.none = [lightgray]Harita Bulunamadı! invalid = Geçersiz pickcolor = Renk Seç color = Color +import = Import +export = Export preparingconfig = Yapılandırma Hazırlanıyor preparingcontent = İçerik Hazırlanıyor uploadingcontent = İçerik Yükleniyor @@ -212,6 +215,8 @@ campaign.none = [lightgray]Başlamak için bir gezegen seç.\nBu seçim herhangi campaign.erekir = Daha yeni ve cilalanmış içerikler. Genellikle kararlı ilerleme.\n\nDaha kaliteli haritalar ve deneyim (herhalde). campaign.serpulo = Eski içerik; klasik deneyim. Daha serbest.\n\nDaha dengesiz harita ve deneyim. Cilayı unutmuşlar işte... campaign.difficulty = Zorluk +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Tamamlandı techtree = Teknoloji Ağacı techtree.select = Teknoloji Ağacı Seç @@ -359,6 +364,7 @@ confirm = Doğrula delete = Sil view.workshop = Atölyede görüntüle workshop.listing = Atölye Listelemesini Aç +hide = Hide ok = Tamam open = Aç customize = Kuralları Özelleştir @@ -370,7 +376,6 @@ command.repair = Tamir Et command.rebuild = Yeniden İnşaa Et command.assist = Oyuncuya Yardım Et command.move = Hareket Et -command.boost = Gazla command.enterPayload = Kargo Bloğu Seç command.loadUnits = Birim Yükle command.loadBlocks = Blok Yükle @@ -381,7 +386,9 @@ stance.shoot = Duruş: Saldırı stance.holdfire = Duruş: Hazır Ol stance.pursuetarget = Duruş: Hedefi Takip Et stance.patrol = Duruş: Devriye Gez +stance.holdposition = Stance: Hold Position stance.ram = Duruş: Düz\n[lightgray]Düz bir ol halinde ilerle. +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Bağlantıyı Aç @@ -428,6 +435,7 @@ saveimage = Resim Kaydet unknown = Bilinmeyen custom = Özel builtin = Yerleşik +modded = Modded map.delete.confirm = Bu haritayı silmek istediğinizden emin misiniz? Bunu geri alamazsınız! map.random = [accent]Rastgele Harita map.nospawn = Bu haritada oyuncunun doğacağı hiç bir Merkez yok! Düzenleyiciden bu haritaya {0} bir Merkez ekleyin. @@ -488,10 +496,14 @@ editor.center = Ortala editor.search = Harita Ara... editor.filters = Harita Filtrele editor.filters.mode = Oyun Modları: +editor.filters.priorities = Priorities: editor.filters.type = Harita Türleri: editor.filters.search = Ara: editor.filters.author = Yapımcı editor.filters.description = Açıklama +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = X Ekseninde Kaydır editor.shifty = Y Ekseninde Kaydır workshop = Atölye @@ -527,6 +539,7 @@ waves.search = Dalga ara... waves.filter = Birim Filtresi waves.units.hide = Hepsini Gizle waves.units.show = Hepsini Göster +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = miktarlar @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Yok Et: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Düşman saldırısına: [lightgray]{0}[] objective.enemyescelating = [accent]Düşman üretimi [lightgray]{0}[] içinde hızlanacak. objective.enemyairunits = [accent]Düşman hava birimi üretimi [lightgray]{0}[] içinde başlayacak. +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Düşman Merkezini Yok Et objective.command = [accent]Birimleri Kumanda Et objective.nuclearlaunch = [accent]⚠ Nükleer Saldırı tespit edildi: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Sektör Değiştirilemiyor sector.noswitch = Bir Sektör saldırı altındayken başka bir sektöre geçemezsin.\n\nSektör: [accent]{1}[] deki [accent]{0}[] sector.view = Sektörü Göster sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = Düşük threat.medium = Orta @@ -843,6 +858,10 @@ threat.high = Yüksek threat.extreme = Aşırı threat.eradication = İmkansız +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Sakin difficulty.easy = Kolay difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Güneş sector.impact0078.name = Darbe 0078 sector.groundZero.name = Sıfır Noktası -sector.craters.name = Kraterler +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Donmuş Orman sector.ruinousShores.name = Harap Kıyılar sector.stainedMountains.name = Lekeli Dağlar @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mantar Kale sector.frontier.name = Öncü Üs sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Crux Düzlüğü sector.geothermalStronghold.name = Jeotermal Sığınağı sector.groundZero.description = Yeniden başlamak için ideal bölge. Düşük düşman tehlikesi ve az miktarda kaynak mevcut. Mümkün olduğunca çok bakır ve kurşun topla.\nİlerle. sector.frozenForest.description = Burada, dağlara yakın bölgelerde bile sporlar etrafa yayıldı. Dondurucu soğuk onları sonsuza dek durduramaz.\n\nEnerji kullanmaya başla. Termik jeneratörler inşa et. Tamircileri kullanmayı öğren. sector.saltFlats.description = Çölün kenar kısımlarında tuz düzlükleri uzanır. Bu konumda az miktarda kaynak bulunur.\n\nDüşman burada kompleks bir kaynak depolama sistemi inşa etti. Merkezlerini yok et. Ayakta hiçbir şey bırakma. -sector.craters.description = Eski savaşların bir anıtı olan bu kratere su dolmuş. Alanı yeniden ele geçir. Kum topla ve metacam üret. Taret ve matkapları soğutmak için su pompala. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Yıkıntıların ardında bir kıyı var. Bir zamanlar bu konum bir dizi kıyı defansına ev sahipliği yapmış. Geriye pek bir şey kalmamış. Sadece en temel savunma yapıları zarar görmeden kaldı, onun dışındaki her şey hurdaya geri dönüştü.\nDışa doğru genişletmeye devam et. Teknolojiyi yeniden keşfet. sector.stainedMountains.description = Daha uzaklarda dağlar uzanıyor, daha sporlar tarafından istilaya uğramamışlar.\nAlandaki serbest titanyumu çıkart ve kullanmasını öğren.\n\nDüşman varlığı burada daha fazla. Onların daha güçlü birimlerini göndermelerine izin verme. sector.overgrowth.description = Bu alan aşırı büyümüştür, sporların kaynağına daha yakındır.\nDüşman burada bir merkez kurdu. Titan birlikleri inşa et. Onu yok et. Kaybedileni geri al. @@ -1045,6 +1065,7 @@ stat.boosteffect = Hızlandırma Efekti stat.maxunits = Maksimum Aktif Birim stat.health = Can stat.armor = Zırh +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = İnşaat Süresi stat.maxconsecutive = Art Arda En Fazla stat.buildcost = İnşaat Fiyatı @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0} [lightgray]alan hasarı ~[stat] {1} [lightgray]k bullet.incendiary = [stat]yakıcı bullet.homing = [stat]güdümlü bullet.armorpierce = [stat]zırh delici -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] hasar limiti bullet.suppression = [stat]{0} sn[lightgray] tamir bastırması ~ [stat]{1}[lightgray] karolar @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Çökmede Modları Kapa setting.animatedwater.name = Hareketli Su setting.animatedshields.name = Hareketli Kalkanlar setting.playerindicators.name = Oyuncu Belirteçleri +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Düşman/Müttefik Belirteçleri setting.autotarget.name = Otomatik Hedef Alma setting.keyboard.name = Fare+Klavye Kontrolleri @@ -1269,6 +1292,8 @@ setting.fpscap.none = Limitsiz ∞ setting.fpscap.text = {0} FPS setting.uiscale.name = Arayüz Ölçeği [lightgray](yeniden başlatma gerekebilir)[] setting.uiscale.description = Değişikleri uygulamak için yeniden başlatma gerekli. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Her Zaman Çapraz Yerleştirme setting.screenshake.name = Ekran Sarsılması setting.bloomintensity.name = Parlaklık Şiddeti @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Kayıt Aralığı setting.seconds = {0} saniye setting.milliseconds = {0} milisaniye setting.fullscreen.name = Tam Ekran -setting.borderlesswindow.name = Kenarsız Pencere -setting.borderlesswindow.name.windows = Kenrasız TamEkran -setting.borderlesswindow.description = Oyunu baştan açman gerekebilir. setting.fps.name = FPS Göster setting.console.name = Konsolu Aktifleştir setting.smoothcamera.name = Yumuşak Geçişli Kamera @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Çevresel Ses setting.mutemusic.name = Müziği Kapat setting.sfxvol.name = Oyun Sesi setting.mutesound.name = Sesi Kapat -setting.crashreport.name = Anonim Çökme Raporları Gönder setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Otomatik Kayıt Oluştur setting.steampublichost.name = Herkese Açık Oyun Görünürlüğü @@ -1334,6 +1355,8 @@ category.command.name = Birim Komutu category.multiplayer.name = Çok Oyunculu category.blocks.name = Blok Seçimi placement.blockselectkeys = \n[lightgray]Tuş: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Yeniden Doğ keybind.control.name = Birliği Kontrol Et keybind.clear_building.name = Binayı Temizle @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Birim Duruşu: Hazır Ol keybind.unit_stance_pursue_target.name = Birim Duruşu: Takip Et keybind.unit_stance_patrol.name = Birim Duruşu: Devriye Gez keybind.unit_stance_ram.name = Birim Duruşu: VUR +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Birim Komutu: Git keybind.unit_command_repair.name = Birim Komutu: Tamir Et keybind.unit_command_rebuild.name = Birim Komutu: Yeniden İnşaa Et keybind.unit_command_assist.name = Biirm Komutu: Yardım Et keybind.unit_command_mine.name = Birim Komutu: Kaz -keybind.unit_command_boost.name = Birim Komutu: Gazla keybind.unit_command_load_units.name = Birim Komutu: Birim Kargola keybind.unit_command_load_blocks.name = Birim Komutu: Blok Kargola keybind.unit_command_unload_payload.name = Birim Komutu: Kargo Boşalt @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Sınırsız YZ (Düşman Takım) Kaynakları rules.blockhealthmultiplier = Blok Can Çarpanı rules.blockdamagemultiplier = Blok Hasar Çarpanı +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Birim Üretim Hız Çarpanı rules.unitcostmultiplier = Birim Fiyat Çarpanı rules.unithealthmultiplier = Birim Can Çarpanı @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Düşman Doğuş Noktalarını Göster rules.randomwaveai = Tahmin Edilemez Dalgalar +rules.pauseDisabled = Disable Pausing rules.fire = Ateş rules.anyenv = rules.explosions = Blok/Birlik Patlama Hasarı @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Güçlendirilmiş Kargo Yönlendirici block.payload-mass-driver.name = Kargo Kütle Sürücü block.small-deconstructor.name = Küçük Yapı Sökücü block.canvas.name = Tuval +block.large-canvas.name = Large Canvas block.world-processor.name = Evrensel İşlemci block.world-cell.name = Evrensel Bellek Hücresi block.tank-fabricator.name = Tank Fabrikatörü @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = Bazı birimlerin binaları ve birimleri alma özelli hint.payloadDrop = [accent]][] tuşuna basarak taşıdğınız yükü bırakabilirsiniz. hint.payloadDrop.mobile = Boş bir yere [accent]tıklayıp basılı tutarak[] taşıdığınız yükü bırakabilirsiniz. hint.waveFire = [accent]Wave[] tareti su ile dolu olduğu zaman etrafta çıkan yangınları otomatik olarak söndürür. -hint.generator = \uf879 [accent]Termik Jeneratör[] kömür yakarak enerji üretir.\n\nEnerjiyi bir yerden başka bir yere götürmek için \uf87f [accent]Enerji Noktalarını[] kullanırız. 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.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Buraya inşa edilien her şey otomatik yok edilir! gz.zone3 = Dalga başlamak üzere.\nHazır ol. Dikkat! ... Korkma sönmez bu şafak- gz.finish = Daha fazla taret inşa et, daha fazla maden kaz\nve tüm dalgaları yenerek [accent]sektörü feth et[]. Bol şans, RTOmega. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Etrafındaki tüm birimleri tamir eder. Oz block.radar.description = Haritayı tarar. Enerji gerektirir. block.shockwave-tower.description = Düşman mermilerinini parçalar. Siyanojen gerektirir. block.canvas.description = Önceden tanımlanmış paletle basit bir fotoğraf sergiler. Düzenlenebilir. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Düşmanlara basit mermilerle ateş eder. unit.mace.description = Düşmanlara alev püskürtür. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 145718a043..448b3607c4 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -15,6 +15,7 @@ link.wiki.description = Офіційна ігрова Wiki link.suggestions.description = Запропонувати нові функції link.bug.description = Знайшли хибу? Повідомте про неї тут linkopen = Сервер надіслав вам посилання. Ви справді хочете перейти за ним?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. @@ -124,6 +125,8 @@ maps.none = [lightgray]Мап не знайдено! invalid = Недійсне pickcolor = Вибрати колір color = Color +import = Import +export = Export preparingconfig = Підготовка налаштувань preparingcontent = Підготовка вмісту uploadingcontent = Вивантаження вмісту @@ -212,6 +215,8 @@ campaign.none = [lightgray]Виберіть планету для старту.\ campaign.erekir = Новіший, більш відшліфований зміст. Переважно лінійний розвиток кампанії.\n\nВища якість мап та ліпший загальний досвід. campaign.serpulo = Старий зміст; класичний досвід. Більш відкрита.\n\nПотенційно незбалансовані мапи й механіки кампанії. Менш відшліфована. campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Завершено techtree = Дерево технологій techtree.select = Вибір дерева технологій @@ -359,6 +364,7 @@ confirm = Підтвердження delete = Видалити view.workshop = Переглянути в Майстерні workshop.listing = Редагувати список Майстерні +hide = Hide ok = Гаразд open = Відкрити customize = Налаштувати правила @@ -370,7 +376,6 @@ command.repair = Ремонтувати command.rebuild = Відбудовувати command.assist = Допомагати гравцеві command.move = Рухатися -command.boost = Летіти command.enterPayload = Увійти до вантажного блока command.loadUnits = Завантажити одиниці command.loadBlocks = Завантажити блоки @@ -381,7 +386,9 @@ stance.shoot = Позиція: стріляти stance.holdfire = Позиція: припинити вогонь stance.pursuetarget = Позиція: переслідувати ціль stance.patrol = Позиція: шлях патрулювання +stance.holdposition = Stance: Hold Position stance.ram = Позиція: на таран\n[lightgray]Рух по прямій лінії, без пошуку шляху +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = Перейти за посиланням @@ -428,6 +435,7 @@ saveimage = Зберегти зображення unknown = Невідомо custom = Користувацька builtin = Вбудована +modded = Modded map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.random = [accent]Випадкова мапа map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте {0} ядро до цієї мапи в редакторі. @@ -488,10 +496,14 @@ editor.center = Центрувати editor.search = Шукати мапи… editor.filters = Фільтрувати мапи editor.filters.mode = Режими гри: +editor.filters.priorities = Priorities: editor.filters.type = Тип мапи: editor.filters.search = Шукати в editor.filters.author = Автор editor.filters.description = Опис +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = Зміщення за віссю X editor.shifty = Зміщення за віссю Y workshop = Майстерня @@ -527,6 +539,7 @@ waves.search = Шукати хвилі... waves.filter = Фільтр одиниць waves.units.hide = Сховати все waves.units.show = Показати все +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = кількість @@ -749,6 +762,7 @@ objective.destroyunits = [accent]Знищте: [][lightgray]{0}[]x Units objective.enemiesapproaching = [accent]Вороги наблизяться через [lightgray]{0}[] objective.enemyescelating = [accent]Нарощування ворожого виробництва почнеться через [lightgray]{0}[] objective.enemyairunits = [accent]Виробництво ворожих повітряних одиниць почнеться через [lightgray]{0}[] +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]Знищте вороже ядро objective.command = [accent]Командуйте над одиницями objective.nuclearlaunch = [accent]⚠ Виявлено ядерний запуск: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Неможливо переключити сектори sector.noswitch = Ви не можете змінювати сектори, поки поточний сектор піддається атаці.\n\nСектор: [accent]{0}[] на [accent]{1}[] sector.view = Переглянути сектор sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = низька threat.medium = середня @@ -843,6 +858,10 @@ threat.high = висока threat.extreme = екстремальна threat.eradication = викорінювальна +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = Casual difficulty.easy = Easy difficulty.normal = Normal @@ -862,7 +881,7 @@ planet.sun.name = Сонце sector.impact0078.name = Аварійне приземлення 0078 sector.groundZero.name = Відправний пункт -sector.craters.name = Кратери +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = Крижаний ліс sector.ruinousShores.name = Зруйновані береги sector.stainedMountains.name = Плямисті гори @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗберіть якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі. sector.frozenForest.description = Навіть тут, ближче до гір, уже поширилися спори. Холодна температура не змогла стримати їх назавжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами. sector.saltFlats.description = На околицях пустелі лежать Соляні рівнини. У цьому місці небагато ресурсів.\n\nСаме тут противники спорудили комплекс зі зберігання ресурсів. Викорініть їхнє ядро. Не лишайте нічого цінного. -sector.craters.description = У цьому кратері накопичилася вода — пережиток старих воєн. Відновіть місцевість. Видобудьте пісок. Виплавте метаскло. Качайте воду, щоб охолоджувати башти та бури. +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = Повз пустки — берегова лінія. Колись у цьому місці розташувався береговий оборонний масив. Проте з тих давніх часів залишилося не дуже й багато чого. Тільки основні оборонні споруди лишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Дослідіть повторно забуті технології. sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, що ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості й дізнайтеся як використовувати його.\n\nВорожа присутність у цій місцевості значно більша. Не дайте ворогам часу надіслати свої найсильніші одиниці. sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nПротивник установив тут свій форпост. Побудуйте титанів. Зруйнуйте укріплення. @@ -1045,6 +1065,7 @@ stat.boosteffect = Прискорювальний ефект stat.maxunits = Максимальна кількість активних одиниць stat.health = Здоров’я stat.armor = Броня +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = Час будування stat.maxconsecutive = Максимальна послідовність stat.buildcost = Вартість будування @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat bullet.incendiary = [stat]запальний bullet.homing = [stat]самонаведення bullet.armorpierce = [stat]бронебійність -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] обмеження шкоди bullet.suppression = [stat]{0}[lightgray] сек. пригнічення відновлення ~ [stat]{1}[lightgray] плит. @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Вимикати модифікації післ setting.animatedwater.name = Анімаційні рідини setting.animatedshields.name = Анімаційні щити setting.playerindicators.name = Позначки гравців +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = Позначки противників setting.autotarget.name = Автострільба setting.keyboard.name = Миш + Керування з клавіатури @@ -1269,6 +1292,8 @@ setting.fpscap.none = Жодне setting.fpscap.text = {0} FPS setting.uiscale.name = Масштабування користувацького інтерфейсу setting.uiscale.description = Потрібен перезапуск для застосування змін. +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = Завжди діагональне розміщення setting.screenshake.name = Тряска екрану setting.bloomintensity.name = Інтенсивність світіння @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Інтервал збереження setting.seconds = {0} секунд setting.milliseconds = {0} мілісекунд setting.fullscreen.name = Повноекранний режим -setting.borderlesswindow.name = Безрамкове вікно -setting.borderlesswindow.name.windows = Повне безрамкове вікно -setting.borderlesswindow.description = Можливо, потрібен перезапуск для застосування змін. setting.fps.name = Показувати FPS і затримку до сервера setting.console.name = Увімкнути консоль setting.smoothcamera.name = Гладка камера @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Звуки довкілля setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук -setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри setting.communityservers.name = Fetch Community Server List setting.savecreate.name = Автоматичне створення збережень setting.steampublichost.name = Загальнодоступність гри @@ -1334,6 +1355,8 @@ category.command.name = Командувати одиницею category.multiplayer.name = Мережева гра category.blocks.name = Вибір блока placement.blockselectkeys = \n[lightgray]Клавіші: [{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = Відродження keybind.control.name = Контролювання одиниці keybind.clear_building.name = Очистити план будування @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Позиція одиниці: припин keybind.unit_stance_pursue_target.name = Позиція одиниці: переслідувати ціль keybind.unit_stance_patrol.name = Позиція одиниці: патрулювати keybind.unit_stance_ram.name = Позиція одиниці: на таран +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = Unit Command: Move keybind.unit_command_repair.name = Unit Command: Repair keybind.unit_command_rebuild.name = Unit Command: Rebuild keybind.unit_command_assist.name = Unit Command: Assist keybind.unit_command_mine.name = Unit Command: Mine -keybind.unit_command_boost.name = Unit Command: Boost keybind.unit_command_load_units.name = Unit Command: Load Units keybind.unit_command_load_blocks.name = Unit Command: Load Blocks keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockdamagemultiplier = Множник шкоди блоків +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unitcostmultiplier = Множник вартості одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = Вогонь rules.anyenv = <Будь-яка> rules.explosions = Шкода від вибухів блоків і одиниць @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Посилений вантажний м block.payload-mass-driver.name = Вантажна катапульта block.small-deconstructor.name = Малий деконструктор block.canvas.name = Полотно +block.large-canvas.name = Large Canvas block.world-processor.name = Світовий процесор block.world-cell.name = Світова комірка пам’яті block.tank-fabricator.name = Танкобудівний завод @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Натисніть й утримуйте[] hint.payloadDrop = Натисніть [accent]][], щоби вивантажити вантаж. hint.payloadDrop.mobile = [accent]Натисніть[] на вільне місце й [accent]утримуйте[], щоби вивантажити туди вантаж. hint.waveFire = Башта [accent]хвиля[] з водою буде автоматично гасити найближчі пожежі. -hint.generator = :combustion-generator: [accent]Генератори внутрішнього згорання[] спалюють вугілля і передають енергію прилеглим блокам.\n\nРадіус передачі енергії можна збільшити за допомогою :power-node: [accent]силових вузлів[]. hint.guardian = [accent]Вартові[] одиниці броньовані. Слабкі боєприпаси, як-от [accent]мідь[] чи [accent]свинець[], [scarlet]не є ефективними[].\n\nВикористовуйте башти вищого рангу чи :graphite: [accent]графітові боєприпаси[] для Подвійної башти чи:salvo:Залпу, щоб убити Вартових. hint.coreUpgrade = Ядро можна покращити, якщо [accent]розмістити поверх нього ядро вищого рівня[].\n\nРозмістіть :core-foundation: ядро [accent]«Штаб»[] поверх :core-shard: ядра [accent]«Уламок»[]. Переконайтесь, що поблизу ядер немає перешкод (зайвих блоків). hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = Усе, що побудовано в цьому радіусі, зн gz.zone3 = Зараз почнеться хвиля.\nПриготуйется gz.finish = Збудуйте більше башт, видобудьте більше ресурсів \nі захистіться проти всіх хвиль, щоби [accent]захопити сектор[]. +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Англійська назва: Unit Repa block.radar.description = Англійська назва: Radar\nПоступово проявляє місцевість та одиниці противника у великому радіусі. Вимагає енергії. block.shockwave-tower.description = Англійська назва: Shockwave Tower\nПошкоджує та знищує ворожі снаряди в радіусі. Потребує ціаногену. block.canvas.description = Англійська назва: Canvas\nПоказує просте зображення із заздалегідь визначеною палітрою. Можна редагувати. +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = Англійська назва: Dagger\nВистрілює стандартними кулями в найближчих ворогах. unit.mace.description = Англійська назва: Mace\nВистрілює потоками полум’я в найближчих ворогів. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 276d77fdbd..64161e4d60 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -15,6 +15,7 @@ link.wiki.description = Wiki chính thức của Mindustry link.suggestions.description = Đề xuất các tính năng mới link.bug.description = Tìm thấy lỗi? Báo cáo ở đây linkopen = Máy chủ này đã gửi cho bạn một liên kết. Có chắc muốn mở nó chứ?\n\n[sky]{0} +clipboardcopy = Máy chủ này muốn sao chép văn bản vào bảng tạm của bạn. Bạn có chắc muốn tiếp tục?\n\n[sky]{0} linkfail = Không mở được liên kết!\nURL đã được sao chép vào bộ nhớ tạm. screenshot = Ảnh chụp màn hình được lưu vào {0} screenshot.invalid = Bản đồ quá lớn, có khả năng không đủ bộ nhớ để chụp ảnh màn hình. @@ -124,6 +125,8 @@ maps.none = [lightgray]Không tìm thấy bản đồ! invalid = Không hợp lệ pickcolor = Chọn màu color = Màu +import = Nhập +export = Xuất preparingconfig = Đang chuẩn bị cấu hình preparingcontent = Đang chuẩn bị nội dung uploadingcontent = Đang tải lên nội dung @@ -212,6 +215,8 @@ campaign.none = [lightgray]Chọn một hành tinh để bắt đầu.\nCó th campaign.erekir = Nội dung mới và được trau chuốt. Quá trình chiến dịch liền mạch hơn.\n\nKhó hơn. Bản đồ chất lượng hơn và trải nghiệm tổng thể tốt hơn. campaign.serpulo = Nội dung cũ; trải nghiệm cơ bản. Tiến trình mở hơn, nhiều nội dung hơn.\n\nRất có thể vẫn còn cơ chế bản đồ và chiến dịch bị mất cân bằng. Ít được trau chuốt. campaign.difficulty = Độ khó +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]Đã nghiên cứu techtree = Cây công nghệ techtree.select = Chọn nhánh công nghệ @@ -246,7 +251,7 @@ server.kicked.gameover = Trò chơi kết thúc! server.kicked.serverRestarting = Máy chủ đang khởi động lại. server.versions = Phiên bản của bạn:[accent] {0}[]\nPhiên bản máy chủ:[accent] {1}[] host.info = Nút [accent]Mở máy chủ[] mở máy chủ trên cổng đã chỉ định.\nBất kỳ ai trên cùng [lightgray]wifi hoặc mạng cục bộ[] sẽ có thể thấy máy chủ của bạn trong danh sách máy chủ của họ.\n\nNếu bạn muốn mọi người có thể kết nối từ mọi nơi bằng IP, [accent]chuyển tiếp cổng (port forwarding)[] là bắt buộc.\n\n[lightgray]Lưu ý: Nếu ai đó đang gặp sự cố khi kết nối với máy chủ trong mạng LAN của bạn, đảm bảo rằng bạn đã cho phép Mindustry truy cập vào mạng cục bộ của mình trong cài đặt tường lửa. Lưu ý rằng các mạng công cộng đôi khi không cho phép khám phá máy chủ. -join.info = Tại đây, bạn có thể nhập [accent]IP máy chủ[] kết nối, hoặc khám phá [accent]mạng cục bộ[] hay kết nối đến máy chủ [accent]toàn cầu[].\nCả mạng LAN và WAN đều được hỗ trợ.\n\n[lightgray]Nếu bạn muốn kết nối với ai đó bằng IP, bạn sẽ cần phải hỏi IP của họ, có thể được tìm thấy bằng cách tra google với từ khóa "my ip" trên thiết bị của họ. +join.info = Tại đây, bạn có thể nhập [accent]IP máy chủ[] kết nối, hoặc khám phá [accent]mạng cục bộ[] hay kết nối đến máy chủ [accent]toàn cầu[].\nCả mạng LAN và WAN đều được hỗ trợ.\n\n[lightgray]Nếu bạn muốn kết nối với ai đó bằng IP, bạn sẽ cần phải hỏi IP của họ, có thể được tìm thấy bằng cách tra Google với từ khóa "my ip" trên thiết bị của họ. hostserver = Làm chủ trò chơi nhiều người chơi invitefriends = Mời bạn bè hostserver.mobile = Làm chủ trò chơi @@ -264,7 +269,7 @@ servers.local.steam = Trò chơi hiện có & Máy chủ cục bộ servers.remote = Máy chủ từ xa servers.global = Máy chủ cộng đồng -servers.disclaimer = Các máy chỉ cộng đồng [accent]không[] được sở hữu và kiểm soát bởi nhà phát triển.\n\nMáy chủ có thể chứa nội dung do người dùng tạo và không phù hợp với mọi lứa tuổi. +servers.disclaimer = Các máy chủ cộng đồng [accent]không[] được sở hữu và kiểm soát bởi nhà phát triển.\n\nMáy chủ có thể chứa nội dung do người dùng tạo và không phù hợp với mọi lứa tuổi. servers.showhidden = Hiện máy chủ ẩn server.shown = Đã hiện server.hidden = Đã ẩn @@ -354,11 +359,12 @@ save.mode = Chế độ chơi: {0} save.date = Lưu lần cuối: {0} save.playtime = Thời gian chơi: {0} dontshowagain = Không hiện lại -warning = Cảnh báo. +warning = Cảnh báo! confirm = Xác nhận delete = Xóa view.workshop = Xem trong Workshop workshop.listing = Chỉnh sửa danh sách Workshop +hide = Ẩn ok = Đồng ý open = Mở customize = Quy tắc tùy chỉnh @@ -370,7 +376,6 @@ command.repair = Sửa chữa command.rebuild = Xây lại command.assist = Hỗ trợ Người chơi command.move = Di Chuyển -command.boost = Tăng cường command.enterPayload = Nhập Khối hàng vào Công trình command.loadUnits = Nhận Đơn vị command.loadBlocks = Nhận Khối công trình @@ -381,7 +386,9 @@ stance.shoot = Thế Trận: Bắn stance.holdfire = Thế Trận: Ngừng Bắn stance.pursuetarget = Thế Trận: Bám Đuổi Mục Tiêu stance.patrol = Thế Trận: Đường Tuần Tra +stance.holdposition = Thế Trận: Đứng Yên stance.ram = Thế Trận: Tông Thẳng\n[lightgray]Đi theo đường thẳng, không tìm đường +stance.boost = Tăng cường stance.mineauto = Tự Động Khai Khoáng stance.mine = Vật Phẩm Khai Khoáng: {0} openlink = Mở liên kết @@ -428,6 +435,7 @@ saveimage = Lưu hình ảnh unknown = Không xác định custom = Tùy chỉnh builtin = Có sẵn +modded = Đã tùy chỉnh map.delete.confirm = Bạn có chắc chắn muốn xóa bản đồ này không? Hành động này không thể hoàn tác! map.random = [accent]Bản đồ ngẫu nhiên map.nospawn = Bản đồ này không có bất kỳ lõi nào để người chơi hồi sinh! Thêm một lõi {0} vào bản đồ này ở trình chỉnh sửa. @@ -488,10 +496,14 @@ editor.center = Trung tâm editor.search = Tìm kiếm bản đồ... editor.filters = Lọc bản đồ editor.filters.mode = Chế độ chơi: +editor.filters.priorities = Ưu tiên: editor.filters.type = Kiểu bản đồ: editor.filters.search = Tìm kiếm trong: editor.filters.author = Tác giả editor.filters.description = Mô tả +editor.filters.modname = Tên Bản Mod +editor.filters.prioritizemod = Ưu Tiên Bản Mod +editor.filters.prioritizecustom = Ưu Tiên Tùy Chỉnh editor.shiftx = Dịch theo X editor.shifty = Dịch theo Y workshop = Workshop @@ -527,6 +539,7 @@ waves.search = Tìm kiếm các đợt... waves.filter = Bộ lọc đơn vị waves.units.hide = Ẩn tất cả waves.units.show = Hiện tất cả +pause.disabled = [scarlet]Tạm dừng đã tắt #these are intentionally in lower case wavemode.counts = số lượng @@ -748,7 +761,8 @@ objective.buildunit = [accent]Tạo đơn vị: [][lightgray]{0}[]x\n{1}[lightgr objective.destroyunits = [accent]Tiêu diệt: [][lightgray]{0}[]x Đơn vị objective.enemiesapproaching = [accent]Kẻ địch đến sau [lightgray]{0}[] objective.enemyescelating = [accent]Kẻ địch leo thang sản xuất sau [lightgray]{0}[] -objective.enemyairunits = [accent]Kẻ địch bắt đầu sản xuất đơn vị bay sau [lightgray]{0}[] +objective.enemyairunits = [accent]Kẻ địch bắt đầu sản xuất đơn vị không quân sau [lightgray]{0}[] +objective.enemyunitproduction = [accent]Kẻ địch bắt đầu sản xuất đơn vị sau [lightgray]{0}[] objective.destroycore = [accent]Phá huỷ lõi kẻ địch objective.command = [accent]Mệnh lệnh đơn vị objective.nuclearlaunch = [accent]⚠ Phát hiện việc phóng tên lửa: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = Không thể đổi phân khu sector.noswitch = Bạn không thể đổi phân khu khi một phân khu đã có đang bị tấn công.\n\nPhân khu: [accent]{0}[] ở [accent]{1}[] sector.view = Xem phân khu sector.foundationrequired = [lightgray] Yêu cầu Lõi: Trụ sở +sector.shielded = [lightgray] Shielded threat.low = Thấp threat.medium = Trung bình @@ -843,6 +858,10 @@ threat.high = Cao threat.extreme = Cực cao threat.eradication = Hủy diệt +difficulty.guide.title = Lưu ý +difficulty.guide = Nếu một phân khu nào đó gây quá nhiều thử thách, độ khó của chiến dịch có thể được điều chỉnh để mang lại trải nghiệm dễ dàng hơn. +difficulty.guide.confirm = Điều Chỉnh Độ Khó + difficulty.casual = Giải trí difficulty.easy = Dễ difficulty.normal = Vừa @@ -860,43 +879,44 @@ planet.serpulo.name = Serpulo planet.erekir.name = Erekir planet.sun.name = Mặt trời -sector.impact0078.name = Impact 0078 -sector.groundZero.name = Ground Zero -sector.craters.name = The Craters -sector.frozenForest.name = Frozen Forest -sector.ruinousShores.name = Ruinous Shores -sector.stainedMountains.name = Stained Mountains -sector.desolateRift.name = Desolate Rift -sector.nuclearComplex.name = Nuclear Production Complex -sector.overgrowth.name = Overgrowth -sector.tarFields.name = Tar Fields -sector.saltFlats.name = Salt Flats -sector.fungalPass.name = Fungal Pass -sector.biomassFacility.name = Biomass Synthesis Facility -sector.windsweptIslands.name = Windswept Islands -sector.extractionOutpost.name = Extraction Outpost -sector.facility32m.name = Facility 32 M -sector.taintedWoods.name = Tainted Woods -sector.infestedCanyons.name = Infested Canyons -sector.planetaryTerminal.name = Planetary Launch Terminal -sector.coastline.name = Humid Coastline -sector.navalFortress.name = Naval Fortress -sector.polarAerodrome.name = Polar Aerodrome -sector.atolls.name = Atolls -sector.testingGrounds.name = Testing Grounds -sector.perilousHarbor.name = Perilous Harbor -sector.weatheredChannels.name = Weathered Channels -sector.fallenVessel.name = Fallen Vessel -sector.mycelialBastion.name = Mycelial Bastion -sector.frontier.name = Frontier -sector.sunkenPier.name = Sunken Pier -sector.cruxscape.name = Cruxscape -sector.geothermalStronghold.name = Geothermal Stronghold +sector.impact0078.name = Điểm Va Chạm 0078 +sector.groundZero.name = Điểm Khởi Đầu +sector.crateredBattleground.name = Chiến Trường Đầy Miệng Núi Lửa +sector.frozenForest.name = Khu Rừng Băng Giá +sector.ruinousShores.name = Bờ Biển Hoang Tàn +sector.stainedMountains.name = Những Ngọn Núi Ám Màu +sector.desolateRift.name = Khe Nứt Hoang Vắng +sector.nuclearComplex.name = Tổ Hợp Sản Xuất Hạt Nhân +sector.overgrowth.name = Tăng Trưởng Quá Mức +sector.tarFields.name = Cánh Đồng Nhựa Đường +sector.saltFlats.name = Bãi Muối +sector.fungalPass.name = Lối Đi Của Nấm +sector.biomassFacility.name = Cơ Sở Tổng Hợp Sinh Khối +sector.windsweptIslands.name = Quần Đảo Lộng Gió +sector.extractionOutpost.name = Trạm Chiết Xuất +sector.facility32m.name = Cơ Sở 32 M +sector.taintedWoods.name = Rừng Ô Uế +sector.infestedCanyons.name = Hẻm Núi Nhiễm Bệnh +sector.planetaryTerminal.name = Trạm Cuối Phóng Liên Hành Tinh +sector.coastline.name = Bờ Biển Ẩm Ướt +sector.navalFortress.name = Pháo Đài Thủy Quân +sector.polarAerodrome.name = Sân Bay Điểm Cực Đạo +sector.atolls.name = Đảo San Hô +sector.testingGrounds.name = Khu Vực Thử Nghiệm +sector.perilousHarbor.name = Thủy Cảng Hiểm Nguy +sector.weatheredChannels.name = Các Kênh Bị Phong Hóa +sector.fallenVessel.name = Con Tàu Thất Thủ +sector.mycelialBastion.name = Pháo Đài Sợi Nấm +sector.frontier.name = Biên Giới +sector.sunkenPier.name = Đê Tàu Chìm +sector.littoralShipyard.name = Xưởng Tàu Duyên Hải +sector.cruxscape.name = Địa Thế Hiểm Yếu +sector.geothermalStronghold.name = Thành Trì Địa Nhiệt sector.groundZero.description = Vị trí tối ưu để bắt đầu một lần nữa. Mối đe dọa của kẻ địch thấp. Ít tài nguyên.\nThu thập càng nhiều đồng và chì càng tốt.\nTiến lên. sector.frozenForest.description = Dù ở đây, gần núi cao, các bào tử vẫn bắt đầu phát tán. Nhiệt độ lạnh giá không thể giữ chúng lại mãi.\n\nBắt đầu tạo năng lượng. Hãy xây dựng máy phát điện đốt. Học cách sử dụng máy sửa chữa. sector.saltFlats.description = Ở vùng rìa sa mạc chính là Salt Flats. Có thể tìm thấy một ít tài nguyên ở khu vực này.\n\nKẻ địch đã dựng lên một khu phức hợp lưu trữ tài nguyên ở đây. Hãy loại bỏ hoàn toàn căn cứ này. -sector.craters.description = Nước đã tích tụ trong miệng núi lửa ở đây, vốn là dấu tích của các cuộc chiến tranh cũ. Hãy chiếm lại phân khu. Thu gom cát. Nung thủy tinh. Bơm nước để làm mát tháp súng và mũi khoan. +sector.crateredBattleground.description = Nước đã tích tụ trong miệng núi lửa ở đây, vốn là dấu tích của các cuộc chiến tranh cũ. Hãy chiếm lại phân khu. Thu gom cát. Nung thủy tinh. Bơm nước để làm mát tháp súng và mũi khoan. sector.ruinousShores.description = Vượt qua những địa hình mấp mô, là bờ biển. Vị trí này từng là nơi đặt một hệ thống phòng thủ ven biển. Không còn lại gì nhiều, chỉ những công trình phòng thủ cơ bản nhất vẫn không bị tổn thương, mọi thứ khác đều trở thành đống sắt vụn.\nTiếp tục mở rộng ra bên ngoài. Khám phá lại công nghệ có ở đây. sector.stainedMountains.description = Xa hơn trong đất liền là những ngọn núi, chưa bị bào tử xâm lấn.\nKhai thác titan dồi dào trong khu vực này. Tìm hiểu làm thế nào để sử dụng nó.\n\nSự hiện diện của kẻ địch ở đây lớn hơn. Đừng cho chúng thời gian để có đơn vị mạnh nhất của chúng. sector.overgrowth.description = Khu vực này phát triển quá mức, gần nguồn bào tử hơn.\nĐịch đã lập tiền đồn ở đây. Chế tạo đơn vị Mace. Phá hủy nó. @@ -912,23 +932,23 @@ sector.planetaryTerminal.description = Mục tiêu cuối cùng.\n\nCăn cứ ve sector.coastline.description = Phát hiện tàn dư công nghệ của các đơn vị thủy quân tại địa điểm này. Đẩy lùi các cuộc tấn công của kẻ địch, chiếm phân khu này, và lấy công nghệ. sector.navalFortress.description = Kẻ địch đã thiết lập một căn cứ từ xa, trên đảo tự nhiên. Phá hủy tiền đồn này. Chiếm công nghệ chế tạo đơn vị thủy quân tiên tiến của địch và nghiên cứu nó. -sector.onset.name = The Onset -sector.aegis.name = Aegis -sector.lake.name = Lake -sector.intersect.name = Intersect -sector.atlas.name = Atlas -sector.split.name = Split -sector.basin.name = Basin -sector.marsh.name = Marsh -sector.peaks.name = Peaks -sector.ravine.name = Ravine -sector.caldera-erekir.name = Caldera -sector.stronghold.name = Stronghold -sector.crevice.name = Crevice -sector.siege.name = Siege -sector.crossroads.name = Crossroads -sector.karst.name = Karst -sector.origin.name = Origin +sector.onset.name = Điểm Bắt Đầu +sector.aegis.name = Khiên Chắn +sector.lake.name = Hồ +sector.intersect.name = Giao Nhau +sector.atlas.name = Địa Đồ +sector.split.name = Chia Tách +sector.basin.name = Lưu Vực +sector.marsh.name = Đầm Lầy +sector.peaks.name = Đỉnh Núi +sector.ravine.name = Khe Nước +sector.caldera-erekir.name = Miệng Núi +sector.stronghold.name = Thành Trì +sector.crevice.name = Khe Nứt +sector.siege.name = Bao Vây +sector.crossroads.name = Ngã Tư +sector.karst.name = Núi Đá Vôi +sector.origin.name = Nguồn Gốc sector.onset.description = Bắt đầu hành trình chinh phục Erekir. Thu thập tài nguyên, sản xuất đơn vị, và bắt đầu nghiên cứu công nghệ. sector.aegis.description = Phân khu này chứa các kho lưu trữ của tungsten.\nNghiên cứu [accent]Máy khoan động lực[] để khai thác tài nguyên này, và phá hủy căn cứ của địch ở khu vực. @@ -938,7 +958,7 @@ sector.atlas.description = Phân khu này có địa hình phong phú và sẽ c sector.split.description = Sự hiện diện ít ỏi của kẻ địch ở phân khu này làm nó là một nơi hoàn hảo để thử nghiệm công nghệ vận chuyển mới. sector.basin.description = Đã phát hiện sự hiện diện lớn mạnh của kẻ địch ở phân khu này.\nSản xuất đơn vị nhanh chóng và chiếm được các lõi của địch để có được một vị thế vững chắc. sector.marsh.description = Phân khu này có trữ lượng lớn arkycite, nhưng có số lỗ hơi nước giới hạn.\nXây dựng [accent]Bể điện hóa[] để tạo năng lượng. -sector.peaks.description = Địa hình đồi núi của phân khu này khiến hầu hết các loại đơn vị vô dụng. Các loại đơn vị bay trở nên cần thiết.\nHãy cẩn thận với các công trình phòng thủ trên không của địch. Có thể bị vô hiệu hóa một số bằng cách nhắm vào các công trình hỗ trợ của chúng. +sector.peaks.description = Địa hình đồi núi của phân khu này khiến hầu hết các loại đơn vị vô dụng. Các loại đơn vị không quân trở nên cần thiết.\nHãy cẩn thận với các công trình phòng thủ trên không của địch. Có thể bị vô hiệu hóa một số bằng cách nhắm vào các công trình hỗ trợ của chúng. sector.ravine.description = Một tuyến đường vận chuyển quan trọng cho kẻ địch. Không phát hiện lõi nào trong phân khu, nhưng dự đoán sẽ có nhiều loại kẻ địch đa dạng.\nSản xuất [accent]hợp kim[]. Xây dựng tháp súng [accent]Afflict[]. sector.caldera-erekir.description = Các tài nguyên được phát hiện ở phân khu này được phân bố trên nhiều đảo.\nNghiên cứu và triển khai vận chuyển dựa trên máy bay không người lái. sector.stronghold.description = Các căn cứ của địch ở phân khu này đang bảo vệ một lượng lớn [accent]thori[].\nSử dụng nó để phát triển các loại đơn vị và tháp súng cao cấp hơn. @@ -1030,7 +1050,7 @@ stat.itemcapacity = Sức chứa vật phẩm stat.memorycapacity = Dung lượng bộ nhớ stat.basepowergeneration = Năng lượng tạo ra cơ bản stat.productiontime = Thời gian sản xuất -stat.warmuptime = Warmup Time +stat.warmuptime = Thời Gian Khởi Động stat.repairtime = Thời gian hoàn thành sửa chữa stat.repairspeed = Tốc độ sửa stat.weapons = Vũ khí @@ -1045,6 +1065,7 @@ stat.boosteffect = Hiệu ứng tăng cường stat.maxunits = Số đơn vị hoạt động tối đa stat.health = Độ bền stat.armor = Giáp +stat.armor.info = Sát thương gây ra = sát thương nhận vào - giáp.\nGiảm sát thương tối đa lên đến 90%. stat.buildtime = Thời gian xây stat.maxconsecutive = Nối tiếp tối đa stat.buildcost = Chi phí xây @@ -1073,7 +1094,7 @@ stat.minetier = Cấp độ đào stat.payloadcapacity = Tải trọng stat.abilities = Khả năng stat.canboost = Có thể tăng cường -stat.boostingspeed = Boosting Speed +stat.boostingspeed = Tốc Độ Tăng Tốc stat.flying = Bay stat.ammouse = Sử dụng đạn stat.ammocapacity = Trữ lượng đạn @@ -1093,7 +1114,7 @@ ability.repairfield = Trường sửa chữa ability.repairfield.description = Sửa chữa các đơn vị gần đó ability.statusfield = Trường trạng thái ability.statusfield.description = Áp dụng hiệu ứng trạng thái vào các đơn vị gần đó -ability.unitspawn = Chế tạo +ability.unitspawn = Nhà máy ability.unitspawn.description = Sản xuất đơn vị ability.shieldregenfield = Trường hồi khiên ability.shieldregenfield.description = Hồi phục khiên cho các đơn vị gần đó @@ -1104,7 +1125,7 @@ ability.armorplate.description = Giảm sát thương gánh chịu trong khi b ability.shieldarc = Khiên vòng cung ability.shieldarc.description = Phát một khiên trường lực vòng cung hấp thụ hoặc làm chệch hướng các loại đạn, tên lửa và đơn vị ability.suppressionfield = Ngăn chặn sửa chữa -ability.suppressionfield.description = Dừng các công trình sửa chữa gần đó +ability.suppressionfield.description = Dừng các công trình sửa chữa và tháp xây dựng gần đó ability.energyfield = Trường điện từ ability.energyfield.description = Giật điện các kẻ địch gần đó ability.energyfield.healdescription = Giật điện các kẻ địch gần đó và hồi phục đồng minh @@ -1172,7 +1193,7 @@ bar.activated = Đã kích hoạt units.processorcontrol = [lightgray]Điều khiển bởi bộ xử lý -weapon.pointdefense = [stat]Point Defense +weapon.pointdefense = [stat]Phòng Thủ Mũi Nhọn bullet.damage = [stat]{0}[lightgray] sát thương bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô @@ -1180,21 +1201,21 @@ bullet.incendiary = [stat]gây cháy bullet.homing = [stat]truy đuổi bullet.armorpierce = [stat]xuyên giáp bullet.armorweakness = [red]{0}%[lightgray] giảm giáp -bullet.armorpiercing = [stat]{0}%[lightgray] xuyên giáp +bullet.partialarmorpierce = [stat]{0}%[lightgray] xuyên giáp bullet.antiarmor = [stat]{0}x[lightgray] kháng giáp bullet.maxdamagefraction = [stat]{0}%[lightgray] giới hạn sát thương bullet.suppression = [stat]{0}[lightgray] giây ngăn sửa chữa ~ [stat]{1}[lightgray] ô -bullet.empradius = [stat]{0}[lightgray] tiles EMP radius -bullet.empboost = [stat]{0}%[lightgray] overdrive ~ [stat]{1}[lightgray] -bullet.empdamage = [stat]{0}%[lightgray] power damage -bullet.empslowdown = [stat]{0}%[lightgray] enemy power overdrive ~ [stat]{1}[lightgray] -bullet.empunitdamage = [stat]{0}%[lightgray] unit damage +bullet.empradius = bán kính EMP [stat]{0}[lightgray] ô +bullet.empboost = [stat]{0}%[lightgray] tăng tốc ~ [stat]{1}[lightgray] +bullet.empdamage = [stat]{0}%[lightgray] sát thương năng lượng +bullet.empslowdown = [stat]{0}%[lightgray] tăng tốc năng lượng kẻ địch ~ [stat]{1}[lightgray] +bullet.empunitdamage = [stat]{0}%[lightgray] sát thương đơn vị bullet.interval = [stat]{0}/giây[lightgray] đạn ngắt quãng: bullet.frags = [stat]{0}x[lightgray] đạn phá mảnh: bullet.lightning = [stat]{0}[lightgray]x phóng điện ~ [stat]{1}[lightgray] sát thương -bullet.lightninginterval = [stat]{0}[lightgray] tiles interval ~ [stat]{1}[lightgray] tiles length +bullet.lightninginterval = [stat]{0}[lightgray] khoảng ô ~ [stat]{1}[lightgray] độ dài ô bullet.buildingdamage = [stat]{0}%[lightgray] sát thương công trình -bullet.spawnBullets = [stat]{0}x[lightgray] spawned bullets: +bullet.spawnBullets = [stat]{0}x[lightgray] đạn sinh ra: bullet.shielddamage = [stat]{0}%[lightgray] sát thương khiên chắn bullet.knockback = [stat]{0}[lightgray] đẩy lùi bullet.pierce = [stat]{0}[lightgray]x xuyên thấu @@ -1215,7 +1236,7 @@ unit.liquidsecond = đơn vị chất lỏng/giây unit.itemssecond = vật phẩm/giây unit.liquidunits = đơn vị chất lỏng unit.powerunits = đơn vị năng lượng -unit.powerequilibrium = power equilibrium +unit.powerequilibrium = cân bằng năng lượng unit.heatunits = đơn vị nhiệt unit.degrees = độ unit.seconds = giây @@ -1233,7 +1254,7 @@ unit.billions = tỷ unit.shots = phát bắn unit.pershot = /phát bắn unit.perleg = mỗi chân -unit.perside = per side +unit.perside = mỗi mặt category.purpose = Mục đích category.general = Chung category.power = Năng lượng @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = Tắt các mod khi gặp sự cố trong khởi setting.animatedwater.name = Chuyển động bề mặt setting.animatedshields.name = Chuyển động khiên setting.playerindicators.name = Chỉ hướng người chơi +setting.showpings.name = Hiện Tín Hiệu Đánh Dấu +setting.showotherbuildplans.name = Hiện Kế Hoạch Xây Của Người Chơi Khác setting.indicators.name = Chỉ hướng kẻ địch setting.autotarget.name = Tự động nhắm mục tiêu setting.keyboard.name = Điều khiển bằng chuột + bàn phím (Thử nghiệm) @@ -1269,6 +1292,8 @@ setting.fpscap.none = Không có setting.fpscap.text = {0} FPS setting.uiscale.name = Tỉ lệ giao diện setting.uiscale.description = Cần khởi động lại để áp dụng các thay đổi. +setting.uiEdgePadding.name = Khoảng Đệm Cạnh Giao Diện +setting.uiEdgePadding.description = Thêm khoảng đệm vào các cạnh của giao diện. Hữu ích cho màn hình với góc bo hoặc tai thỏ. setting.swapdiagonal.name = Luôn đặt theo đường chéo setting.screenshake.name = Rung chuyển khung hình setting.bloomintensity.name = Mức độ phát sáng @@ -1282,9 +1307,6 @@ setting.saveinterval.name = Khoảng thời gian lưu setting.seconds = {0} giây setting.milliseconds = {0} mili-giây setting.fullscreen.name = Toàn màn hình -setting.borderlesswindow.name = Cửa sổ không viền -setting.borderlesswindow.name.windows = Toàn màn hình không viền -setting.borderlesswindow.description = Có thể cần khởi động lại để áp dụng các thay đổi. setting.fps.name = Hiện FPS & Ping setting.console.name = Bật Bảng điều khiển setting.smoothcamera.name = Khung quay mượt mà @@ -1303,7 +1325,6 @@ setting.ambientvol.name = Âm lượng môi trường setting.mutemusic.name = Tắt nhạc setting.sfxvol.name = Âm lượng hiệu ứng âm thanh (SFX) setting.mutesound.name = Tắt âm -setting.crashreport.name = Gửi báo cáo sự cố ẩn danh setting.communityservers.name = Lấy danh sách máy chủ cộng đồng setting.savecreate.name = Tự động tạo bản lưu setting.steampublichost.name = Hiển thị trò chơi công khai @@ -1315,7 +1336,7 @@ setting.bridgeopacity.name = Độ mờ cầu setting.playerchat.name = Hiển thị bong bóng trò chuyện của người chơi setting.showweather.name = Hiện đồ họa thời tiết setting.hidedisplays.name = Ẩn hiển thị logic -setting.macnotch.name = Giao diện phù hợp với hiển thị tai thỏ (notch) +setting.macnotch.name = Giao diện phù hợp với hiển thị tai thỏ setting.macnotch.description = Cần khởi động lại để áp dụng các thay đổi steam.friendsonly = Chỉ bạn bè steam.friendsonly.tooltip = Liệu chỉ bạn bè trên Steam mới có thể tham gia trò chơi của bạn hay không.\nBỏ chọn ô này sẽ làm trò chơi của bạn công khai - mọi người có thể tham gia. @@ -1334,6 +1355,8 @@ category.command.name = Mệnh lệnh đơn vị category.multiplayer.name = Nhiều người chơi category.blocks.name = Chọn khối placement.blockselectkeys = \n[lightgray]Phím: [{0}, +ping.text = Tín hiệu đánh dấu: +keybind.ping.name = Định Vị Tín Hiệu Đánh Dấu keybind.respawn.name = Hồi sinh keybind.control.name = Điều khiển đơn vị keybind.clear_building.name = Xóa công trình @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = Thế Trận Đơn Vị: Ngừng Bắn keybind.unit_stance_pursue_target.name = Thế Trận Đơn Vị: Bám Đuổi Mục Tiêu keybind.unit_stance_patrol.name = Thế Trận Đơn Vị: Tuần Tra keybind.unit_stance_ram.name = Thế Trận Đơn Vị: Tông Thẳng +keybind.unit_stance_boost.name = Thế Trận Đơn Vị: Tăng Cường +keybind.unit_stance_hold_position.name = Thế Trận Đơn Vị: Đứng Yên keybind.unit_command_move.name = Mệnh lệnh đơn vị: Di chuyển keybind.unit_command_repair.name = Mệnh lệnh đơn vị: Sửa chữa keybind.unit_command_rebuild.name = Mệnh lệnh đơn vị: Xây lại keybind.unit_command_assist.name = Mệnh lệnh đơn vị: Hỗ trợ keybind.unit_command_mine.name = Mệnh lệnh đơn vị: Khai thác -keybind.unit_command_boost.name = Mệnh lệnh đơn vị: Tăng cường keybind.unit_command_load_units.name = Mệnh lệnh đơn vị: Nhập đơn vị keybind.unit_command_load_blocks.name = Mệnh lệnh đơn vị: Nhập khối công trình keybind.unit_command_unload_payload.name = Mệnh lệnh đơn vị: Dỡ khối hàng @@ -1483,13 +1507,14 @@ rules.checkplacement.info = Khi tắt, công trình của đội này được p rules.enemyCheat = Tài Nguyên Kẻ Địch Vô Hạn rules.blockhealthmultiplier = Hệ Số Độ Bền Khối rules.blockdamagemultiplier = Hệ Số Sát Thương Của Khối +rules.unitfactoryactivation = Trễ Kích Hoạt Nhà Máy Chế Tạo Đơn Vị rules.unitbuildspeedmultiplier = Hệ Số Tốc Độ Sản Xuất Đơn Vị rules.unitcostmultiplier = Hệ Số Chi Phí Sản Xuất Đơn Vị rules.unithealthmultiplier = Hệ Số Độ Bền Của Đơn Vị rules.unitdamagemultiplier = Hệ Số Sát Thương Của Đơn Vị rules.unitcrashdamagemultiplier = Hệ Số Sát Thương Của Đơn Vị Khi Bị Bắn Rơi rules.unitminespeedmultiplier = Hệ Số Tốc Độ Khai Khoáng Đơn Vị -rules.logicunitcontrol = Logic Unit Control +rules.logicunitcontrol = Logic Điều Khiển Đơn Vị rules.logicunitbuild = Logic Đơn Vị Xây Dựng rules.logicunitdeconstruct = Logic Đơn Vị Phá Dỡ rules.solarmultiplier = Hệ Số Năng Lượng Mặt Trời @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Cho phép dùng bệ phóng mà không cần bệ landingpad.legacy.disabled = [scarlet]\ue815 Đã tắt[lightgray] (Bệ phóng di sản được bật) rules.showspawns = Hiện Khu Kẻ Địch Xuất Hiện rules.randomwaveai = Đợt Tấn Công AI Không Đoán Trước +rules.pauseDisabled = Tắt Tạm Dừng rules.fire = Lửa rules.anyenv = rules.explosions = Sát Thương Nổ Của Khối/Đơn Vị @@ -1810,8 +1836,8 @@ block.incinerator.name = Máy thiêu hủy block.spore-press.name = Máy nén bào tử block.separator.name = Máy phân tách block.coal-centrifuge.name = Máy ly tâm than -block.power-node.name = Chốt điện -block.power-node-large.name = Chốt điện lớn +block.power-node.name = Chốt năng lượng +block.power-node-large.name = Chốt năng lượng lớn block.surge-tower.name = Tháp điện hợp kim block.diode.name = Chuyển dòng pin block.battery.name = Pin @@ -2005,8 +2031,8 @@ block.radar.name = Máy quét block.build-tower.name = Tháp xây dựng block.regen-projector.name = Máy chiếu hồi phục block.shockwave-tower.name = Tháp xung điện -block.shield-projector.name = Máy chiếu khiên chắn -block.large-shield-projector.name = Máy chiếu khiên chắn lớn +block.shield-projector.name = Máy chiếu rào chắn +block.large-shield-projector.name = Máy chiếu rào chắn lớn block.armored-duct.name = Ống chân không bọc giáp block.overflow-duct.name = Ống tràn chân không block.underflow-duct.name = Ống tràn ngược chân không @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = Bộ phân phát khối hàng gia cố block.payload-mass-driver.name = Máy phóng từ trường khối hàng block.small-deconstructor.name = Máy tháo dỡ block.canvas.name = Màn hình vẽ +block.large-canvas.name = Màn hình vẽ lớn block.world-processor.name = Bộ xử lý thế giới block.world-cell.name = Bộ nhớ thế giới block.tank-fabricator.name = Máy chế tạo xe tăng @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]Nhấn và giữ[] một khối nhỏ hoặc hint.payloadDrop = Nhấn [accent]][] để thả một khối hàng. hint.payloadDrop.mobile = [accent]Nhấn và giữ[] tại một khu vực trống để thả khối hàng tại đó. hint.waveFire = Tháp súng [accent]Wave[] có nước làm đạn sẽ tự động dập tắt các đám cháy gần đó. -hint.generator = :combustion-generator: [accent]Máy phát điện đốt cháy[] đốt than và truyền năng lượng cho các khối liền kề.\n\nPhạm vi truyền tải năng lượng có thể được mở rộng với :power-node: [accent]Chốt điện[]. hint.guardian = [accent]Trùm[] được bọc giáp. Sử dụng loại đạn yếu chẳng hạn như [accent]Đồng[] và [accent]Chì[] là [scarlet]không hiệu quả[].\n\nSử dụng tháp súng tiên tiến hơn hoặc sử dụng :graphite: [accent]Than chì[] làm đạn :duo:Duo/:salvo:Salvo đạn dược để hạ gục Trùm. hint.coreUpgrade = Các lõi có thể được nâng cấp bằng cách [accent]đặt lõi cấp cao hơn trên chúng[].\n\nĐặt một lõi :core-foundation: [accent]Trụ sở[] trên lõi :core-shard: [accent]Cơ sở[]. Đảm bảo không có vật cản gần đó. hint.serpuloCoreZone = :core-shard: [accent]Các lõi[] bổ sung có thể được xây trên nền :core-zone: [accent]Vùng đặt lõi[]. @@ -2144,7 +2170,7 @@ gz.turrets = Nghiên cứu và đặt 2 tháp súng :duo: [accent]Duo[] để b gz.duoammo = Tiếp đạn cho tháp súng Duo bằng :copper: [accent]đồng[], sử dụng băng chuyền. gz.walls = [accent]Tường[] có thể ngăn chặn sát thương đến các công trình.\nĐặt :copper-wall: [accent]tường đồng[] xung quanh các tháp súng. gz.defend = Quân địch đang đến, hãy chuẩn bị phòng thủ. -gz.aa = Các đơn vị bay không thể dễ dàng bị bắn hạ với các tháp súng tiêu chuẩn.\n:scatter: [accent]Scatter[] cung cấp tốt khả năng phòng không, nhưng cần :lead: [accent]chì[] là đạn. +gz.aa = Các đơn vị không quân không thể dễ dàng bị bắn hạ với các tháp súng tiêu chuẩn.\n:scatter: [accent]Scatter[] cung cấp tốt khả năng phòng không, nhưng cần :lead: [accent]chì[] là đạn. gz.scatterammo = Tiếp đạn cho tháp súng Scatter bằng :lead: [accent]chì[], sử dụng băng chuyền. gz.supplyturret = [accent]Cấp đạn cho tháp súng gz.zone1 = Đây là khu vực quân địch đáp xuống. @@ -2152,6 +2178,16 @@ gz.zone2 = Bất kỳ thứ gì được xây dựng trong bán kính này sẽ gz.zone3 = Một đợt sẽ bắt đầu ngay bây giờ.\nHãy chuẩn bị. gz.finish = Đặt thêm các tháp súng, khai thác thêm nguyên liệu,\nvà vượt qua tất cả các đợt để [accent]chiếm phân khu[]. +ff.coal = Dùng :mechanical-drill: [accent]Máy Khoan Cơ Khí[] để khai thác :ore-coal: [accent]than[]. +ff.graphitepress = :tree: Nghiên cứu và đặt :graphite-press: [accent]Máy Nén Than Chì[]. +ff.craft = Di chuyển :coal: than vào :graphite-press: [accent]Máy Nén Than Chì[].\nNó sẽ cho :graphite: than chì ra tất cả băng chuyền gần đó.\nDi chuyển :graphite: than chì từ :graphite-press: [accent]Máy Nén Than Chì[] vào lõi. +ff.generator = :coal: Than cũng có thể dùng như nhiên liệu trong :combustion-generator: [accent]Máy Phát Điện Đốt Cháy[].\nNghiên cứu và đặt một :combustion-generator: [accent]Máy Phát Điện Đốt Cháy[]. +ff.coalpower = Cho :coal: than vào máy phát điện để sản xuất [accent]:power: năng lượng[]. +ff.coalpower.objective = :combustion-generator: Sản Xuất Năng Lượng +ff.node = :power-node: [accent]Chốt Năng Lượng[] vận chuyển năng lượng đến khối lân cận trong phạm vi.\nNghiên cứu và đặt một :power-node: [accent]Chốt Năng Lượng[] gần bên máy phát điện. +ff.battery = :battery: [accent]Pin[] lưu trữ năng lượng.\nNghiên cứu và đặt một :battery: [accent]Pin[] gần chốt. +ff.arc = Bệ súng :arc: [accent]Arc[] cần có năng lượng để hoạt động. Nghiên cứu và đặt một bệ súng :arc: [accent]Arc[] gần một chốt năng lượng. + fungalpass.tutorial1 = Dùng [accent]các đơn vị[] để phòng thủ công trình và tấn công kẻ địch.\nNghiên cứu và đặt một :ground-factory: [accent]nhà máy lục quân[]. fungalpass.tutorial2 = Chọn đơn vị :dagger: [accent]Dagger[] trong nhà máy.\nSản xuất 3 đơn vị. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = Sửa chữa tất cả các đơn vị tr block.radar.description = Rà soát địa hình và đơn vị kẻ địch một cách từ từ trong môt phạm vi lớn. Yêu cầu điện. block.shockwave-tower.description = Phá hủy và tiêu diệt các loại đạn của kẻ địch trong một phạm vi. Yêu cầu cyano. block.canvas.description = Hiển thị một hình ảnh đơn giản với một bảng màu được định sẵn. Có thể chỉnh sửa. +block.large-canvas.description = Hiển thị một hình ảnh đơn giản với một bảng màu được định sẵn. Có thể chỉnh sửa. unit.dagger.description = Bắn các viên đạn tiêu chuẩn vào các mục tiêu kẻ địch. unit.mace.description = Phun tia lửa vào các mục tiêu kẻ địch. @@ -2551,9 +2588,9 @@ unit.navanax.description = Bắn tia xung điện từ (EMP) nổ, gây thiệt #Erekir unit.stell.description = Bắn các viên đạn tiêu chuẩn vào các mục tiêu kẻ địch. unit.locus.description = Bắn các viên đạn xen kẽ vào các mục tiêu kẻ địch. -unit.precept.description = Bắn các viên đạn phân cụm xuyên thấu vào các mục tiêu kẻ địch. Ít bị ảnh hưởng bởi địa hình gây hại. -unit.vanquish.description = Bắn các viên đạn phân chia xuyên thấu lớn vào các mục tiêu kẻ địch. Ít bị ảnh hưởng bởi địa hình gây hại. -unit.conquer.description = Bắn các viên đạn xếp tầng xuyên thấu vào các mục tiêu kẻ địch. Ít bị ảnh hưởng bởi địa hình gây hại. +unit.precept.description = Bắn các viên đạn phân cụm xuyên thấu vào các mục tiêu kẻ địch. Ít bị ảnh hưởng bởi lực cản chất lỏng. +unit.vanquish.description = Bắn các viên đạn phân chia xuyên thấu lớn vào các mục tiêu kẻ địch. Ít bị ảnh hưởng bởi lực cản chất lỏng. +unit.conquer.description = Bắn các viên đạn xếp tầng xuyên thấu vào các mục tiêu kẻ địch. Ít bị ảnh hưởng đáng kể bởi lực cản chất lỏng. unit.merui.description = Bắn pháo tầm xa vào các mục tiêu kẻ địch trên mặt đất. Có thể đi qua hầu hết loại địa hình. unit.cleroi.description = Bắn trái phá kép vào các mục tiêu kẻ địch. Nhắm vào viên đạn kẻ địch với các tháp súng phòng thủ mũi nhọn. Có thể đi qua hầu hết loại địa hình. unit.anthicus.description = Bắn tên lửa dẫn đường tầm xa vào các mục tiêu kẻ địch. Có thể đi qua hầu hết loại địa hình. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index b1c32c8131..55ef73ee67 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -15,6 +15,7 @@ link.wiki.description = Mindustry 官方 Wiki link.suggestions.description = 提出新功能 link.bug.description = 发现了错误?在这里报告 linkopen = 这个服务器向您发送了一条链接。你确定要打开它吗?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = 无法打开链接!\n链接已复制到你的剪贴板。 screenshot = 截图已保存到 {0} screenshot.invalid = 地图太大了,可能没有足够的内存进行截图。 @@ -124,6 +125,8 @@ maps.none = [lightgray]< 未找到地图 > invalid = 无效 pickcolor = 选择颜色 color = 颜色 +import = Import +export = Export preparingconfig = 准备配置 preparingcontent = 准备内容 uploadingcontent = 上传内容 @@ -212,6 +215,8 @@ campaign.none = [lightgray]请选择一个起始行星。\n你可以随时更换 campaign.erekir = 更新的、更精致的内容。主要是线性的战役进程。\n\n更具挑战性。更高质量的地图和整体体验。 campaign.serpulo = 较旧的内容;经典体验。更具开放性,更多的内容。\n\n可能存在不平衡的地图和战役机制。 campaign.difficulty = 难度 +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]已研究 techtree = 科技树 techtree.select = 切换科技树 @@ -359,6 +364,7 @@ confirm = 确认 delete = 删除 view.workshop = 在创意工坊中查看 workshop.listing = 编辑创意工坊目录 +hide = Hide ok = 确定 open = 打开 customize = 自定义规则 @@ -370,7 +376,6 @@ command.repair = 维修 command.rebuild = 重建 command.assist = 协助建造 command.move = 移动 -command.boost = 助推 command.enterPayload = 进入载荷建筑 command.loadUnits = 拾取单位 command.loadBlocks = 拾取建筑 @@ -381,7 +386,9 @@ stance.shoot = 警戒\n[lightgray]自动攻击一定范围内的敌人 stance.holdfire = 停火\n[lightgray]暂停自动攻击 stance.pursuetarget = 追击\n[lightgray]跟踪敌人并自动攻击 stance.patrol = 巡逻\n[lightgray]根据路径点循环移动 +stance.holdposition = Stance: Hold Position stance.ram = 突进\n[lightgray]径直移动,不进行寻路 +stance.boost = Boost stance.mineauto = 自动采矿 stance.mine = 采矿类型:{0} openlink = 打开链接 @@ -428,6 +435,7 @@ saveimage = 保存图像 unknown = 未知 custom = 自定义 builtin = 内置 +modded = Modded map.delete.confirm = 确定要删除这个地图吗?此操作无法撤销! map.random = [accent]随机地图 map.nospawn = 这个地图没有为玩家设置出生核心!在编辑器中添加一个{0}队核心。 @@ -488,10 +496,14 @@ editor.center = 居中 editor.search = 搜索地图 editor.filters = 筛选地图 editor.filters.mode = 游戏模式: +editor.filters.priorities = Priorities: editor.filters.type = 地图类型: editor.filters.search = 在特定关键词中进行搜索: editor.filters.author = 作者 editor.filters.description = 描述 +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = X 轴平移 editor.shifty = Y 轴平移 workshop = 创意工坊 @@ -527,6 +539,7 @@ waves.search = 搜索波次 waves.filter = 单位过滤 waves.units.hide = 全部隐藏 waves.units.show = 全部显示 +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = 数目 @@ -749,6 +762,7 @@ objective.destroyunits = [accent]摧毁单位:[][lightgray]{0}[]x objective.enemiesapproaching = [accent]敌人来袭:[lightgray]{0}[] objective.enemyescelating = [accent]敌方在[lightgray]{0}[]后扩大单位生产 objective.enemyairunits = [accent]敌方在[lightgray]{0}[]后开始生产空军单位 +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]摧毁敌方核心 objective.command = [accent]指挥单位 objective.nuclearlaunch = [accent]⚠ 侦测到核打击:[lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = 无法切换区块 sector.noswitch = 你无法在当前区块遭受攻击时切换区块。\n\n区块:[accent]{0}[] 位于 [accent]{1}[] sector.view = 查看区块 sector.foundationrequired = [lightgray] 需要次代核心 +sector.shielded = [lightgray] Shielded threat.low = 低度 threat.medium = 中度 @@ -843,6 +858,10 @@ threat.high = 高度 threat.extreme = 极高 threat.eradication = 毁灭 +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = 休闲 difficulty.easy = 简单 difficulty.normal = 正常 @@ -862,7 +881,7 @@ planet.sun.name = 太阳 sector.impact0078.name = 冲击区 0078 sector.groundZero.name = 零号地区 -sector.craters.name = 陨石带 +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = 冰冻森林 sector.ruinousShores.name = 遗迹海岸 sector.stainedMountains.name = 绵延群山 @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = 菌丝堡垒 sector.frontier.name = 边陲哨站 sector.sunkenPier.name = 沉没码头 +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = 赤色总部 sector.geothermalStronghold.name = 熔石要塞 sector.groundZero.description = 这是最佳起点。敌人威胁较低,资源稀少。\n尽量收集铅和铜。\n然后继续前进。 sector.frozenForest.description = 即便在接近山区的地方,孢子依然蔓延。严寒的气温无法永远遏制它们。\n\n开始探索电力。建造火力发电机。学习使用修理器。 sector.saltFlats.description = 沙漠边缘是盐碱荒滩,资源稀少。\n\n敌人已在此建立了资源存储区。摧毁他们的核心,片甲不留。 -sector.craters.description = 这片由旧时战争的遗迹造成的陨石地带有积水。\n\n夺下该区块,收集沙子冶炼玻璃。\n用水泵抽水加速炮塔和钻头。 +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = 穿过荒地就是海滩。\n这里曾经有一条海岸防线,但现在已所剩无几。\n一些基础的防御建筑还完好无损,除此之外都变成了废墟。\n\n继续向外扩张并研究科技。 sector.stainedMountains.description = 深入内陆地区便是山脉,这里目前还未被孢子污染。\n敌人势力更加强大,别给他们的精锐部队留下喘息之机。\n\n这一地区分布着丰富的钛,试着开采并利用它。 sector.overgrowth.description = 这里的孢子靠近它最初的发源地,因此得以疯狂生长。\n\n敌人在该处建立了一个前哨站,建造尖刀单位来摧毁它。 @@ -1045,6 +1065,7 @@ stat.boosteffect = 强化效果 stat.maxunits = 最大单位数量 stat.health = 生命值 stat.armor = 护甲 +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = 建造时间 stat.maxconsecutive = 连续放置限制 stat.buildcost = 建造花费 @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray] 范围伤害 ~ [stat]{1}[lightgray] bullet.incendiary = [stat]燃烧 bullet.homing = [stat]追踪 bullet.armorpierce = [stat]穿甲 -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray] 伤害上限 bullet.suppression = [stat]{0} 秒[lightgray] 修复压制 ~ [stat]{1}[lightgray] 格 @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = 游戏启动崩溃后禁用模组 setting.animatedwater.name = 动态液体 setting.animatedshields.name = 动态力场 setting.playerindicators.name = 玩家指示器 +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = 敌人指示器 setting.autotarget.name = 自动瞄准 setting.keyboard.name = 鼠标+键盘操控 @@ -1269,6 +1292,8 @@ setting.fpscap.none = 无 setting.fpscap.text = {0} FPS setting.uiscale.name = 界面缩放比例 setting.uiscale.description = 需要重新启动 +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = 总是斜线建造 setting.screenshake.name = 屏幕抖动 setting.bloomintensity.name = 光效强度 @@ -1282,9 +1307,6 @@ setting.saveinterval.name = 自动保存间隔 setting.seconds = {0} 秒 setting.milliseconds = {0} 毫秒 setting.fullscreen.name = 全屏 -setting.borderlesswindow.name = 无边框窗口 -setting.borderlesswindow.name.windows = 无边框全屏 -setting.borderlesswindow.description = 可能需要重启 setting.fps.name = 显示帧数和网络延迟 setting.console.name = 启用控制台 setting.smoothcamera.name = 平滑镜头 @@ -1303,7 +1325,6 @@ setting.ambientvol.name = 环境音量 setting.mutemusic.name = 禁用音乐 setting.sfxvol.name = 音效音量 setting.mutesound.name = 禁用音效 -setting.crashreport.name = 发送匿名的崩溃报告 setting.communityservers.name = 获取社区服务器列表 setting.savecreate.name = 自动创建存档 setting.steampublichost.name = 公共游戏可见性 @@ -1334,6 +1355,8 @@ category.command.name = 单位指挥 category.multiplayer.name = 多人游戏 category.blocks.name = 建筑选择 placement.blockselectkeys = \n[lightgray]按键:[{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = 重生 keybind.control.name = 控制单位 keybind.clear_building.name = 清除规划 @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = 姿态:停火 keybind.unit_stance_pursue_target.name = 姿态:追击 keybind.unit_stance_patrol.name = 姿态:巡逻 keybind.unit_stance_ram.name = 姿态:突进 +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = 单位命令:移动 keybind.unit_command_repair.name = 单位命令:修复 keybind.unit_command_rebuild.name = 单位命令:重建 keybind.unit_command_assist.name = 单位命令:协助建造 keybind.unit_command_mine.name = 单位命令:采矿 -keybind.unit_command_boost.name = 单位命令:助推 keybind.unit_command_load_units.name = 单位命令:拾取单位 keybind.unit_command_load_blocks.name = 单位命令:拾取建筑 keybind.unit_command_unload_payload.name = 单位命令:卸载载荷 @@ -1483,6 +1507,7 @@ rules.checkplacement.info = 禁用后,该队伍的建筑物在放置范围检 rules.enemyCheat = 敌人无限资源 rules.blockhealthmultiplier = 建筑生命倍率 rules.blockdamagemultiplier = 建筑伤害倍率 +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = 单位生产速度倍率 rules.unitcostmultiplier = 单位生产花费倍率 rules.unithealthmultiplier = 单位生命倍率 @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = 允许使用没有接收台的发射台(与 7.0 landingpad.legacy.disabled = [scarlet]\ue815 禁用[lightgray] (旧版发射台已启用) rules.showspawns = 显示敌方单位出生点 rules.randomwaveai = 不可预测的 AI 波次 +rules.pauseDisabled = Disable Pausing rules.fire = 允许火焰产生并蔓延 rules.anyenv = < 任意 > rules.explosions = 单位/建筑爆炸伤害 @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = 强化载荷路由器 block.payload-mass-driver.name = 载荷质量驱动器 block.small-deconstructor.name = 解构器 block.canvas.name = 画板 +block.large-canvas.name = Large Canvas block.world-processor.name = 世界处理器 block.world-cell.name = 世界内存元 block.tank-fabricator.name = 坦克制造厂 @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]长按[]拾取一个小型建筑或单位作 hint.payloadDrop = 按[accent]][]键放下载荷。 hint.payloadDrop.mobile = [accent]长按[]一个空的位置将载荷放在那里。 hint.waveFire = [accent]波浪[]炮塔以水作弹药时,会自动扑灭附近的火焰。 -hint.generator = :combustion-generator: [accent]火力发电机[]燃煤发电,并将电力输送至相邻建筑。\n\n用 :power-node: [accent]电力节点[]可以扩展电力输送范围。 hint.guardian = [accent]Boss[]单位装甲厚重。[accent]铜[]和[accent]铅[]这类较弱的子弹对其[scarlet]作用不佳[]。\n\n使用高级别炮塔或使用 :graphite: [accent]石墨[]作为 :duo: 双管炮及 :salvo: 齐射炮的弹药来消灭 Boss。 hint.coreUpgrade = 核心可以通过[accent]在上面覆盖更高等级的核心[]进行升级。\n\n在 :core-shard: [accent]初代核心[]上放置一个 :core-foundation: [accent]次代核心[]。确保周围没有障碍物。 hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = 波次开始时,范围内的所有建筑都会被摧毁。 gz.zone3 = 波次即将开始。\n做好准备。 gz.finish = 建造更多炮塔,挖掘更多资源,\n击退所有波次以[accent]占领区块[]。 +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = 修复附近的所有单位。需要臭氧 block.radar.description = 逐渐探索范围内的地形和敌人单位以及建筑,需要电力支持。 block.shockwave-tower.description = 破坏和摧毁半径范围内的敌人炮弹。需要氰气。 block.canvas.description = 显示使用预定义的调色板绘制的图像。可手动编辑。 +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = 向敌人发射标准子弹。 unit.mace.description = 向敌人喷射火焰。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index bd879178e1..8b8c7d598c 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -15,6 +15,7 @@ link.wiki.description = 官方 Mindustry 維基 link.suggestions.description = 建議新功能 link.bug.description = 發現錯誤?在這裡回報 linkopen = 網路連結由伺服器提供。確定要打開連結?\n\n[sky]{0} +clipboardcopy = This server wants to copy text to your clipboard. Are you sure you want to continue?\n\n[sky]{0} linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 screenshot = 截圖儲存到{0} screenshot.invalid = 地圖太大了,可能沒有足夠的記憶體用於截圖。 @@ -124,6 +125,8 @@ maps.none = [lightgray]找不到地圖! invalid = 無效 pickcolor = 選擇顏色 color = Color +import = Import +export = Export preparingconfig = 設定準備中 preparingcontent = 內容準備中 uploadingcontent = 內容上傳中 @@ -187,15 +190,15 @@ mod.preview.missing = 在工作坊發佈這個模組前,您必須新增預覽 mod.folder.missing = 只有資料夾形式的模組可以在工作坊上發布。\n要將模組轉換為資料夾,只需將其文件解壓縮到資料夾並刪除舊的.zip檔,然後重新啟動遊戲或重新載入模組。 mod.scripts.disable = 您的裝置不支持包含指令檔的模組。您必須關閉這些模組才能進行遊戲。 -mod.dependencies.error = [scarlet]Mods are missing dependencies +mod.dependencies.error = [scarlet]模組缺少需要的依賴項 mod.dependencies.soft = (optional) -mod.dependencies.download = Import -mod.dependencies.downloadreq = Import Required -mod.dependencies.downloadall = Import All +mod.dependencies.download = 導入 +mod.dependencies.downloadreq = 導入需求 +mod.dependencies.downloadall = 全部導入 mod.dependencies.status = Import Results -mod.dependencies.success = Successfully downloaded: -mod.dependencies.failure = Failed to download: -mod.dependencies.imported = This mod requires dependencies. Download? +mod.dependencies.success = 下載成功: +mod.dependencies.failure = 下載失敗: +mod.dependencies.imported = 下載模組需要的依賴項? about.button = 關於 name = 名稱: @@ -212,6 +215,8 @@ campaign.none = [lightgray]選擇初始星球。\n星球隨時都可以切換。 campaign.erekir = 更新、更精緻的內容。戰役大部分都是連貫性的。\n\n難度更高,但有高品質的地圖和整體的經驗。 campaign.serpulo = 較舊的內容,經典的體驗。更加開放且有更多內容。\n\n有可能會有不平衡的地圖以及戰役機制,較不完美。 campaign.difficulty = Difficulty +campaign.rework.title = Campaign Changes Notice +campaign.rework.serpulo = [accent]⚠ The Serpulo campaign has been reworked.[]\n\nSector positions and difficulty have changed. You may encounter issues relating to leftover campaign saves from the old layout.\n\nFor a cleaner experience, consider resetting your campaign saves in the settings. completed = [accent]完成 techtree = 科技樹 techtree.select = 選擇科技樹 @@ -359,6 +364,7 @@ confirm = 確認 delete = 刪除 view.workshop = 在工作坊中查看 workshop.listing = 編輯工作坊清單 +hide = Hide ok = 確定 open = 開啟 customize = 自訂 @@ -370,7 +376,6 @@ command.repair = 修復 command.rebuild = 重建 command.assist = 協助玩家 command.move = 移動 -command.boost = 推進 command.enterPayload = 進入負荷方塊 command.loadUnits = 拾取單位 command.loadBlocks = 拾取方塊 @@ -381,7 +386,9 @@ stance.shoot = 狀態:射擊 stance.holdfire = 狀態: 停火 stance.pursuetarget = 狀態:追逐目標 stance.patrol = 狀態:路徑巡邏 +stance.holdposition = Stance: Hold Position stance.ram = 狀態:衝鋒\n[lightgray]直線移動,不進行尋路。 +stance.boost = Boost stance.mineauto = Automatic Mining stance.mine = Mine Item: {0} openlink = 開啟連結 @@ -428,6 +435,7 @@ saveimage = 儲存圖片 unknown = 未知 custom = 自訂 builtin = 内建 +modded = Modded map.delete.confirm = 確認要刪除地圖嗎?此動作無法復原! map.random = [accent]隨機地圖 map.nospawn = 這個地圖沒有核心!請在編輯器中添加一個{0}的核心。 @@ -488,10 +496,14 @@ editor.center = 中心 editor.search = 尋找地圖… editor.filters = 篩選地圖 editor.filters.mode = 遊戲模式: +editor.filters.priorities = Priorities: editor.filters.type = 地圖種類: editor.filters.search = 搜尋的資料夾: editor.filters.author = 作者 editor.filters.description = 描述 +editor.filters.modname = Mod Name +editor.filters.prioritizemod = Mod Priority +editor.filters.prioritizecustom = Custom Priority editor.shiftx = X位移 editor.shifty = Y位移 workshop = 工作坊 @@ -527,6 +539,7 @@ waves.search = 搜尋波... waves.filter = 單位過濾 waves.units.hide = 全部隱藏 waves.units.show = 全部顯示 +pause.disabled = [scarlet]Pause is disabled #these are intentionally in lower case wavemode.counts = 數量 @@ -749,6 +762,7 @@ objective.destroyunits = [accent]摧毀:[][lightgray]{0}[]x 單位 objective.enemiesapproaching = [accent]的人在 [lightgray]{0} 到達[] objective.enemyescelating = [accent]敵人在[lightgray]{0}[]後擴大單位生產 objective.enemyairunits = [accent]敵人在[lightgray]{0}[]後產生空軍單位 +objective.enemyunitproduction = [accent]Enemy unit production begins in [lightgray]{0}[] objective.destroycore = [accent]摧毀敵人核心 objective.command = [accent]指揮單位 objective.nuclearlaunch = [accent]⚠ 偵測到核彈打擊: [lightgray]{0} @@ -836,6 +850,7 @@ sector.noswitch.title = 無法切換地區 sector.noswitch = 當前地區遭受攻擊時,無法切換地區\n\n地區: [accent]{0}[] 於 [accent]{1}[] sector.view = 檢視地區 sector.foundationrequired = [lightgray] Core: Foundation Required +sector.shielded = [lightgray] Shielded threat.low = 低 threat.medium = 中 @@ -843,6 +858,10 @@ threat.high = 高 threat.extreme = 極高 threat.eradication = 毀滅性 +difficulty.guide.title = Notice +difficulty.guide = If a sector poses too much of a challenge, campaign difficulty can be adjusted for an easier experience. +difficulty.guide.confirm = Adjust Difficulty + difficulty.casual = 休閒模式 difficulty.easy = 簡單模式 difficulty.normal = 普通模式 @@ -862,7 +881,7 @@ planet.sun.name = 太陽 sector.impact0078.name = 衝擊0078 sector.groundZero.name = 原點 -sector.craters.name = 隕石坑 +sector.crateredBattleground.name = Cratered Battleground sector.frozenForest.name = 冰封森林 sector.ruinousShores.name = 廢墟海岸 sector.stainedMountains.name = 多色山脈 @@ -890,13 +909,14 @@ sector.fallenVessel.name = Fallen Vessel sector.mycelialBastion.name = Mycelial Bastion sector.frontier.name = Frontier sector.sunkenPier.name = Sunken Pier +sector.littoralShipyard.name = Littoral Shipyard sector.cruxscape.name = Cruxscape sector.geothermalStronghold.name = Geothermal Stronghold sector.groundZero.description = 再次開始的最佳位置。敵人威脅程度低。資源少。\n盡可能地採集鉛與銅。\n繼續前進。 sector.frozenForest.description = 即使是在如此靠近山脈的地方,孢子也已經擴散了。低溫無法永遠遏止它們。\n\n開始探索電力。建造火力發電機。學習如何修理方塊。 sector.saltFlats.description = 鹽灘在沙漠的外圍。此處資源不多。\n\n敵人已在此建立了一座資源倉庫。剷除他們的核心。不要留下任何東西。 -sector.craters.description = 在曾發生過古代戰爭的火山口積了很多水。開墾這個區域。採集沙子。煉製玻璃。抽水冷卻砲台與鑽頭。 +sector.crateredBattleground.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. sector.ruinousShores.description = 越過廢棄物就是海岸線。此處曾設有海岸防禦陣線。但剩下的不多。只有最基本的防禦結構沒有損毀,其他的一切都已然變為廢墟。\n繼續向外擴展。重新發現技術。 sector.stainedMountains.description = 還未受孢子污染的山脈向內陸延伸。\n在此區域開採鈦金屬。學習如何使用它。\n\n這裡的敵人更為強大。不要讓他們有以最強大武力攻擊的機會。 sector.overgrowth.description = 此區域雜草叢生,離孢子的源頭很近。\n敵人在此建立了前哨站。建造重槌機甲,把這夷為平地。 @@ -1045,6 +1065,7 @@ stat.boosteffect = 加速效果 stat.maxunits = 最大活躍單位 stat.health = 耐久度 stat.armor = 裝甲 +stat.armor.info = Applied damage = incoming damage - armor.\nUp to 90% maximum damage reduction. stat.buildtime = 建設時間 stat.maxconsecutive = 最大連續 stat.buildcost = 建造成本 @@ -1179,8 +1200,8 @@ bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格 bullet.incendiary = [stat]燃燒 bullet.homing = [stat]追蹤 bullet.armorpierce = [stat]穿甲 -bullet.armorweakness = [red]{0}%[lightgray] armor weakness -bullet.armorpiercing = [stat]{0}%[lightgray] armor piercing +bullet.armorweakness = [red]{0}x[lightgray] armor weakness +bullet.partialarmorpierce = [stat]{0}%[lightgray] armor piercing bullet.antiarmor = [stat]{0}x[lightgray] anti-armor bullet.maxdamagefraction = [stat]{0}%[lightgray]傷害上限 bullet.suppression = [stat]{0}秒[lightgray]抑制修復 ~ [stat]{1}[lightgray]格 @@ -1260,6 +1281,8 @@ setting.modcrashdisable.name = 閃退後停用模組 setting.animatedwater.name = 顯示液面動畫 setting.animatedshields.name = 顯示護盾動畫 setting.playerindicators.name = 盟友標示 +setting.showpings.name = Show Pings +setting.showotherbuildplans.name = Show Other Player's Build Plans setting.indicators.name = 敵方標示 setting.autotarget.name = 自動射擊 setting.keyboard.name = 滑鼠及鍵盤控制 @@ -1269,6 +1292,8 @@ setting.fpscap.none = 無 setting.fpscap.text = {0}FPS setting.uiscale.name = 操作介面大小 setting.uiscale.description = 需要重新啟動遊戲以更改大小 +setting.uiEdgePadding.name = UI Edge Padding +setting.uiEdgePadding.description = Adds padding to the edges of the UI. Useful for displays with rounded corners or notches. setting.swapdiagonal.name = 預設對角線放置 setting.screenshake.name = 畫面抖動 setting.bloomintensity.name = 火花強度 @@ -1282,9 +1307,6 @@ setting.saveinterval.name = 自動存檔間隔 setting.seconds = {0}秒 setting.milliseconds = {0}毫秒 setting.fullscreen.name = 全螢幕 -setting.borderlesswindow.name = 無邊框視窗 -setting.borderlesswindow.name.windows = 無邊框全螢幕 -setting.borderlesswindow.description = 可能需重新啟動遊戲以變更 setting.fps.name = 顯示FPS與延遲 setting.console.name = 啟用搖桿 setting.smoothcamera.name = 平滑攝影機 @@ -1303,7 +1325,6 @@ setting.ambientvol.name = 環境音量 setting.mutemusic.name = 靜音 setting.sfxvol.name = 音效音量 setting.mutesound.name = 靜音 -setting.crashreport.name = 傳送匿名當機回報 setting.communityservers.name = Fetch Community Server List setting.savecreate.name = 自動建立存檔 setting.steampublichost.name = 公開遊戲可見性 @@ -1334,6 +1355,8 @@ category.command.name = 單位指揮 category.multiplayer.name = 多人 category.blocks.name = 選取方塊 placement.blockselectkeys = \n[lightgray]按鍵:[{0}, +ping.text = Ping: +keybind.ping.name = Ping Location keybind.respawn.name = 重生 keybind.control.name = 控制單位 keybind.clear_building.name = 清除建築指令 @@ -1357,13 +1380,14 @@ keybind.unit_stance_hold_fire.name = 單位狀態:停火 keybind.unit_stance_pursue_target.name = 單位狀態:追逐目標 keybind.unit_stance_patrol.name = 單位狀態:巡邏 keybind.unit_stance_ram.name = 單位狀態:冲鋒 +keybind.unit_stance_boost.name = Unit Stance: Boost +keybind.unit_stance_hold_position.name = Unit Stance: Hold Position keybind.unit_command_move.name = 單位指令:移動 keybind.unit_command_repair.name = 單位指令:修理 keybind.unit_command_rebuild.name = 單位指令:重建 keybind.unit_command_assist.name = 單位指令:協助 keybind.unit_command_mine.name = 單位指令:挖礦 -keybind.unit_command_boost.name = 單位指令:推進 keybind.unit_command_load_units.name = 單位指令:裝載單位 keybind.unit_command_load_blocks.name = 單位指令:裝載方塊 keybind.unit_command_unload_payload.name = Unit Command: Unload Payload @@ -1483,6 +1507,7 @@ rules.checkplacement.info = When disabled, buildings of this team are ignored in rules.enemyCheat = 電腦無限資源 rules.blockhealthmultiplier = 建築物耐久度加成 rules.blockdamagemultiplier = 建築物傷害加成 +rules.unitfactoryactivation = Unit Factory Activation Delay rules.unitbuildspeedmultiplier = 單位建設速度加成 rules.unitcostmultiplier = 單位生產花費倍率 rules.unithealthmultiplier = 單位血量加成 @@ -1526,6 +1551,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseDisabled = Disable Pausing rules.fire = 火 rules.anyenv = <任意> rules.explosions = 方塊/單位爆炸傷害 @@ -2058,6 +2084,7 @@ block.reinforced-payload-router.name = 強化重物分配器 block.payload-mass-driver.name = 重物質量驅動器 block.small-deconstructor.name = 小型解構器 block.canvas.name = 畫布 +block.large-canvas.name = Large Canvas block.world-processor.name = 世界處理器 block.world-cell.name = 世界單元 block.tank-fabricator.name = 戰車兵工廠 @@ -2120,7 +2147,6 @@ hint.payloadPickup.mobile = [accent]長按[]一個方塊或單位可將其拾起 hint.payloadDrop = 按下 [accent]][] 可以放下持有的方塊或單位。 hint.payloadDrop.mobile = [accent]長按[]任何空白處可以放下持有的方塊或單位。 hint.waveFire = 以[accent]水[]裝填的[accent]波浪[]會自動撲滅附近火勢。 -hint.generator = \uf879 [accent]燃燒發電機[]消耗煤炭產生電力給相鄰的方塊。\n\n使用\uf87f[accent]能量節點[]增加電力涵蓋範圍。 hint.guardian = [accent]頭目[]擁有厚實的裝甲。較弱的彈藥如[accent]銅[]和[accent]鉛[]並[scarlet]沒有效果[].\n\n使用更高等的砲臺或以\uf835 [accent]石墨[]配合\uf861雙砲、\uf859齊射砲摧毀頭目。 hint.coreUpgrade = 核心可以透過在上面[accent]覆蓋一個更高等級的核心[]來升級。\n\n放置 \uf868 [accent]核心:基地[] 到 \uf869 [accent]核心:碎片[] 上. 確保沒有其他障礙物。 hint.serpuloCoreZone = Additional cores may be constructed on :core-zone: [accent]Core Zone[] tiles. @@ -2152,6 +2178,16 @@ gz.zone2 = 波次開始時,範圍內的所有建築都會被摧毀。 gz.zone3 = 波次即將開始。\n做好準備。 gz.finish = 建造更多砲塔,挖掘更多資源,\n擊退所有波次以[accent]佔領區域[]。 +ff.coal = Use :mechanical-drill: [accent]Mechanical Drills[] to mine :ore-coal: [accent]coal[]. +ff.graphitepress = :tree: Research and place a :graphite-press: [accent]Graphite Press[]. +ff.craft = Move :coal: coal into the :graphite-press: [accent]Graphite Press[].\nIt will output :graphite: graphite to all nearby conveyors.\nMove the output :graphite: graphite from the :graphite-press: [accent]Graphite Press[] into the core. +ff.generator = :coal: Coal can also be used as fuel in :combustion-generator: [accent]Combustion Generators[].\nResearch and place a :combustion-generator: [accent]Combustion Generator[]. +ff.coalpower = Input :coal: coal into the generator to produce [accent]:power: power[]. +ff.coalpower.objective = :combustion-generator: Produce Power +ff.node = :power-node: [accent]Power Nodes[] transmit power to nearby blocks in range.\nResearch and place a :power-node: [accent]Power Node[] close to the generator. +ff.battery = :battery: [accent]Batteries[] store power.\nResearch and place a :battery: [accent]Battery[] close to the node. +ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and place an :arc: [accent]Arc[] turret near a power node. + fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[]. fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units. @@ -2508,6 +2544,7 @@ block.unit-repair-tower.description = 修復其周圍所有單位。需要臭氧 block.radar.description = 逐漸顯示大範圍內的地形和敵方單位。需要電力。 block.shockwave-tower.description = 在一定範圍內破壞和摧毀敵方砲彈。需要氰氣。 block.canvas.description = 顯示使用預設調色板的簡單圖像。可編輯。 +block.large-canvas.description = Displays a simple image with a pre-defined palette. Editable. unit.dagger.description = 發射普通子彈攻擊附近敵人。 unit.mace.description = 噴發烈焰攻擊所有附近敵人。 diff --git a/core/assets/bundles/global.properties b/core/assets/bundles/global.properties index 9a20bd8ac3..2a6a9af71a 100644 --- a/core/assets/bundles/global.properties +++ b/core/assets/bundles/global.properties @@ -28,6 +28,7 @@ sector.windsweptIslands.credit = Stormrider sector.navalFortress.credit = blackberry2093 sector.desolateRift.credit = hhh i 17 sector.extractionOutpost.credit = CD, wpx +sector.littoralShipyard.credit = Comi, sAnekus sector.origin.credit = Mechanical Fishe sector.karst.credit = Mechanical Fishe @@ -49,4 +50,5 @@ sector.weatheredChannels.description = WIP sector.fallenVessel.description = WIP sector.mycelialBastion.description = WIP sector.cruxscape.description = WIP -sector.geothermalStronghold.description = WIP \ No newline at end of file +sector.geothermalStronghold.description = WIP +sector.littoralShipyard.description = WIP \ No newline at end of file diff --git a/core/assets/contributors b/core/assets/contributors index 0f1acc9195..ce002e134b 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -189,4 +189,5 @@ Someone's Shadow buj Agzam4 ItsKirby69 -TheCuber \ No newline at end of file +TheCuber +Jovinull \ No newline at end of file diff --git a/core/assets/fonts/font_jp.woff b/core/assets/fonts/font_jp.woff new file mode 100644 index 0000000000..d49f45a24a Binary files /dev/null and b/core/assets/fonts/font_jp.woff differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 6f053f02d2..15c0eb3ff2 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -623,3 +623,4 @@ 63059=metal-tiles-13|block-metal-tiles-13-ui 63058=metal-wall-3|block-metal-wall-3-ui 63057=ore-wall-graphite|block-ore-wall-graphite-ui +63056=large-canvas|block-large-canvas-ui diff --git a/core/assets/logicids.dat b/core/assets/logicids.dat index 6e88d612e3..f113f65920 100644 Binary files a/core/assets/logicids.dat and b/core/assets/logicids.dat differ diff --git a/core/assets/maps/erekir/aegis.msav b/core/assets/maps/erekir/aegis.msav index 961e30718c..c9f3df54ba 100644 Binary files a/core/assets/maps/erekir/aegis.msav and b/core/assets/maps/erekir/aegis.msav differ diff --git a/core/assets/maps/erekir/basin.msav b/core/assets/maps/erekir/basin.msav index 6cd15494fb..42c749cd3a 100644 Binary files a/core/assets/maps/erekir/basin.msav and b/core/assets/maps/erekir/basin.msav differ diff --git a/core/assets/maps/erekir/intersect.msav b/core/assets/maps/erekir/intersect.msav index df68823481..88315bec6e 100644 Binary files a/core/assets/maps/erekir/intersect.msav and b/core/assets/maps/erekir/intersect.msav differ diff --git a/core/assets/maps/erekir/lake.msav b/core/assets/maps/erekir/lake.msav index e1a75c0035..4c672994de 100644 Binary files a/core/assets/maps/erekir/lake.msav and b/core/assets/maps/erekir/lake.msav differ diff --git a/core/assets/maps/erekir/onset.msav b/core/assets/maps/erekir/onset.msav index 62d0340842..9bc088dbec 100644 Binary files a/core/assets/maps/erekir/onset.msav and b/core/assets/maps/erekir/onset.msav differ diff --git a/core/assets/maps/serpulo/atolls.msav b/core/assets/maps/serpulo/atolls.msav index 3057bcfe1d..9f289702ad 100644 Binary files a/core/assets/maps/serpulo/atolls.msav and b/core/assets/maps/serpulo/atolls.msav differ diff --git a/core/assets/maps/serpulo/biomassFacility.msav b/core/assets/maps/serpulo/biomassFacility.msav index cd355b9c62..c23d771dd3 100644 Binary files a/core/assets/maps/serpulo/biomassFacility.msav and b/core/assets/maps/serpulo/biomassFacility.msav differ diff --git a/core/assets/maps/serpulo/coastline.msav b/core/assets/maps/serpulo/coastline.msav index 1bb87da7cb..b75f678fb7 100644 Binary files a/core/assets/maps/serpulo/coastline.msav and b/core/assets/maps/serpulo/coastline.msav differ diff --git a/core/assets/maps/serpulo/crateredBattleground.msav b/core/assets/maps/serpulo/crateredBattleground.msav new file mode 100644 index 0000000000..a6a8b81012 Binary files /dev/null and b/core/assets/maps/serpulo/crateredBattleground.msav differ diff --git a/core/assets/maps/serpulo/craters.msav b/core/assets/maps/serpulo/craters.msav deleted file mode 100644 index 52aa3f3714..0000000000 Binary files a/core/assets/maps/serpulo/craters.msav and /dev/null differ diff --git a/core/assets/maps/serpulo/cruxscape.msav b/core/assets/maps/serpulo/cruxscape.msav index 89c4b1c47b..5a440577e4 100644 Binary files a/core/assets/maps/serpulo/cruxscape.msav and b/core/assets/maps/serpulo/cruxscape.msav differ diff --git a/core/assets/maps/serpulo/desolateRift.msav b/core/assets/maps/serpulo/desolateRift.msav index 11d62928a0..ba32fd6cc0 100644 Binary files a/core/assets/maps/serpulo/desolateRift.msav and b/core/assets/maps/serpulo/desolateRift.msav differ diff --git a/core/assets/maps/serpulo/extractionOutpost.msav b/core/assets/maps/serpulo/extractionOutpost.msav index 3a26bbadc6..995e5d0695 100644 Binary files a/core/assets/maps/serpulo/extractionOutpost.msav and b/core/assets/maps/serpulo/extractionOutpost.msav differ diff --git a/core/assets/maps/serpulo/facility32m.msav b/core/assets/maps/serpulo/facility32m.msav index e73ed1ef7b..1ce1b016d7 100644 Binary files a/core/assets/maps/serpulo/facility32m.msav and b/core/assets/maps/serpulo/facility32m.msav differ diff --git a/core/assets/maps/serpulo/fallenVessel.msav b/core/assets/maps/serpulo/fallenVessel.msav index d5d099ec55..86932735e9 100644 Binary files a/core/assets/maps/serpulo/fallenVessel.msav and b/core/assets/maps/serpulo/fallenVessel.msav differ diff --git a/core/assets/maps/serpulo/frozenForest.msav b/core/assets/maps/serpulo/frozenForest.msav index 57b06ee25d..0474a057bf 100644 Binary files a/core/assets/maps/serpulo/frozenForest.msav and b/core/assets/maps/serpulo/frozenForest.msav differ diff --git a/core/assets/maps/serpulo/fungalPass.msav b/core/assets/maps/serpulo/fungalPass.msav index 3c64deb06d..eb0334af2e 100644 Binary files a/core/assets/maps/serpulo/fungalPass.msav and b/core/assets/maps/serpulo/fungalPass.msav differ diff --git a/core/assets/maps/serpulo/geothermalStronghold.msav b/core/assets/maps/serpulo/geothermalStronghold.msav index 448cc77026..f936a39240 100644 Binary files a/core/assets/maps/serpulo/geothermalStronghold.msav and b/core/assets/maps/serpulo/geothermalStronghold.msav differ diff --git a/core/assets/maps/serpulo/hidden/0.msav b/core/assets/maps/serpulo/hidden/0.msav index 4437244046..3093141385 100644 Binary files a/core/assets/maps/serpulo/hidden/0.msav and b/core/assets/maps/serpulo/hidden/0.msav differ diff --git a/core/assets/maps/serpulo/hidden/103.msav b/core/assets/maps/serpulo/hidden/103.msav deleted file mode 100644 index 4eed2053a4..0000000000 Binary files a/core/assets/maps/serpulo/hidden/103.msav and /dev/null differ diff --git a/core/assets/maps/serpulo/hidden/111.msav b/core/assets/maps/serpulo/hidden/111.msav index fb0066a7df..a1128616b9 100644 Binary files a/core/assets/maps/serpulo/hidden/111.msav and b/core/assets/maps/serpulo/hidden/111.msav differ diff --git a/core/assets/maps/serpulo/hidden/116.msav b/core/assets/maps/serpulo/hidden/116.msav index d1a087c4f4..ecbaea5fa8 100644 Binary files a/core/assets/maps/serpulo/hidden/116.msav and b/core/assets/maps/serpulo/hidden/116.msav differ diff --git a/core/assets/maps/serpulo/hidden/127.msav b/core/assets/maps/serpulo/hidden/127.msav index a479cf6286..64c98ad1e7 100644 Binary files a/core/assets/maps/serpulo/hidden/127.msav and b/core/assets/maps/serpulo/hidden/127.msav differ diff --git a/core/assets/maps/serpulo/hidden/13.msav b/core/assets/maps/serpulo/hidden/13.msav index e694239390..5bd03b4a8a 100644 Binary files a/core/assets/maps/serpulo/hidden/13.msav and b/core/assets/maps/serpulo/hidden/13.msav differ diff --git a/core/assets/maps/serpulo/hidden/133.msav b/core/assets/maps/serpulo/hidden/133.msav index eee9b0cad0..84d2725e9c 100644 Binary files a/core/assets/maps/serpulo/hidden/133.msav and b/core/assets/maps/serpulo/hidden/133.msav differ diff --git a/core/assets/maps/serpulo/hidden/16.msav b/core/assets/maps/serpulo/hidden/16.msav index d7a3ae52c6..5589070bbc 100644 Binary files a/core/assets/maps/serpulo/hidden/16.msav and b/core/assets/maps/serpulo/hidden/16.msav differ diff --git a/core/assets/maps/serpulo/hidden/161.msav b/core/assets/maps/serpulo/hidden/161.msav index ebfa77f25b..716afba48c 100644 Binary files a/core/assets/maps/serpulo/hidden/161.msav and b/core/assets/maps/serpulo/hidden/161.msav differ diff --git a/core/assets/maps/serpulo/hidden/162.msav b/core/assets/maps/serpulo/hidden/162.msav index bf8d69e714..2447bc82f3 100644 Binary files a/core/assets/maps/serpulo/hidden/162.msav and b/core/assets/maps/serpulo/hidden/162.msav differ diff --git a/core/assets/maps/serpulo/hidden/176.msav b/core/assets/maps/serpulo/hidden/176.msav index 4b998a6fc9..dc7f44d816 100644 Binary files a/core/assets/maps/serpulo/hidden/176.msav and b/core/assets/maps/serpulo/hidden/176.msav differ diff --git a/core/assets/maps/serpulo/hidden/180.msav b/core/assets/maps/serpulo/hidden/180.msav index 6baf0947b8..17dc69e31d 100644 Binary files a/core/assets/maps/serpulo/hidden/180.msav and b/core/assets/maps/serpulo/hidden/180.msav differ diff --git a/core/assets/maps/serpulo/hidden/185.msav b/core/assets/maps/serpulo/hidden/185.msav index fc8c146bb3..fc0bf3afab 100644 Binary files a/core/assets/maps/serpulo/hidden/185.msav and b/core/assets/maps/serpulo/hidden/185.msav differ diff --git a/core/assets/maps/serpulo/hidden/19.msav b/core/assets/maps/serpulo/hidden/19.msav index 986e446288..7eae34d26d 100644 Binary files a/core/assets/maps/serpulo/hidden/19.msav and b/core/assets/maps/serpulo/hidden/19.msav differ diff --git a/core/assets/maps/serpulo/hidden/191.msav b/core/assets/maps/serpulo/hidden/191.msav index 271175e8eb..044df801a4 100644 Binary files a/core/assets/maps/serpulo/hidden/191.msav and b/core/assets/maps/serpulo/hidden/191.msav differ diff --git a/core/assets/maps/serpulo/hidden/192.msav b/core/assets/maps/serpulo/hidden/192.msav index 18cb02613a..546a693869 100644 Binary files a/core/assets/maps/serpulo/hidden/192.msav and b/core/assets/maps/serpulo/hidden/192.msav differ diff --git a/core/assets/maps/serpulo/hidden/197.msav b/core/assets/maps/serpulo/hidden/197.msav index 638ee025e8..b1677ea768 100644 Binary files a/core/assets/maps/serpulo/hidden/197.msav and b/core/assets/maps/serpulo/hidden/197.msav differ diff --git a/core/assets/maps/serpulo/hidden/20.msav b/core/assets/maps/serpulo/hidden/20.msav index d5e0006cac..563428c9ec 100644 Binary files a/core/assets/maps/serpulo/hidden/20.msav and b/core/assets/maps/serpulo/hidden/20.msav differ diff --git a/core/assets/maps/serpulo/hidden/200.msav b/core/assets/maps/serpulo/hidden/200.msav index f59f943316..8fac36a64e 100644 Binary files a/core/assets/maps/serpulo/hidden/200.msav and b/core/assets/maps/serpulo/hidden/200.msav differ diff --git a/core/assets/maps/serpulo/hidden/202.msav b/core/assets/maps/serpulo/hidden/202.msav index b02ba9da54..7619d91be1 100644 Binary files a/core/assets/maps/serpulo/hidden/202.msav and b/core/assets/maps/serpulo/hidden/202.msav differ diff --git a/core/assets/maps/serpulo/hidden/207.msav b/core/assets/maps/serpulo/hidden/207.msav index 046e0a494b..92b991cf29 100644 Binary files a/core/assets/maps/serpulo/hidden/207.msav and b/core/assets/maps/serpulo/hidden/207.msav differ diff --git a/core/assets/maps/serpulo/hidden/225.msav b/core/assets/maps/serpulo/hidden/225.msav index 05a1635d03..24ac0c5228 100644 Binary files a/core/assets/maps/serpulo/hidden/225.msav and b/core/assets/maps/serpulo/hidden/225.msav differ diff --git a/core/assets/maps/serpulo/hidden/230.msav b/core/assets/maps/serpulo/hidden/230.msav index f397ca63bf..4376944654 100644 Binary files a/core/assets/maps/serpulo/hidden/230.msav and b/core/assets/maps/serpulo/hidden/230.msav differ diff --git a/core/assets/maps/serpulo/hidden/24.msav b/core/assets/maps/serpulo/hidden/24.msav index bfdd607d38..bf0840b8b3 100644 Binary files a/core/assets/maps/serpulo/hidden/24.msav and b/core/assets/maps/serpulo/hidden/24.msav differ diff --git a/core/assets/maps/serpulo/hidden/240.msav b/core/assets/maps/serpulo/hidden/240.msav index cc01624503..f93f8a7b41 100644 Binary files a/core/assets/maps/serpulo/hidden/240.msav and b/core/assets/maps/serpulo/hidden/240.msav differ diff --git a/core/assets/maps/serpulo/hidden/242.msav b/core/assets/maps/serpulo/hidden/242.msav new file mode 100644 index 0000000000..b60a9afa60 Binary files /dev/null and b/core/assets/maps/serpulo/hidden/242.msav differ diff --git a/core/assets/maps/serpulo/hidden/243.msav b/core/assets/maps/serpulo/hidden/243.msav new file mode 100644 index 0000000000..3c7e1250d2 Binary files /dev/null and b/core/assets/maps/serpulo/hidden/243.msav differ diff --git a/core/assets/maps/serpulo/hidden/244.msav b/core/assets/maps/serpulo/hidden/244.msav new file mode 100644 index 0000000000..8df5e92210 Binary files /dev/null and b/core/assets/maps/serpulo/hidden/244.msav differ diff --git a/core/assets/maps/serpulo/hidden/245.msav b/core/assets/maps/serpulo/hidden/245.msav new file mode 100644 index 0000000000..13b7f438d2 Binary files /dev/null and b/core/assets/maps/serpulo/hidden/245.msav differ diff --git a/core/assets/maps/serpulo/hidden/246.msav b/core/assets/maps/serpulo/hidden/246.msav new file mode 100644 index 0000000000..bc1654243e Binary files /dev/null and b/core/assets/maps/serpulo/hidden/246.msav differ diff --git a/core/assets/maps/serpulo/hidden/247.msav b/core/assets/maps/serpulo/hidden/247.msav new file mode 100644 index 0000000000..9c6ccc497e Binary files /dev/null and b/core/assets/maps/serpulo/hidden/247.msav differ diff --git a/core/assets/maps/serpulo/hidden/248.msav b/core/assets/maps/serpulo/hidden/248.msav index cffa78ccb2..e796f726ea 100644 Binary files a/core/assets/maps/serpulo/hidden/248.msav and b/core/assets/maps/serpulo/hidden/248.msav differ diff --git a/core/assets/maps/serpulo/hidden/254.msav b/core/assets/maps/serpulo/hidden/254.msav index f193747cb4..d114b5f2ae 100644 Binary files a/core/assets/maps/serpulo/hidden/254.msav and b/core/assets/maps/serpulo/hidden/254.msav differ diff --git a/core/assets/maps/serpulo/hidden/259.msav b/core/assets/maps/serpulo/hidden/259.msav index 38a58bee1a..b1908783df 100644 Binary files a/core/assets/maps/serpulo/hidden/259.msav and b/core/assets/maps/serpulo/hidden/259.msav differ diff --git a/core/assets/maps/serpulo/hidden/263.msav b/core/assets/maps/serpulo/hidden/263.msav index ca5638ad99..2dfbffaf59 100644 Binary files a/core/assets/maps/serpulo/hidden/263.msav and b/core/assets/maps/serpulo/hidden/263.msav differ diff --git a/core/assets/maps/serpulo/hidden/265.msav b/core/assets/maps/serpulo/hidden/265.msav index 0a35dbead8..31eac22002 100644 Binary files a/core/assets/maps/serpulo/hidden/265.msav and b/core/assets/maps/serpulo/hidden/265.msav differ diff --git a/core/assets/maps/serpulo/hidden/27.msav b/core/assets/maps/serpulo/hidden/27.msav new file mode 100644 index 0000000000..be98e58b1d Binary files /dev/null and b/core/assets/maps/serpulo/hidden/27.msav differ diff --git a/core/assets/maps/serpulo/hidden/30.msav b/core/assets/maps/serpulo/hidden/30.msav index f197c6d64a..63b2ab1d22 100644 Binary files a/core/assets/maps/serpulo/hidden/30.msav and b/core/assets/maps/serpulo/hidden/30.msav differ diff --git a/core/assets/maps/serpulo/hidden/47.msav b/core/assets/maps/serpulo/hidden/47.msav index a2e6ec9d3b..2a1a0d0c28 100644 Binary files a/core/assets/maps/serpulo/hidden/47.msav and b/core/assets/maps/serpulo/hidden/47.msav differ diff --git a/core/assets/maps/serpulo/hidden/55.msav b/core/assets/maps/serpulo/hidden/55.msav index dddbdcce07..682489d154 100644 Binary files a/core/assets/maps/serpulo/hidden/55.msav and b/core/assets/maps/serpulo/hidden/55.msav differ diff --git a/core/assets/maps/serpulo/hidden/6.msav b/core/assets/maps/serpulo/hidden/6.msav index e470b70fab..973faadbcb 100644 Binary files a/core/assets/maps/serpulo/hidden/6.msav and b/core/assets/maps/serpulo/hidden/6.msav differ diff --git a/core/assets/maps/serpulo/hidden/66.msav b/core/assets/maps/serpulo/hidden/66.msav index 2234375c69..1df9961929 100644 Binary files a/core/assets/maps/serpulo/hidden/66.msav and b/core/assets/maps/serpulo/hidden/66.msav differ diff --git a/core/assets/maps/serpulo/hidden/67.msav b/core/assets/maps/serpulo/hidden/67.msav index 7ddeb48851..5888f01639 100644 Binary files a/core/assets/maps/serpulo/hidden/67.msav and b/core/assets/maps/serpulo/hidden/67.msav differ diff --git a/core/assets/maps/serpulo/hidden/76.msav b/core/assets/maps/serpulo/hidden/76.msav index 20227dcc0d..36d3db9cc0 100644 Binary files a/core/assets/maps/serpulo/hidden/76.msav and b/core/assets/maps/serpulo/hidden/76.msav differ diff --git a/core/assets/maps/serpulo/hidden/92.msav b/core/assets/maps/serpulo/hidden/92.msav index 78c22881a9..cefeb00ef8 100644 Binary files a/core/assets/maps/serpulo/hidden/92.msav and b/core/assets/maps/serpulo/hidden/92.msav differ diff --git a/core/assets/maps/serpulo/hidden/94.msav b/core/assets/maps/serpulo/hidden/94.msav index f0148257a4..dd8c73655c 100644 Binary files a/core/assets/maps/serpulo/hidden/94.msav and b/core/assets/maps/serpulo/hidden/94.msav differ diff --git a/core/assets/maps/serpulo/impact0078.msav b/core/assets/maps/serpulo/impact0078.msav index d73d5bad9d..46c762f66a 100644 Binary files a/core/assets/maps/serpulo/impact0078.msav and b/core/assets/maps/serpulo/impact0078.msav differ diff --git a/core/assets/maps/serpulo/infestedCanyons.msav b/core/assets/maps/serpulo/infestedCanyons.msav index b5fff1c324..d57f250536 100644 Binary files a/core/assets/maps/serpulo/infestedCanyons.msav and b/core/assets/maps/serpulo/infestedCanyons.msav differ diff --git a/core/assets/maps/serpulo/littoralShipyard.msav b/core/assets/maps/serpulo/littoralShipyard.msav new file mode 100644 index 0000000000..7277ef1534 Binary files /dev/null and b/core/assets/maps/serpulo/littoralShipyard.msav differ diff --git a/core/assets/maps/serpulo/mycelialBastion.msav b/core/assets/maps/serpulo/mycelialBastion.msav index e4d41aab47..ed48337f94 100644 Binary files a/core/assets/maps/serpulo/mycelialBastion.msav and b/core/assets/maps/serpulo/mycelialBastion.msav differ diff --git a/core/assets/maps/serpulo/navalFortress.msav b/core/assets/maps/serpulo/navalFortress.msav index 2d9dda6171..8e7e189895 100644 Binary files a/core/assets/maps/serpulo/navalFortress.msav and b/core/assets/maps/serpulo/navalFortress.msav differ diff --git a/core/assets/maps/serpulo/nuclearComplex.msav b/core/assets/maps/serpulo/nuclearComplex.msav index 9079f7c506..a488c12485 100644 Binary files a/core/assets/maps/serpulo/nuclearComplex.msav and b/core/assets/maps/serpulo/nuclearComplex.msav differ diff --git a/core/assets/maps/serpulo/overgrowth.msav b/core/assets/maps/serpulo/overgrowth.msav index 08d0b853e1..8b4983bf26 100644 Binary files a/core/assets/maps/serpulo/overgrowth.msav and b/core/assets/maps/serpulo/overgrowth.msav differ diff --git a/core/assets/maps/serpulo/perilousHarbor.msav b/core/assets/maps/serpulo/perilousHarbor.msav index aabc80f4f1..6495962028 100644 Binary files a/core/assets/maps/serpulo/perilousHarbor.msav and b/core/assets/maps/serpulo/perilousHarbor.msav differ diff --git a/core/assets/maps/serpulo/planetaryTerminal.msav b/core/assets/maps/serpulo/planetaryTerminal.msav index 61cd3834bb..56589fe8b1 100644 Binary files a/core/assets/maps/serpulo/planetaryTerminal.msav and b/core/assets/maps/serpulo/planetaryTerminal.msav differ diff --git a/core/assets/maps/serpulo/ruinousShores.msav b/core/assets/maps/serpulo/ruinousShores.msav index a53e010bd7..d21a00edf3 100644 Binary files a/core/assets/maps/serpulo/ruinousShores.msav and b/core/assets/maps/serpulo/ruinousShores.msav differ diff --git a/core/assets/maps/serpulo/saltFlats.msav b/core/assets/maps/serpulo/saltFlats.msav index e9b53e2691..a6c9730ca9 100644 Binary files a/core/assets/maps/serpulo/saltFlats.msav and b/core/assets/maps/serpulo/saltFlats.msav differ diff --git a/core/assets/maps/serpulo/stainedMountains.msav b/core/assets/maps/serpulo/stainedMountains.msav index 70c5d10b6d..50e4f16167 100644 Binary files a/core/assets/maps/serpulo/stainedMountains.msav and b/core/assets/maps/serpulo/stainedMountains.msav differ diff --git a/core/assets/maps/serpulo/sunkenPier.msav b/core/assets/maps/serpulo/sunkenPier.msav index 6a7c10b29f..35194e359e 100644 Binary files a/core/assets/maps/serpulo/sunkenPier.msav and b/core/assets/maps/serpulo/sunkenPier.msav differ diff --git a/core/assets/maps/serpulo/taintedWoods.msav b/core/assets/maps/serpulo/taintedWoods.msav index 49c276a0dd..0204c059aa 100644 Binary files a/core/assets/maps/serpulo/taintedWoods.msav and b/core/assets/maps/serpulo/taintedWoods.msav differ diff --git a/core/assets/maps/serpulo/tarFields.msav b/core/assets/maps/serpulo/tarFields.msav index 36d33eb11c..7781e2832b 100644 Binary files a/core/assets/maps/serpulo/tarFields.msav and b/core/assets/maps/serpulo/tarFields.msav differ diff --git a/core/assets/maps/serpulo/testingGrounds.msav b/core/assets/maps/serpulo/testingGrounds.msav index 1e746d443d..8044f59662 100644 Binary files a/core/assets/maps/serpulo/testingGrounds.msav and b/core/assets/maps/serpulo/testingGrounds.msav differ diff --git a/core/assets/maps/serpulo/windsweptIslands.msav b/core/assets/maps/serpulo/windsweptIslands.msav index 4e4fddf767..1a853c4f2d 100644 Binary files a/core/assets/maps/serpulo/windsweptIslands.msav and b/core/assets/maps/serpulo/windsweptIslands.msav differ diff --git a/core/assets/planets/serpulo.json b/core/assets/planets/serpulo.json index c542fb83c6..f35097126a 100644 --- a/core/assets/planets/serpulo.json +++ b/core/assets/planets/serpulo.json @@ -1 +1 @@ -{presets:{windsweptIslands:97,stainedMountains:223,weatheredChannels:166,craters:219,extractionOutpost:213,coastline:164,navalFortress:165,frontier:86,sunkenPier:173,groundZero:170,mycelialBastion:143,facility32m:65,atolls:75,overgrowth:142,testingGrounds:169,frozenForest:64,saltFlats:98,taintedWoods:145,infestedCanyons:85,desolateRift:271,nuclearComplex:228,ruinousShores:41,planetaryTerminal:217,impact0078:266,perilousHarbor:214,fallenVessel:95,fungalPass:221,tarFields:99,biomassFacility:23},attackSectors:[0,6,13,16,19,20,24,27,30,47,55,66,67,69,76,92,94,103,111,116,127,133,138,150,157,161,162,176,180,185,191,192,197,200,204,207,225,230,237,240,242,243,244,245,246,247,248,251,254,259,263,265]} +{presets:{windsweptIslands:97,stainedMountains:223,weatheredChannels:166,extractionOutpost:213,coastline:164,navalFortress:165,frontier:86,sunkenPier:173,groundZero:170,mycelialBastion:143,crateredBattleground:219,facility32m:65,atolls:75,overgrowth:142,testingGrounds:169,frozenForest:64,littoralShipyard:204,saltFlats:98,taintedWoods:145,infestedCanyons:85,desolateRift:271,nuclearComplex:228,ruinousShores:41,planetaryTerminal:217,impact0078:266,perilousHarbor:214,fallenVessel:95,fungalPass:221,tarFields:99,biomassFacility:23},attackSectors:[0,6,13,16,19,20,24,27,30,47,55,66,67,69,76,92,94,111,116,127,133,161,162,176,180,185,191,192,197,200,207,225,230,240,242,243,244,245,246,247,248,254,259,263,265]} \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index c1429b664a..2b17496bbc 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -197,8 +197,6 @@ const ModContentLoadEvent = Packages.mindustry.game.EventType.ModContentLoadEven const AtlasPackEvent = Packages.mindustry.game.EventType.AtlasPackEvent const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent -const CoreItemDeliverEvent = Packages.mindustry.game.EventType.CoreItemDeliverEvent -const TurretAmmoDeliverEvent = Packages.mindustry.game.EventType.TurretAmmoDeliverEvent const LineConfirmEvent = Packages.mindustry.game.EventType.LineConfirmEvent const TurnEvent = Packages.mindustry.game.EventType.TurnEvent const WaveEvent = Packages.mindustry.game.EventType.WaveEvent diff --git a/core/assets/sounds/block/payloadDrop1.ogg b/core/assets/sounds/block/payloadDrop1.ogg new file mode 100644 index 0000000000..5119091885 Binary files /dev/null and b/core/assets/sounds/block/payloadDrop1.ogg differ diff --git a/core/assets/sounds/block/payloadDrop2.ogg b/core/assets/sounds/block/payloadDrop2.ogg new file mode 100644 index 0000000000..9aabe0642f Binary files /dev/null and b/core/assets/sounds/block/payloadDrop2.ogg differ diff --git a/core/assets/sounds/block/payloadDrop3.ogg b/core/assets/sounds/block/payloadDrop3.ogg new file mode 100644 index 0000000000..73e039590e Binary files /dev/null and b/core/assets/sounds/block/payloadDrop3.ogg differ diff --git a/core/assets/sounds/block/payloadPickup.ogg b/core/assets/sounds/block/payloadPickup.ogg new file mode 100644 index 0000000000..d758ecde52 Binary files /dev/null and b/core/assets/sounds/block/payloadPickup.ogg differ diff --git a/core/assets/sounds/loops/loopMineBeam.ogg b/core/assets/sounds/loops/loopMineBeam.ogg index 27f75a8531..1c93b74d49 100644 Binary files a/core/assets/sounds/loops/loopMineBeam.ogg and b/core/assets/sounds/loops/loopMineBeam.ogg differ diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index e75d82bf83..880c4dae10 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -28,6 +28,7 @@ import mindustry.maps.*; import mindustry.mod.*; import mindustry.net.*; import mindustry.service.*; +import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.world.*; import mindustry.world.meta.*; @@ -100,8 +101,12 @@ public class Vars implements Loadable{ public static final int maxBlockSize = 16; /** maximum distance between mine and core that supports automatic transferring */ public static final float mineTransferRange = 220f; + /** maximum number of preview plans for remote players */ + public static final int maxPlayerPreviewPlans = 1000; /** max chat message length */ public static final int maxTextLength = 150; + /** max length of ping marker text */ + public static final int maxPingTextLength = 40; /** max player name length in bytes */ public static final int maxNameLength = 40; /** displayed item size when ingame. */ @@ -174,6 +179,8 @@ public class Vars implements Loadable{ public static float maxDeltaClient = 6f, maxDeltaServer = 10f; /** whether the graphical game client has loaded */ public static boolean clientLoaded = false; + /** whether the serpulo campaign sectors were remapped (older save) */ + public static boolean hadSerpuloRemaps = false; /** max GL texture size */ public static int maxTextureSize = 2048; /** Maximum schematic size.*/ @@ -301,7 +308,6 @@ public class Vars implements Loadable{ Groups.init(); if(loadLocales){ - //load locales String[] stra = Core.files.internal("locales").readString().split("\n"); locales = new Locale[stra.length]; for(int i = 0; i < locales.length; i++){ @@ -368,6 +374,8 @@ public class Vars implements Loadable{ ios = Core.app.isIOS(); android = Core.app.isAndroid(); + becontrol.init(); + modDirectory.mkdirs(); Events.on(ContentInitEvent.class, e -> { @@ -551,5 +559,9 @@ public class Vars implements Loadable{ StringMap globalBundle = new StringMap(); PropertiesUtils.load(globalBundle, files.internal("bundles/global.properties").reader("UTF-8")); bundle.getProperties().putAll(globalBundle); + + if(!headless){ + app.post(Fonts::loadExtraFonts); + } } } diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 11278ddac6..f5ff55e1e6 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -302,7 +302,7 @@ public class BlockIndexer{ returnBool = false; allBuildings(wx, wy, range, b -> { - if(pred.get(b)){ + if(pred.get(b) && !b.block.privileged){ returnBool = true; cons.get(b); } @@ -314,7 +314,7 @@ public class BlockIndexer{ var buildings = team.data().buildingTree; if(buildings == null) return false; buildings.intersect(wx - range, wy - range, range*2f, range*2f, b -> { - if(b.within(wx, wy, range + b.hitSize() / 2f) && pred.get(b)){ + if(b.within(wx, wy, range + b.hitSize() / 2f) && pred.get(b) && !b.block.privileged){ breturnArray.add(b); } }); @@ -340,7 +340,7 @@ public class BlockIndexer{ var buildings = team.data().buildingTree; if(buildings == null) return false; buildings.intersect(rect, b -> { - if(pred.get(b)){ + if(pred.get(b) && !b.block.privileged){ breturnArray.add(b); } }); diff --git a/core/src/mindustry/ai/RtsAI.java b/core/src/mindustry/ai/RtsAI.java index 21c2b8a843..e006e4303d 100644 --- a/core/src/mindustry/ai/RtsAI.java +++ b/core/src/mindustry/ai/RtsAI.java @@ -160,7 +160,7 @@ public class RtsAI{ ay /= units.size; if(debug){ - Vars.ui.showLabel("Squad: " + units.size, 2f, ax, ay); + Vars.ui.showLabel("Squad: " + units.size, -1, 2f, ax, ay); } Building defend = null; @@ -192,7 +192,7 @@ public class RtsAI{ defend = best; if(debug){ - Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), 8f, best.x, best.y); + Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), -1, 8f, best.x, best.y); } if(best instanceof CoreBuild){ diff --git a/core/src/mindustry/ai/UnitCommand.java b/core/src/mindustry/ai/UnitCommand.java index 11738f7bc4..59bb9d45bb 100644 --- a/core/src/mindustry/ai/UnitCommand.java +++ b/core/src/mindustry/ai/UnitCommand.java @@ -4,6 +4,7 @@ import arc.*; import arc.func.*; import arc.input.*; import arc.scene.style.*; +import arc.struct.*; import arc.util.*; import mindustry.ai.types.*; import mindustry.ctype.*; @@ -13,7 +14,7 @@ import mindustry.input.*; /** Defines a pattern of behavior that an RTS-controlled unit should follow. Shows up in the command UI. */ public class UnitCommand extends MappableContent{ - public static UnitCommand moveCommand, repairCommand, rebuildCommand, assistCommand, mineCommand, boostCommand, enterPayloadCommand, loadUnitsCommand, loadBlocksCommand, unloadPayloadCommand, loopPayloadCommand; + public static UnitCommand moveCommand, repairCommand, rebuildCommand, assistCommand, mineCommand, enterPayloadCommand, loadUnitsCommand, loadBlocksCommand, unloadPayloadCommand, loopPayloadCommand; /** Name of UI icon (from Icon class). */ public final String icon; @@ -27,12 +28,14 @@ public class UnitCommand extends MappableContent{ public boolean resetTarget = true; /** Whether to snap the command destination to ally buildings. */ public boolean snapToBuilding = false; - /** */ + /** If true, the unit will arrive at this command's exact endpoint. */ public boolean exactArrival = false; /** If true, this command refreshes the list of stances when selected TODO: do not use, this will likely be removed later!*/ public boolean refreshOnSelect = false; /** Key to press for this command. */ public @Nullable KeyBind keybind = null; + /** Extra stances that are available when this command is selected. These ignore incompatibleStances. */ + public Seq extraStances = new Seq<>(); public UnitCommand(String name, String icon, Func controller){ super(name); @@ -84,12 +87,7 @@ public class UnitCommand extends MappableContent{ mineCommand = new UnitCommand("mine", "production", Binding.unitCommandMine, u -> new MinerAI()){{ refreshOnSelect = true; }}; - boostCommand = new UnitCommand("boost", "up", Binding.unitCommandBoost, u -> new BoostAI()){{ - switchToMove = false; - drawTarget = true; - resetTarget = false; - }}; - enterPayloadCommand = new UnitCommand("enterPayload", "downOpen", Binding.unitCommandEnterPayload, u -> new BoostAI()){{ + enterPayloadCommand = new UnitCommand("enterPayload", "downOpen", Binding.unitCommandEnterPayload, null){{ switchToMove = false; drawTarget = true; resetTarget = false; diff --git a/core/src/mindustry/ai/UnitStance.java b/core/src/mindustry/ai/UnitStance.java index 656751f1a8..ff09b7eccb 100644 --- a/core/src/mindustry/ai/UnitStance.java +++ b/core/src/mindustry/ai/UnitStance.java @@ -12,19 +12,22 @@ import mindustry.input.*; import mindustry.type.*; public class UnitStance extends MappableContent{ - public static UnitStance stop, holdFire, pursueTarget, patrol, ram, mineAuto; + public static UnitStance stop, holdFire, pursueTarget, patrol, ram, boost, holdPosition, mineAuto; /** Name of UI icon (from Icon class). */ public String icon; /** Key to press for this stance. */ public @Nullable KeyBind keybind; + /** Commands that are mutually exclusive to this stance. This is used for convenience, for writing only! */ + public Seq incompatibleCommands = new Seq<>(); /** Stances that are mutually exclusive to this stance. This is used for convenience, for writing only! */ public Seq incompatibleStances = new Seq<>(); - /** Incompatible stances as a bitset for easier operations. This is where incompatibility is actually stored. */ - public Bits incompatibleBits = new Bits(32); /** If true, this stance can be toggled on or off. */ public boolean toggle = true; + /** Incompatible stances as a bitset for easier operations. This is where incompatibility is actually stored. */ + public Bits incompatibleStanceBits = new Bits(32), incompatibleCommandBits = new Bits(32); + public UnitStance(String name, String icon, KeyBind keybind, boolean toggle){ super(name); this.icon = icon; @@ -42,9 +45,17 @@ public class UnitStance extends MappableContent{ for(var stance : incompatibleStances){ if(stance == this) continue; - incompatibleBits.set(stance.id); - stance.incompatibleBits.set(id); + incompatibleStanceBits.set(stance.id); + stance.incompatibleStanceBits.set(id); } + + for(var command : incompatibleCommands){ + incompatibleCommandBits.set(command.id); + } + } + + public boolean isCompatible(@Nullable UnitCommand other){ + return other == null || !incompatibleCommandBits.get(other.id); } public String localized(){ @@ -73,13 +84,22 @@ public class UnitStance extends MappableContent{ stop = new UnitStance("stop", "cancel", Binding.cancelOrders, false); holdFire = new UnitStance("holdfire", "none", Binding.unitStanceHoldFire); pursueTarget = new UnitStance("pursuetarget", "right", Binding.unitStancePursueTarget); - patrol = new UnitStance("patrol", "refresh", Binding.unitStancePatrol); + patrol = new UnitStance("patrol", "refresh", Binding.unitStancePatrol){{ + incompatibleCommands.addAll(UnitCommand.repairCommand, UnitCommand.assistCommand, UnitCommand.rebuildCommand); + }}; ram = new UnitStance("ram", "rightOpen", Binding.unitStanceRam); + boost = new UnitStance("boost", "up", Binding.unitStanceBoost){{ + incompatibleCommands.addAll(UnitCommand.rebuildCommand, UnitCommand.repairCommand, UnitCommand.assistCommand, UnitCommand.enterPayloadCommand); + }}; + holdPosition = new UnitStance("holdposition", "effect", Binding.unitStanceHoldPosition); mineAuto = new UnitStance("mineauto", "settings", null, false); //Only vanilla items are supported for now for(Item item : Vars.content.items()){ new ItemUnitStance(item); } + + Seq.with(UnitCommand.repairCommand, UnitCommand.assistCommand, UnitCommand.rebuildCommand) + .each(c -> c.extraStances.add(holdPosition)); } } diff --git a/core/src/mindustry/ai/types/BoostAI.java b/core/src/mindustry/ai/types/BoostAI.java index 5bacbaa8a6..595228cd5b 100644 --- a/core/src/mindustry/ai/types/BoostAI.java +++ b/core/src/mindustry/ai/types/BoostAI.java @@ -16,6 +16,8 @@ public class BoostAI extends AIController{ if(ai.attackTarget != null && unit.within(ai.attackTarget, unit.range())){ unit.command().command(UnitCommand.moveCommand); } + }else{ + unit.updateBoosting(true, true); } } } diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index 7bbf1dfa32..1c89b75ab8 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -2,6 +2,7 @@ package mindustry.ai.types; import arc.struct.*; import arc.util.*; +import mindustry.ai.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.Teams.*; @@ -61,6 +62,7 @@ public class BuilderAI extends AIController{ } boolean moving = false; + boolean hold = hasStance(UnitStance.holdPosition); if(following != null){ retreatTimer = 0f; @@ -77,7 +79,7 @@ public class BuilderAI extends AIController{ unit.plans.clear(); unit.plans.addFirst(following.buildPlan()); lastPlan = null; - }else if(unit.buildPlan() == null || alwaysFlee){ + }else if((unit.buildPlan() == null || alwaysFlee) && !hold){ //not following anyone or building if(timer.get(timerTarget4, 40)){ enemy = target(unit.x, unit.y, fleeRange, true, true); @@ -121,10 +123,16 @@ public class BuilderAI extends AIController{ Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation))); if(valid){ - float range = Math.min(unit.type.buildRange - unit.type.hitSize * 2f, buildRadius); - //move toward the plan - moveTo(req.tile(), range, 20f); - moving = !unit.within(req.tile(), range); + if(!hold){ + float range = Math.min(unit.type.buildRange - unit.type.hitSize * 2f, buildRadius); + //move toward the plan + moveTo(req.tile(), range, 20f); + moving = !unit.within(req.tile(), range); + }else if(!unit.within(req, unit.type.buildRange - tilesize) && !state.rules.infiniteResources){ + //discard the plan, it's too far away to reach while holding position. try the next one + unit.plans.removeFirst(); + lastPlan = null; + } }else{ //discard invalid plan unit.plans.removeFirst(); @@ -132,7 +140,7 @@ public class BuilderAI extends AIController{ } }else{ - if(assistFollowing != null){ + if(assistFollowing != null && !hold){ moveTo(assistFollowing, assistFollowing.type.hitSize + unit.type.hitSize/2f + 60f); moving = !unit.within(assistFollowing, assistFollowing.type.hitSize + unit.type.hitSize/2f + 65f); } @@ -179,21 +187,43 @@ public class BuilderAI extends AIController{ //find new plan if(!onlyAssist && !unit.team.data().plans.isEmpty() && following == null && timer.get(timerTarget3, rebuildPeriod)){ - Queue blocks = unit.team.data().plans; - BlockPlan block = blocks.first(); + var blocks = unit.team.data().plans; - //check if it's already been placed - if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block() == block.block){ - blocks.removeFirst(); - }else if(Build.validPlace(block.block, unit.team(), block.x, block.y, block.rotation) && (!alwaysFlee || !nearEnemy(block.x, block.y))){ //it's valid - lastPlan = block; - //add build plan - unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, block.block, block.config)); - //shift build plan to tail so next unit builds something else - blocks.addLast(blocks.removeFirst()); + + if(hold){ + //essentially build turret behavior (find first plan in range) + for(int i = 0; i < blocks.size; i++){ + var block = blocks.get(i); + if(state.rules.infiniteResources || unit.within(block.x * tilesize, block.y * tilesize, unit.type.buildRange)){ + var btype = block.block; + + if(Build.validPlace(btype, unit.team(), block.x, block.y, block.rotation)){ + unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, block.block, block.config)); + //shift build plan to tail so next unit builds something else + blocks.addLast(blocks.removeIndex(i)); + lastPlan = block; + break; + } + } + } }else{ - //shift head of queue to tail, try something else next time - blocks.addLast(blocks.removeFirst()); + BlockPlan block = blocks.first(); + + //check if it's already been placed + if(world.tile(block.x, block.y) != null && world.tile(block.x, block.y).block() == block.block){ + blocks.removeFirst(); + }else if(Build.validPlace(block.block, unit.team(), block.x, block.y, block.rotation) + && (!alwaysFlee || !nearEnemy(block.x, block.y))){ //check if it's valid + + lastPlan = block; + //add build plan + unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, block.block, block.config)); + //shift build plan to tail so next unit builds something else + blocks.addLast(blocks.removeFirst()); + }else{ + //shift head of queue to tail, try something else next time + blocks.addLast(blocks.removeFirst()); + } } } } diff --git a/core/src/mindustry/ai/types/CommandAI.java b/core/src/mindustry/ai/types/CommandAI.java index 8753df6de8..0570ce51f0 100644 --- a/core/src/mindustry/ai/types/CommandAI.java +++ b/core/src/mindustry/ai/types/CommandAI.java @@ -63,6 +63,7 @@ public class CommandAI extends AIController{ } } + @Override public boolean hasStance(@Nullable UnitStance stance){ return stance != null && stances.get(stance.id); } @@ -79,7 +80,7 @@ public class CommandAI extends AIController{ //this happens when an older save reads the default "shoot" stance, or any other removed stance if(stance == UnitStance.stop) return; - stances.andNot(stance.incompatibleBits); + stances.andNot(stance.incompatibleStanceBits); stances.set(stance.id); stanceChanged(); } @@ -156,11 +157,24 @@ public class CommandAI extends AIController{ commandController.updateUnit(); }else{ defaultBehavior(); - //boosting control is not supported, so just don't. - unit.updateBoosting(false); + if(shouldBoost() && unit.type.canBoost){ + //auto land when near target + if((attackTarget != null && unit.within(attackTarget, unit.range())) || (hasStance(UnitStance.patrol) && target != null && unit.within(target, unit.range()))){ + unit.updateBoosting(false); + }else{ + unit.updateBoosting(true, true); + } + }else{ + //boosting control is not supported, so just don't. + unit.updateBoosting(false); + } } } + protected boolean shouldBoost(){ + return hasStance(UnitStance.boost) || command == UnitCommand.enterPayloadCommand; + } + public void clearCommands(){ commandQueue.clear(); targetPos = null; @@ -176,7 +190,7 @@ public class CommandAI extends AIController{ @Override public Teamc findMainTarget(float x, float y, float range, boolean air, boolean ground){ - if(!unit.type.autoFindTarget && !(targetPos == null || nearAttackTarget(unit.x, unit.y, unit.range()))){ + if(!unit.type.autoFindTarget && !hasStance(UnitStance.patrol) && !(targetPos == null || nearAttackTarget(unit.x, unit.y, unit.range()))){ return null; } return super.findMainTarget(x, y, range, air, ground); @@ -214,7 +228,9 @@ public class CommandAI extends AIController{ } } - if(!net.client() && command == UnitCommand.enterPayloadCommand && unit.buildOn() != null && (targetPos == null || (world.buildWorld(targetPos.x, targetPos.y) != null && world.buildWorld(targetPos.x, targetPos.y) == unit.buildOn()))){ + if(!net.client() && command == UnitCommand.enterPayloadCommand && unit.type.allowedInPayloads && unit.buildOn() != null && + (targetPos == null || (world.buildWorld(targetPos.x, targetPos.y) != null && world.buildWorld(targetPos.x, targetPos.y) == unit.buildOn()))){ + var build = unit.buildOn(); tmpPayload.unit = unit; if(build.team == unit.team && build.acceptPayload(build, tmpPayload)){ diff --git a/core/src/mindustry/ai/types/RepairAI.java b/core/src/mindustry/ai/types/RepairAI.java index bf3e9782ff..c46b15e221 100644 --- a/core/src/mindustry/ai/types/RepairAI.java +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -1,6 +1,7 @@ package mindustry.ai.types; import arc.util.*; +import mindustry.ai.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; @@ -28,11 +29,15 @@ public class RepairAI extends AIController{ unit.controlWeapons(false); } + boolean hold = hasStance(UnitStance.holdPosition); + if(target != null && target instanceof Building b && b.team == unit.team){ - if(unit.type.circleTarget){ - circleAttack(unit.type.circleTargetRadius); - }else if(!target.within(unit, unit.type.range * 0.65f)){ - moveTo(target, unit.type.range * 0.65f); + if(!hold){ + if(unit.type.circleTarget){ + circleAttack(unit.type.circleTargetRadius); + }else if(!target.within(unit, unit.type.range * 0.65f)){ + moveTo(target, unit.type.range * 0.65f); + } } if(!unit.type.circleTarget){ @@ -41,7 +46,7 @@ public class RepairAI extends AIController{ } //not repairing - if(!(target instanceof Building)){ + if(!(target instanceof Building) && !hold){ if(timer.get(timerTarget4, 40)){ avoid = target(unit.x, unit.y, fleeRange, true, true); } diff --git a/core/src/mindustry/audio/SoundControl.java b/core/src/mindustry/audio/SoundControl.java index ad5675b2ef..c562491652 100644 --- a/core/src/mindustry/audio/SoundControl.java +++ b/core/src/mindustry/audio/SoundControl.java @@ -198,6 +198,8 @@ public class SoundControl{ return; } + if(state.isPaused()) return; + float avol = Core.settings.getInt("ambientvol", 100) / 100f; sounds.each((sound, data) -> { diff --git a/core/src/mindustry/audio/SoundLoop.java b/core/src/mindustry/audio/SoundLoop.java index 5b1baff79c..07a9c84773 100644 --- a/core/src/mindustry/audio/SoundLoop.java +++ b/core/src/mindustry/audio/SoundLoop.java @@ -50,7 +50,7 @@ public class SoundLoop{ if(id != -1){ Core.audio.stop(id); id = -1; - volume = baseVolume = -1; + volume = 0f; } } } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 55e608fcdf..4019daad98 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -176,7 +176,7 @@ public class Blocks{ //logic message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, tileLogicDisplay, memoryCell, memoryBank, - canvas, reinforcedMessage, + canvas, largeCanvas, reinforcedMessage, worldProcessor, worldCell, worldMessage, worldSwitch, //campaign @@ -3911,9 +3911,10 @@ public class Blocks{ ); size = 3; reload = 3f; + shoot = new ShootAlternate(4f); shoot.shots = 2; velocityRnd = 0.1f; - inaccuracy = 4f; + inaccuracy = 3f; recoil = 1f; shootCone = 45f; liquidCapacity = 40f; @@ -6881,6 +6882,35 @@ public class Blocks{ size = 2; }}; + largeCanvas = new CanvasBlock("large-canvas"){{ + requirements(Category.logic, BuildVisibility.shown, with(Items.silicon, 15, Items.beryllium, 15, Items.surgeAlloy, 5)); + + canvasSize = 24; + padding = 7f / 4f * 2f; + + size = 3; + + //Palette: https://lospec.com/palette-list/woodspark + setPaletteFromString(""" + 452b3f + 8a5865 + e08d51 + fabf61 + f5eeb0 + 2c5e3b + 609c4f + c6cc54 + 78c2d6 + 5479b0 + 56546e + 839fa6 + e0d3c8 + f05b5b + 8f325f + eb6c98 + """); + }}; + reinforcedMessage = new MessageBlock("reinforced-message"){{ requirements(Category.logic, with(Items.graphite, 10, Items.beryllium, 5)); health = 100; diff --git a/core/src/mindustry/content/ErekirTechTree.java b/core/src/mindustry/content/ErekirTechTree.java index c28ad6875f..f7b8317b21 100644 --- a/core/src/mindustry/content/ErekirTechTree.java +++ b/core/src/mindustry/content/ErekirTechTree.java @@ -95,7 +95,9 @@ public class ErekirTechTree{ }); node(reinforcedMessage, Seq.with(new OnSector(aegis)), () -> { - node(canvas); + node(canvas, () -> { + node(largeCanvas); + }); }); }); diff --git a/core/src/mindustry/content/Planets.java b/core/src/mindustry/content/Planets.java index 01f266abea..b690374a52 100644 --- a/core/src/mindustry/content/Planets.java +++ b/core/src/mindustry/content/Planets.java @@ -129,6 +129,7 @@ public class Planets{ new HexSkyMesh(this, 1, 0.6f, 0.16f, 5, Color.white.cpy().lerp(Pal.spore, 0.55f).a(0.75f), 2, 0.45f, 1f, 0.41f) ); + enemyFactoryActivationDelay = 60f * 60f * 2f; launchCapacityMultiplier = 0.5f; sectorSeed = 2; allowWaves = true; diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 8db657966d..34dd0da30a 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -8,10 +8,10 @@ import static mindustry.content.Planets.*; public class SectorPresets{ public static SectorPreset groundZero, - craters, biomassFacility, taintedWoods, frozenForest, ruinousShores, facility32m, windsweptIslands, stainedMountains, tarFields, + crateredBattleground, biomassFacility, taintedWoods, frozenForest, ruinousShores, facility32m, windsweptIslands, stainedMountains, tarFields, frontier, fungalPass, infestedCanyons, atolls, sunkenPier, mycelialBastion, extractionOutpost, saltFlats, testingGrounds, overgrowth, impact0078, desolateRift, fallenVessel, nuclearComplex, planetaryTerminal, - coastline, navalFortress, weatheredChannels, perilousHarbor, + coastline, navalFortress, weatheredChannels, perilousHarbor, littoralShipyard, onset, aegis, lake, intersect, basin, atlas, split, marsh, peaks, ravine, caldera, stronghold, crevice, siege, crossroads, karst, origin; @@ -53,7 +53,7 @@ public class SectorPresets{ difficulty = 5; }}; - craters = new SectorPreset("craters", serpulo, 18){{ + crateredBattleground = new SectorPreset("crateredBattleground", serpulo, 18){{ captureWave = 20; difficulty = 2; }}; @@ -154,6 +154,10 @@ public class SectorPresets{ difficulty = 7; }}; + littoralShipyard = new SectorPreset("littoralShipyard", serpulo, 204){{ + difficulty = 9; + }}; + planetaryTerminal = new SectorPreset("planetaryTerminal", serpulo, 93){{ difficulty = 10; isLastSector = true; @@ -177,7 +181,6 @@ public class SectorPresets{ //region erekir onset = new SectorPreset("onset", erekir, 10){{ - addStartingItems = true; alwaysUnlocked = true; difficulty = 1; }}; diff --git a/core/src/mindustry/content/SerpuloTechTree.java b/core/src/mindustry/content/SerpuloTechTree.java index cd003c8fa4..879ea6ad55 100644 --- a/core/src/mindustry/content/SerpuloTechTree.java +++ b/core/src/mindustry/content/SerpuloTechTree.java @@ -5,7 +5,6 @@ import mindustry.game.Objectives.*; import mindustry.type.*; import static mindustry.content.Blocks.*; -import static mindustry.content.SectorPresets.craters; import static mindustry.content.SectorPresets.*; import static mindustry.content.TechTree.*; import static mindustry.content.UnitTypes.*; @@ -41,7 +40,7 @@ public class SerpuloTechTree{ }); node(itemBridge, () -> { - node(titaniumConveyor, Seq.with(new SectorComplete(craters)), () -> { + node(titaniumConveyor, Seq.with(new SectorComplete(crateredBattleground)), () -> { node(phaseConveyor, () -> { node(massDriver, Seq.with(new SectorComplete(tarFields)), () -> { @@ -121,7 +120,7 @@ public class SerpuloTechTree{ }); }); - node(pyratiteMixer, () -> { + node(pyratiteMixer, Seq.with(new SectorComplete(crateredBattleground)), () -> { node(blastMixer, Seq.with(new SectorComplete(facility32m)), () -> { }); @@ -145,7 +144,7 @@ public class SerpuloTechTree{ }); }); - node(kiln, Seq.with(new OnSector(craters)), () -> { + node(kiln, Seq.with(new OnSector(crateredBattleground)), () -> { node(pulverizer, () -> { node(incinerator, () -> { node(melter, () -> { @@ -236,7 +235,7 @@ public class SerpuloTechTree{ }); }); - node(steamGenerator, Seq.with(new SectorComplete(craters)), () -> { + node(steamGenerator, Seq.with(new SectorComplete(crateredBattleground)), () -> { node(thermalGenerator, () -> { node(differentialGenerator, () -> { node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { @@ -298,7 +297,7 @@ public class SerpuloTechTree{ }); node(scatter, () -> { - node(hail, Seq.with(new SectorComplete(craters)), () -> { + node(hail, Seq.with(new SectorComplete(crateredBattleground)), () -> { node(salvo, () -> { node(swarmer, () -> { node(cyclone, () -> { @@ -352,7 +351,7 @@ public class SerpuloTechTree{ node(mace, () -> { node(fortress, () -> { node(scepter, () -> { - node(reign, () -> { + node(reign, Seq.with(new SectorComplete(desolateRift)), () -> { }); }); @@ -415,7 +414,7 @@ public class SerpuloTechTree{ node(minke, () -> { node(bryde, () -> { node(sei, () -> { - node(omura, () -> { + node(omura, Seq.with(new SectorComplete(littoralShipyard)), () -> { }); }); @@ -454,14 +453,14 @@ public class SerpuloTechTree{ new Research(junction), new Research(router) ), () -> { - node(craters, Seq.with( + node(crateredBattleground, Seq.with( new SectorComplete(frozenForest), new Research(mender), new Research(combustionGenerator) ), () -> { node(ruinousShores, Seq.with( - new SectorComplete(craters), + new SectorComplete(crateredBattleground), new Research(graphitePress), new Research(kiln), new Research(mechanicalPump) @@ -502,26 +501,30 @@ public class SerpuloTechTree{ new Research(thoriumReactor), new Research(coreNucleus) ), () -> { - node(planetaryTerminal, Seq.with( + node(littoralShipyard, Seq.with( new SectorComplete(desolateRift), - new SectorComplete(nuclearComplex), - new SectorComplete(overgrowth), - new SectorComplete(extractionOutpost), - new SectorComplete(saltFlats), + new SectorComplete(navalFortress), new Research(risso), new Research(minke), new Research(bryde), new Research(sei), - new Research(omura), new Research(spectre), - new Research(advancedLaunchPad), - new Research(massDriver), - new Research(impactReactor), new Research(additiveReconstructor), - new Research(exponentialReconstructor), - new Research(tetrativeReconstructor) + new Research(exponentialReconstructor) ), () -> { + node(planetaryTerminal, Seq.with( + new SectorComplete(nuclearComplex), + new SectorComplete(extractionOutpost), + new SectorComplete(mycelialBastion), + new SectorComplete(littoralShipyard), + new Research(omura), + new Research(advancedLaunchPad), + new Research(massDriver), + new Research(impactReactor), + new Research(tetrativeReconstructor) + ), () -> { + }); }); }); }); @@ -573,6 +576,7 @@ public class SerpuloTechTree{ node(fallenVessel, Seq.with( new SectorComplete(desolateRift), new SectorComplete(mycelialBastion), + new SectorComplete(littoralShipyard), new Research(sei), new Research(meltdown), new Research(spectre) @@ -587,7 +591,7 @@ public class SerpuloTechTree{ }); node(biomassFacility, Seq.with( - new SectorComplete(craters), + new SectorComplete(crateredBattleground), new Research(powerNode), new Research(steamGenerator), new Research(scatter), diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 618cedb7e6..1a8435c424 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -2557,9 +2557,11 @@ public class UnitTypes{ backColor = trailColor = Pal.yellowBoltFront; hitColor = Pal.yellowBoltFront; frontColor = Color.white; + lightColor = Pal.yellowBoltFront; lifetime = 60f; buildingDamageMultiplier = 0.01f; + homingPower = 0.02f; }}; }}); }}; @@ -2606,9 +2608,11 @@ public class UnitTypes{ backColor = trailColor = Pal.yellowBoltFront; hitColor = Pal.yellowBoltFront; frontColor = Color.white; + lightColor = Pal.yellowBoltFront; lifetime = 60f; buildingDamageMultiplier = 0.01f; + homingPower = 0.03f; }}; }}); }}; @@ -2659,6 +2663,7 @@ public class UnitTypes{ backColor = trailColor = Pal.yellowBoltFront; hitColor = Pal.yellowBoltFront; frontColor = Color.white; + lightColor = Pal.yellowBoltFront; lifetime = 70f; buildingDamageMultiplier = 0.01f; diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 9d742cb882..3dc06989ed 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -31,6 +31,7 @@ import mindustry.net.*; import mindustry.type.*; import mindustry.ui.dialogs.*; import mindustry.world.*; +import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.CoreBlock.*; import java.io.*; @@ -145,7 +146,7 @@ public class Control implements ApplicationListener, Loadable{ //autohost for pvp maps Events.on(WorldLoadEvent.class, event -> app.post(() -> { - if(state.rules.pvp && !net.active()){ + if(state.rules.pvp && !net.active() && !state.rules.pauseDisabled){ try{ net.host(port); player.admin = true; @@ -186,7 +187,7 @@ public class Control implements ApplicationListener, Loadable{ Events.on(GameOverEvent.class, e -> { if(state.isCampaign() && !net.client() && !headless){ - //save gameover sate immediately + //save gameover state immediately if(saves.getCurrent() != null){ saves.getCurrent().save(); } @@ -248,7 +249,7 @@ public class Control implements ApplicationListener, Loadable{ if(ccore != null){ anyBuilds = true; - if(!net.active()){ + if(!net.active() && !state.rules.pauseDisabled){ build.pickedUp(); build.tile.remove(); @@ -284,7 +285,12 @@ public class Control implements ApplicationListener, Loadable{ } }); - Events.on(SaveWriteEvent.class, e -> forcePlaceAll()); + Events.on(SaveWriteEvent.class, e -> { + if(!net.client() && state.isCampaign()){ + state.getPlanet().saveStats(); + } + forcePlaceAll(); + }); Events.on(HostEvent.class, e -> forcePlaceAll()); Events.on(HostEvent.class, e -> { state.set(State.playing); @@ -497,6 +503,14 @@ public class Control implements ApplicationListener, Loadable{ } } + //all the derelict power graphs are invalid + for(var build : previousBuildings){ + if(build.power != null){ + build.power.graph = new PowerGraph(); + build.power.links.clear(); + } + } + //copy over all buildings from the previous save, retaining config and health, and making them derelict for(var build : previousBuildings){ Tile tile = world.tile(build.tileX(), build.tileY()); @@ -597,7 +611,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void pause(){ - if(settings.getBool("backgroundpause", true) && !net.active()){ + if(settings.getBool("backgroundpause", true) && !net.active() && !state.rules.pauseDisabled){ backgroundPaused = true; wasPaused = state.is(State.paused); if(state.is(State.playing)) state.set(State.paused); @@ -606,7 +620,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void resume(){ - if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true) && !net.active()){ + if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true) && !net.active() && !state.rules.pauseDisabled){ state.set(State.playing); } backgroundPaused = false; @@ -669,11 +683,7 @@ public class Control implements ApplicationListener, Loadable{ if(Core.input.keyTap(Binding.fullscreen)){ boolean full = settings.getBool("fullscreen"); - if(full){ - graphics.setWindowedMode(graphics.getWidth(), graphics.getHeight()); - }else{ - graphics.setFullscreen(); - } + graphics.setFullscreen(!full); settings.put("fullscreen", !full); } @@ -686,6 +696,7 @@ public class Control implements ApplicationListener, Loadable{ if(state.isGame()){ input.update(); + input.updateSelectQuadtree(); if(!state.isPaused()){ indicators.update(); } @@ -701,7 +712,7 @@ public class Control implements ApplicationListener, Loadable{ core.items.each((i, a) -> i.unlock()); } - if(backgroundPaused && settings.getBool("backgroundpause") && !net.active()){ + if(backgroundPaused && settings.getBool("backgroundpause") && !net.active() && !state.rules.pauseDisabled){ state.set(State.paused); } @@ -711,7 +722,11 @@ public class Control implements ApplicationListener, Loadable{ } if(!net.client() && Core.input.keyTap(Binding.pause) && !(state.isCampaign() && state.afterGameOver) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ - state.set(state.isPaused() ? State.playing : State.paused); + if(state.rules.pauseDisabled){ + ui.hudfrag.showPauseDisabled(); + }else{ + state.set(state.isPaused() ? State.playing : State.paused); + } } if(state.isCampaign() && state.afterGameOver){ @@ -723,7 +738,7 @@ public class Control implements ApplicationListener, Loadable{ ui.chatfrag.hide(); }else if(!ui.paused.isShown() && !scene.hasDialog()){ ui.paused.show(); - if(!net.active()){ + if(!net.active() && !state.rules.pauseDisabled){ state.set(State.paused); } } diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index ebbda4bd45..89834316fd 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -114,6 +114,10 @@ public class Logic implements ApplicationListener{ state.rules.waveTeam.rules().fillItems = true; } state.rules.waveTeam.rules().buildSpeedMultiplier *= state.getPlanet().enemyBuildSpeedMultiplier; + + if(state.getPlanet().enemyFactoryActivationDelay > 0f && state.rules.waveTeam.rules().unitFactoryActivationDelay == 0f){ + state.rules.waveTeam.rules().unitFactoryActivationDelay = state.getPlanet().enemyFactoryActivationDelay; + } } //save settings @@ -135,6 +139,10 @@ public class Logic implements ApplicationListener{ if(!net.client() && e.sector.planet.generator != null){ e.sector.planet.generator.onSectorCaptured(e.sector); } + + if(checkCampaignStats()){ + state.getPlanet().stats().sectorsCaptured ++; + } }); Events.on(SectorLoseEvent.class, e -> { @@ -157,38 +165,71 @@ public class Logic implements ApplicationListener{ })); Events.on(BlockBuildEndEvent.class, e -> { - if(e.team == state.rules.defaultTeam){ + + if((e.team == state.rules.defaultTeam || e.unit != null && e.unit.team == state.rules.defaultTeam)){ if(e.breaking){ state.stats.buildingsDeconstructed++; }else{ state.stats.buildingsBuilt++; } + + if(checkCampaignStats()){ + (e.breaking ? state.getPlanet().stats().buildingsDeconstructed : state.getPlanet().stats().buildingsBuilt).increment(e.tile.block()); + } } }); Events.on(BlockDestroyEvent.class, e -> { if(e.tile.team() == state.rules.defaultTeam){ state.stats.buildingsDestroyed ++; - } - }); - Events.on(BlockDestroyEvent.class, e -> { - if(e.tile.team() != state.rules.defaultTeam){ + if(checkCampaignStats()){ + state.getPlanet().stats().buildingsDestroyed.increment(e.tile.block()); + } + }else{ //...should derelict blocks count as 'destroyed'? technically, they could be destroyed by the enemy, but that is very rare state.stats.destroyedBlockCount.increment(e.tile.block()); + + if(checkCampaignStats()){ + state.getPlanet().stats().enemyBuildingsDestroyed.increment(e.tile.block()); + } } }); Events.on(UnitDestroyEvent.class, e -> { - if(e.unit.team() != state.rules.defaultTeam){ + if(e.unit.team != state.rules.defaultTeam){ state.stats.enemyUnitsDestroyed ++; } + + if(checkCampaignStats()){ + (e.unit.team != state.rules.defaultTeam ? state.getPlanet().stats().enemyUnitsDestroyed : state.getPlanet().stats().unitsDestroyed).increment(e.unit.type); + } }); Events.on(UnitCreateEvent.class, e -> { if(e.unit.team == state.rules.defaultTeam){ state.stats.unitsCreated++; + + if(checkCampaignStats()){ + state.getPlanet().stats().unitsProduced.increment(e.unit.type); + } } }); + + Events.on(WaveEvent.class, e -> { + if(checkCampaignStats()){ + state.getPlanet().stats().wavesLasted ++; + } + }); + + Events.on(GameOverEvent.class, e -> { + if(checkCampaignStats()){ + state.getPlanet().stats().sectorsLost ++; + } + }); + } + + private boolean checkCampaignStats(){ + return state.isCampaign() && !net.client(); } private void checkOverlappingPlans(Team team, Tile tile){ @@ -248,7 +289,6 @@ public class Logic implements ApplicationListener{ Events.fire(new ResetEvent()); world.tiles = new Tiles(0, 0); - //save settings on reset Core.settings.manualSave(); } diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index e38694fe5a..d3325ffd64 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -13,14 +13,15 @@ import arc.util.serialization.*; import arc.util.serialization.JsonValue.*; import mindustry.*; import mindustry.annotations.Annotations.*; -import mindustry.content.*; import mindustry.core.GameState.*; import mindustry.entities.*; +import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.io.*; +import mindustry.io.TypeIO.*; import mindustry.logic.*; import mindustry.net.Administration.*; import mindustry.net.*; @@ -37,13 +38,15 @@ import static mindustry.Vars.*; public class NetClient implements ApplicationListener{ private static final long entitySnapshotTimeout = 1000 * 20; private static final float dataTimeout = 60 * 30; - /** ticks between syncs, e.g. 5 means 60/5 = 12 syncs/sec*/ - private static final float playerSyncTime = 4; + private static final Timekeeper + playerSyncTime = Timekeeper.ofMillis(66), + planSyncTime = Timekeeper.ofSeconds(0.5f), + pingTime = Timekeeper.ofSeconds(1f); private static final Reads dataReads = new Reads(null); private static final JsonValue tmpJsonMap = new JsonValue(ValueType.object); private long ping; - private Interval timer = new Interval(5); + //private Interval timer = new Interval(5); /** Whether the client is currently connecting. */ private boolean connecting = false; /** If true, no message will be shown on disconnect. */ @@ -67,6 +70,7 @@ public class NetClient implements ApplicationListener{ private ObjectMap>> customPacketHandlers = new ObjectMap<>(); /** Packet handlers for custom types of messages, in binary. */ private ObjectMap>> customBinaryPacketHandlers = new ObjectMap<>(); + private static final ClientBuildPlans plansOut = new ClientBuildPlans(); public NetClient(){ @@ -684,7 +688,7 @@ public class NetClient implements ApplicationListener{ } void sync(){ - if(timer.get(0, playerSyncTime)){ + if(playerSyncTime.poll()){ boolean dead = player.dead(); Unit unit = dead ? null : player.unit(); int uid = dead || unit == null ? -1 : unit.id; @@ -706,9 +710,41 @@ public class NetClient implements ApplicationListener{ ); } - if(timer.get(1, 60)){ + if(pingTime.poll()){ Call.ping(Time.millis()); } + + if(planSyncTime.poll()){ + int id = ++player.lastPreviewPlanGroup; + + plansOut.clear(); + control.input.getSyncedPlans(plansOut); + plansOut.truncate(maxPlayerPreviewPlans); + + if(plansOut.isEmpty()){ + Call.clientPlanSnapshot(id, null); + }else{ + BuildPlan[] items = plansOut.items; + int size = plansOut.size; + //max snapshot size = 800 + //max reasonable plan size = 12 + //divide the two to get the size of plan batches + final int chunkSize = 900 / 12; + + if(size < chunkSize){ + Call.clientPlanSnapshot(id, plansOut); + }else{ + for(int i = 0; i < size; i += chunkSize){ + int len = Math.min(i + chunkSize, size) - i; + ClientBuildPlans cb = new ClientBuildPlans(len); + System.arraycopy(items, i, cb.items, 0, len); + cb.size = len; + + Call.clientPlanSnapshot(id, cb); + } + } + } + } } String getUsid(String ip){ diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 5640d67af6..5bcb6d50f4 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -18,6 +18,7 @@ import mindustry.game.EventType.*; import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.io.TypeIO.*; import mindustry.logic.*; import mindustry.net.*; import mindustry.net.Administration.*; @@ -36,13 +37,17 @@ import static mindustry.Vars.*; public class NetServer implements ApplicationListener{ /** note that snapshots are compressed, so the max snapshot size here is above the typical UDP safe limit */ private static final int maxSnapshotSize = 800; - private static final int timerBlockSync = 0, timerHealthSync = 1; - private static final float blockSyncTime = 60 * 6, healthSyncTime = 30; + private static final Timekeeper + blockSyncTime = Timekeeper.ofSeconds(6f), + healthSyncTime = Timekeeper.ofSeconds(0.5f), + planPreviewSyncTime = Timekeeper.ofSeconds(0.5f); + private static final FloatBuffer fbuffer = FloatBuffer.allocate(20); private static final Writes dataWrites = new Writes(null); private static final IntSeq hiddenIds = new IntSeq(); private static final IntSeq healthSeq = new IntSeq(maxSnapshotSize / 4 + 1); private static final Vec2 vector = new Vec2(); + private static final ClientBuildPlans plansOut = new ClientBuildPlans(); /** If a player goes away of their server-side coordinates by this distance, they get teleported back. */ private static final float correctDist = tilesize * 14f; @@ -97,7 +102,7 @@ public class NetServer implements ApplicationListener{ }; private boolean closing = false, pvpAutoPaused = true; - private Interval timer = new Interval(10); + //private Interval timer = new Interval(10); private IntSet buildHealthChanged = new IntSet(); /** Current kick session. */ @@ -409,7 +414,7 @@ public class NetServer implements ApplicationListener{ }else if(found.team() != player.team()){ player.sendMessage("[scarlet]Only players on your team can be kicked."); }else{ - Timekeeper vtime = cooldowns.get(player.uuid(), () -> new Timekeeper(voteCooldown)); + Timekeeper vtime = cooldowns.get(player.uuid(), () -> Timekeeper.ofSeconds(voteCooldown)); if(!vtime.get()){ player.sendMessage("[scarlet]You must wait " + voteCooldown/60 + " minutes between votekicks."); @@ -635,20 +640,33 @@ public class NetServer implements ApplicationListener{ return Float.isInfinite(f) || Float.isNaN(f); } + //sent from the client to the server in batches with the same incrementing groupId + @Remote(targets = Loc.client, unreliable = true, priority = PacketPriority.low) + public static void clientPlanSnapshot(Player player, int groupId, @Nullable ClientBuildPlans plans){ + if(player == null) return; + player.handlePreviewPlans(groupId, plans); + } + + //sent from the server to the client in batches with the same incrementing groupId + @Remote(targets = Loc.server, unreliable = true, priority = PacketPriority.low, variants = Variant.one) + public static void clientPlanSnapshotReceived(Player player, int groupId, @Nullable ClientBuildPlans plans){ + clientPlanSnapshot(player, groupId, plans); + } + @Remote(targets = Loc.client, unreliable = true, priority = PacketPriority.high) public static void clientSnapshot( - Player player, - int snapshotID, - int unitID, - boolean dead, - float x, float y, - float pointerX, float pointerY, - float rotation, float baseRotation, - float xVelocity, float yVelocity, - Tile mining, - boolean boosting, boolean shooting, boolean chatting, boolean building, - Block selectedBlock, int selectedRotation, @Nullable Queue plans, - float viewX, float viewY, float viewWidth, float viewHeight + Player player, + int snapshotID, + int unitID, + boolean dead, + float x, float y, + float pointerX, float pointerY, + float rotation, float baseRotation, + float xVelocity, float yVelocity, + Tile mining, + boolean boosting, boolean shooting, boolean chatting, boolean building, + Block selectedBlock, int selectedRotation, @Nullable Queue plans, + float viewX, float viewY, float viewWidth, float viewHeight ){ NetConnection con = player.con; if(con == null || snapshotID < con.lastReceivedClientSnapshot) return; @@ -1093,11 +1111,11 @@ public class NetServer implements ApplicationListener{ } }); - if(Groups.player.size() > 0 && Core.settings.getBool("blocksync") && timer.get(timerBlockSync, blockSyncTime)){ + if(Groups.player.size() > 0 && Core.settings.getBool("blocksync") && blockSyncTime.poll()){ writeBlockSnapshots(); } - if(Groups.player.size() > 0 && buildHealthChanged.size > 0 && timer.get(timerHealthSync, healthSyncTime)){ + if(Groups.player.size() > 0 && buildHealthChanged.size > 0 && healthSyncTime.poll()){ healthSeq.clear(); var iter = buildHealthChanged.iterator(); @@ -1124,11 +1142,63 @@ public class NetServer implements ApplicationListener{ buildHealthChanged.clear(); } + + //TODO: this system is a big bandwidth waster, it would be nicer to have a diff system instead + if(Groups.player.size() > 0 && planPreviewSyncTime.poll()){ + + if(!headless){ //update local player's plans so that clients see it + player.previewPlansCurrent.clear(); + control.input.getSyncedPlans(player.previewPlansCurrent); + player.previewPlansCurrent.truncate(maxPlayerPreviewPlans); + } + + Groups.player.each(player -> { + int id = ++player.lastPreviewPlanGroupServer; + plansOut.clear(); + + var plans = player.getPreviewPlans(); + + if(plans.isEmpty()){ + clientPlanSnapshotSend(player, id, null); + }else{ + BuildPlan[] items = plans.items; + int size = plans.size; + //max snapshot size = 800 + //max reasonable plan size = 12 + //divide the two to get the size of plan batches + final int chunkSize = 900 / 12; + + if(size < chunkSize){ + plansOut.set(plans); + clientPlanSnapshotSend(player, id, plansOut); + }else{ + for(int i = 0; i < size; i += chunkSize){ + int len = Math.min(i + chunkSize, size) - i; + plansOut.ensureCapacity(len); + System.arraycopy(items, i, plansOut.items, 0, len); + plansOut.size = len; + + clientPlanSnapshotSend(player, id, plansOut); + } + } + } + }); + } }catch(IOException e){ Log.err(e); } } + static void clientPlanSnapshotSend(Player player, int groupId, ClientBuildPlans plans){ + + //only send to others of the same team + for(Player other : player.team().data().players){ + if(other != player && !other.isLocal() && other.con != null && other.con.isConnected()){ + Call.clientPlanSnapshotReceived(other.con, player, groupId, plans); + } + } + } + public class VoteSession{ Player target; ObjectIntMap voted = new ObjectIntMap<>(); diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 4bbb531666..701d6ca758 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -39,7 +39,7 @@ public class Renderer implements ApplicationListener{ public @Nullable Bloom bloom; public @Nullable FrameBuffer backgroundBuffer; public FrameBuffer effectBuffer = new FrameBuffer(); - public boolean animateShields, animateWater, drawWeather = true, drawStatus, enableEffects, drawDisplays = true, drawLight = true, pixelate = false; + public boolean animateShields, animateWater, drawWeather = true, drawStatus, enableEffects, drawDisplays = true, drawLight = true, pixelate = false, showPings = true, showOtherBuildPlans = true; public float weatherAlpha; /** minZoom = zooming out, maxZoom = zooming in, used by cutscenes */ public float minZoom = 1.5f, maxZoom = 6f; @@ -173,6 +173,8 @@ public class Renderer implements ApplicationListener{ maxZoomInGame = settings.getFloat("maxzoomingamemultiplier", 1) * maxZoom; minZoomInGame = minZoom / settings.getFloat("minzoomingamemultiplier", 1); drawLight = settings.getBool("drawlight", true); + showPings = settings.getBool("showpings", true); + showOtherBuildPlans = settings.getBool("showotherbuildplans", true); pixelate = settings.getBool("pixelate"); //don't bother drawing landing animation if core is null diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index daaa194524..7342a8376c 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -78,6 +78,7 @@ public class UI implements ApplicationListener, Loadable{ public LogicDialog logic; public FullTextDialog fullText; public CampaignCompleteDialog campaignComplete; + public CampaignRulesDialog campaignRules; public IntMap followUpMenus; @@ -85,6 +86,11 @@ public class UI implements ApplicationListener, Loadable{ private @Nullable Element lastAnnouncement; + /** Maps popups to ids so that they can be removed or updated by id. */ + private final ObjectMap popups = new ObjectMap<>(); + /** Maps labels to ids so that they can be removed or updated by id. */ + private final IntMap labels = new IntMap<>(); + public UI(){ Fonts.loadFonts(); } @@ -112,11 +118,7 @@ public class UI implements ApplicationListener, Loadable{ Core.scene = new Scene(); Core.input.addProcessor(Core.scene); - int[] insets = Core.graphics.getSafeInsets(); - Core.scene.marginLeft = insets[0]; - Core.scene.marginRight = insets[1]; - Core.scene.marginTop = insets[2]; - Core.scene.marginBottom = insets[3]; + updateMargins(); Tex.load(); Icon.load(); @@ -219,6 +221,7 @@ public class UI implements ApplicationListener, Loadable{ logic = new LogicDialog(); fullText = new FullTextDialog(); campaignComplete = new CampaignCompleteDialog(); + campaignRules = new CampaignRulesDialog(); followUpMenus = new IntMap<>(); Group group = Core.scene.root; @@ -243,16 +246,31 @@ public class UI implements ApplicationListener, Loadable{ new FadeInFragment().build(group); } - @Override - public void resize(int width, int height){ - if(Core.scene == null) return; - + /** Updates scene margins based on safe insets and custom edge padding setting. */ + public void updateMargins(){ int[] insets = Core.graphics.getSafeInsets(); + int customPadding = (int)Scl.scl(Core.settings.getInt("uiEdgePadding", 0)); + Core.scene.marginLeft = insets[0]; Core.scene.marginRight = insets[1]; Core.scene.marginTop = insets[2]; Core.scene.marginBottom = insets[3]; + if(Core.graphics.getHeight() > Core.graphics.getWidth()){ + Core.scene.marginTop += customPadding; + Core.scene.marginBottom += customPadding; + }else{ + Core.scene.marginLeft += customPadding; + Core.scene.marginRight += customPadding; + } + } + + @Override + public void resize(int width, int height){ + if(Core.scene == null) return; + + updateMargins(); + Core.scene.resize(width, height); Events.fire(new ResizeEvent()); } @@ -394,28 +412,52 @@ public class UI implements ApplicationListener, Loadable{ } /** Shows a label at some position on the screen. Does not fade. */ - public void showInfoPopup(String info, float duration, int align, int top, int left, int bottom, int right){ + public void showInfoPopup(@Nullable String info, @Nullable String id, float duration, int align, int top, int left, int bottom, int right){ + if(info == null){ // null info allows deletion of old popups provided they have ids + var table = popups.remove(id); + if(table != null) table.remove(); + return; + } Table table = new Table(); + if(id != null){ + Table old = popups.put(id, table); + if(old != null) old.remove(); + } table.setFillParent(true); table.touchable = Touchable.disabled; table.update(() -> { - if(state.isMenu()) table.remove(); + if(state.isMenu()){ + table.remove(); + if(id != null) popups.remove(id); + } }); - table.actions(Actions.delay(duration), Actions.remove()); + table.actions(Actions.delay(duration), Actions.remove(), Actions.run(() -> { if(id != null) popups.remove(id); })); table.align(align).table(Styles.black3, t -> t.margin(4).add(info).style(Styles.outlineLabel)).pad(top, left, bottom, right); Core.scene.add(table); } /** Shows a label in the world. This label is behind everything. Does not fade. */ - public void showLabel(String info, float duration, float worldx, float worldy){ + public void showLabel(@Nullable String info, int id, float duration, float worldx, float worldy){ + if(info == null){ // null info allows deletion of old labels provided they have ids + var table = labels.remove(id); + if(table != null) table.remove(); + return; + } var table = new Table(Styles.black3).margin(4); + if(id != -1){ + Table old = labels.put(id, table); + if(old != null) old.remove(); + } table.touchable = Touchable.disabled; table.update(() -> { - if(state.isMenu()) table.remove(); + if(state.isMenu()){ + table.remove(); + if(id != -1) labels.remove(id); + } Vec2 v = Core.camera.project(worldx, worldy); table.setPosition(v.x, v.y, Align.center); }); - table.actions(Actions.delay(duration), Actions.remove()); + table.actions(Actions.delay(duration), Actions.remove(), Actions.run(() -> { if(id != -1) labels.remove(id); })); table.add(info).style(Styles.outlineLabel); table.pack(); table.act(0f); diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 49fe8dddaf..1dfc7ad0d4 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -20,6 +20,7 @@ import mindustry.content.*; import mindustry.core.GameState.*; import mindustry.game.*; import mindustry.game.MapObjectives.*; +import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.io.*; @@ -218,11 +219,22 @@ public class MapEditorDialog extends Dialog implements Disposable{ }); for(int i = 0; i < steps; i++){ + for(TeamData data : state.teams.getActive()){ + if(data.team.rules().fillItems && data.cores.size > 0){ + var core = data.cores.first(); + content.items().each(it -> { + if(it.isOnPlanet(Vars.state.getPlanet()) && !it.isHidden()){ + core.items.set(it, core.getMaximumAccepted(it)); + } + }); + } + } Time.update(); for(var build : builds){ build.update(); } Groups.powerGraph.update(); + Groups.bullet.update(); //needed for mass drivers... } //spawned units will cause havoc, so clear them diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 5d2b2837fb..21b5e739a4 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -158,8 +158,10 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{ Vars.control.sound.loop(Sounds.loopBuild, tile, 1.3f); } + boolean allowBuildCurrent = current.block != null && (state.isEditor() || (state.rules.waves && team == state.rules.waveTeam && current.block.isVisible()) || (current.block.unlockedNowHost() && current.block.environmentBuildable() && current.block.isPlaceable())); + if(!(tile.build instanceof ConstructBuild cb)){ - if(!current.initialized && !current.breaking && Build.validPlaceIgnoreUnits(current.block, team, current.x, current.y, current.rotation, true, true)){ + if(!current.initialized && !current.breaking && Build.validPlaceIgnoreUnits(current.block, team, current.x, current.y, current.rotation, true, true) && allowBuildCurrent){ if(Build.checkNoUnitOverlap(current.block, current.x, current.y)){ boolean hasAll = infinite || current.isRotation(team) || //derelict repair @@ -211,7 +213,7 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{ //otherwise, update it. if(current.breaking){ entity.deconstruct(self(), core, bs); - }else if(entity.current != null && (state.isEditor() || (state.rules.waves && team == state.rules.waveTeam && entity.current.isVisible()) || (entity.current.unlockedNowHost() && entity.current.environmentBuildable() && entity.current.isPlaceable()))){ //only allow building unlocked blocks + }else if(allowBuildCurrent){ //only allow building unlocked blocks entity.construct(self(), core, bs, current.config); } @@ -220,23 +222,6 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{ } } - /** Draw all current build plans. Does not draw the beam effect, only the positions. */ - void drawBuildPlans(){ - - for(int i = 0; i < 2; i++){ - for(BuildPlan plan : plans){ - if(plan.progress > 0.01f || (buildPlan() == plan && plan.initialized && (within(plan.x * tilesize, plan.y * tilesize, type.buildRange) || state.isEditor()))) continue; - if(i == 0){ - drawPlan(plan, 1f); - }else{ - drawPlanTop(plan, 1f); - } - } - } - - Draw.reset(); - } - void drawPlan(BuildPlan plan, float alpha){ plan.animScale = 1f; if(plan.breaking){ @@ -345,7 +330,7 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{ } //draw remote plans. - if(core != null && active && !isLocal() && !(tile.block() instanceof ConstructBlock)){ + if(core != null && active && !isLocal() && !(tile.block() instanceof ConstructBlock) && !state.isPaused()){ Draw.z(Layer.plans - 1f); drawPlan(plan, 0.5f); drawPlanTop(plan, 0.5f); diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 617a74fc96..b74ac37548 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -1341,6 +1341,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @CallSuper public void onRepaired(){ placed(); + if(block.flags.contains(BlockFlag.hasFogRadius)){ + fogControl.forceUpdate(team, self()); + } } public boolean isCommandable(){ diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index 1db95b9771..524f72bf4e 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -1,6 +1,7 @@ package mindustry.entities.comp; import arc.*; +import arc.audio.*; import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; @@ -105,6 +106,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ if(Vars.net.client()){ Vars.netClient.clearRemovedEntity(unit.id); } + Sounds.payloadPickup.at(self(), Mathf.random(0.9f, 1.1f)); Events.fire(new PickupEvent(self(), unit)); } @@ -114,6 +116,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ tile.afterPickedUp(); addPayload(new BuildPayload(tile)); Fx.unitPickup.at(tile); + Sounds.payloadPickup.at(self()); Events.fire(new PickupEvent(self(), tile)); } @@ -152,6 +155,26 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ return false; } + boolean canDropPayload(){ + if(payloads.isEmpty()) return false; + + Payload payload = payloads.peek(); + Tile on = tileOn(); + + if(on != null && on.build != null && on.build.team == team && on.build.acceptPayload(on.build, payload)) return true; + + if(payload instanceof BuildPayload b){ + Building tile = b.build; + int tx = World.toTile(x - tile.block.offset), ty = World.toTile(y - tile.block.offset); + on = Vars.world.tile(tx, ty); + return on != null && Build.validPlace(tile.block, tile.team, tx, ty, tile.rotation, false); + }else if(payload instanceof UnitPayload p){ + var u = p.unit; + return !(!u.canPass(World.toTile(x + Tmp.v1.x), World.toTile(y + Tmp.v1.y)) || Units.count(x, y, u.physicSize(), o -> o.isGrounded() && o.hitSize > 14f) > 1); + } + return false; + } + boolean dropUnit(UnitPayload payload){ Unit u = payload.unit; @@ -177,6 +200,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ if(!u.isAdded()) u.team.data().updateCount(u.type, -1); u.add(); u.unloaded(); + Sound dropSound = + payload.size() <= 12f ? Sounds.payloadDrop1 : + payload.size() <= 20f ? Sounds.payloadDrop2 : + Sounds.payloadDrop3; + dropSound.at(self(), Mathf.random(0.9f, 1.1f)); Events.fire(new PayloadDropEvent(self(), u)); return true; @@ -197,6 +225,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ Fx.unitDrop.at(tile); on.block().placeEffect.at(on.drawx(), on.drawy(), on.block().size); + on.block().placeSound.at(tile); return true; } diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index 3b32fe410a..7d0fc94107 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -4,7 +4,9 @@ import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import arc.util.pooling.*; import mindustry.*; @@ -17,6 +19,7 @@ import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.input.InputHandler.*; import mindustry.net.Administration.*; import mindustry.net.*; import mindustry.net.Packets.*; @@ -31,6 +34,7 @@ import static mindustry.Vars.*; @Component(base = true) abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Drawc{ static final float deathDelay = 60f; + static final float pingDuration = 20f * 60f; @Import float x, y; @@ -46,16 +50,60 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra boolean admin; String name = "frog"; Color color = new Color(); + transient String locale = "en"; transient float deathTimer; transient String lastText = ""; transient float textFadeTime; transient Ratekeeper itemDepositRate = new Ratekeeper(); + transient float pingX, pingY, pingTime; + transient @Nullable String pingText; transient private @Nullable Unit lastReadUnit; transient private int wrongReadUnits; transient @Nullable Unit justSwitchFrom, justSwitchTo; + transient int lastPreviewPlanGroup = -1, lastPreviewPlanGroupServer = -1; + transient long lastPreviewPlanTimestamp; + transient boolean receivingNewPlanGroup; + transient Seq previewPlansCurrent = new Seq<>(BuildPlan.class); + transient Seq previewPlansAssembling = new Seq<>(BuildPlan.class); + transient @Nullable QuadTree previewPlanTree; + transient @Nullable QueryEachable planEachable; + transient boolean previewPlansDirty; + + public Seq getPreviewPlans(){ + long timeToCommit = 100; //ms needed after first plan is received to "commit" the plans. + if(Time.timeSinceMillis(lastPreviewPlanTimestamp) >= timeToCommit && receivingNewPlanGroup){ + receivingNewPlanGroup = false; + previewPlansDirty = true; + previewPlansCurrent.set(previewPlansAssembling); + previewPlansAssembling.clear(); + } + + return previewPlansCurrent; + } + + public void handlePreviewPlans(int groupId, Seq plans){ + if(groupId > lastPreviewPlanGroup){ //new group received, prepare to add plans for this group + previewPlansAssembling.clear(); + lastPreviewPlanGroup = groupId; + receivingNewPlanGroup = true; + lastPreviewPlanTimestamp = Time.millis(); + }else if(groupId < lastPreviewPlanGroup){ //packet is outdated, likely sent out of order + return; + }else if(!receivingNewPlanGroup){ //the window has closed, no more plans will be received + return; + } + + if(plans == null) return; + + int added = Math.min(plans.size, maxPlayerPreviewPlans - previewPlansAssembling.size); + if(added > 0){ + previewPlansAssembling.addAll(plans, 0, added); + } + } + public boolean isBuilder(){ return unit != null && unit.canBuild(); } @@ -102,6 +150,15 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra admin = typing = false; textFadeTime = 0f; x = y = 0f; + lastPreviewPlanTimestamp = 0; + lastPreviewPlanGroup = -1; + lastPreviewPlanGroupServer = -1; + previewPlanTree = null; + planEachable = null; + previewPlansCurrent.clear(); + previewPlansAssembling.clear(); + receivingNewPlanGroup = false; + previewPlansDirty = false; if(!dead()){ unit.resetController(); unit = null; @@ -120,7 +177,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Replace public float clipSize(){ - return unit == null ? 20 : unit.type.hitSize * 2f; + return Float.MAX_VALUE; } @Override @@ -248,7 +305,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra unit.controller(this); //this player just became remote, snap the interpolation so it doesn't go wild - if(unit.isRemote()){ + if(unit.isRemote() && !net.client()){ unit.snapInterpolation(); } @@ -295,7 +352,48 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Override public void draw(){ - if(unit == null || name == null || unit.inFogTo(Vars.player.team())) return; + drawPing(); + drawName(); + } + + void drawPing(){ + if(pingTime <= 0f || !renderer.showPings || name == null || team != Vars.player.team()) return; + + float alpha = Math.min(Interp.pow5Out.apply(Mathf.clamp(Mathf.map(pingTime, 1f / 20f, 0f, 1f, 0f))), Interp.pow5Out.apply(Mathf.map(pingTime, 1f, 0.98f, 0f, 1f))); + + Tmp.c1.set(color).a(alpha); + + pingTime -= Time.delta / pingDuration; + + float s = Scl.scl(4) / renderer.getDisplayScale(); + + Draw.z(Layer.playerName); + float z = Drawf.text(); + float hover = Mathf.absin(5f, 1f); + float scaling = 1f + Mathf.clamp(Interp.pow5In.apply(Mathf.map(pingTime, 1f, 0.96f, 1f, 0f))) * 3f; + + Drawf.square(pingX, pingY, 2f * scaling * s, 45f, Tmp.c1, Tmp.c3.set(Color.darkGray).mul(color).a(Tmp.c1.a), s); + Drawf.fillPoly(pingX, pingY + 9f * s + hover * s, 3, 3f * s, -90f, Tmp.c1, Tmp.c3, s); + + if(pingText != null){ + Drawf.text(name, pingX, pingY + (20f + hover)*s, Tmp.c1, 0.7f * s); + Drawf.text(pingText, pingX, pingY + (16f + hover)*s, Tmp.c2.set(1f, 1f, 1f, Tmp.c1.a), s); + }else{ + Drawf.text(name, pingX, pingY + (16f + hover)*s, Tmp.c1, s); + } + + Draw.reset(); + Draw.z(z); + } + + void drawName(){ + //check clipping for name + if(unit == null || name == null) return; + + float clip = unit.type.hitSize * 2f; + if(!Core.camera.bounds(Tmp.r1).overlaps(x - clip/2f, y - clip/2f, clip, clip)) return; + + if(name == null || unit.inFogTo(Vars.player.team())) return; Draw.z(Layer.playerName); float z = Drawf.text(); diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 4f4063a35b..a17ff10149 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -825,7 +825,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I //boost if possible if(type.canBoost){ elevation = 1f; - }else if(!net.client()){ + }else if(!net.client() && !(!headless && isRemote())){ kill(); } } @@ -864,12 +864,12 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I float power = item().charge * Mathf.pow(stack().amount, 1.11f) * 160f; if(!spawnedByCore){ - Damage.dynamicExplosion(x, y, flammability, explosiveness, power, (bounds() + type.legLength/1.7f) / 2f, state.rules.damageExplosions && state.rules.unitCrashDamage(team) > 0, item().flammability > 1, team, type.deathExplosionEffect); + Damage.dynamicExplosion(x, y, flammability, explosiveness, power, (bounds() + type.legLength/1.7f) / 2f, state.rules.damageExplosions && state.rules.unitCrashDamage(team) > 0, item().flammability > 1, team, type.deathExplosionEffect, 0f); }else{ type.deathExplosionEffect.at(x, y, bounds() / 2f / 8f); } - float shake = type.deathShake < 0 ? hitSize / 3f : type.deathShake; + float shake = type.deathShake < 0 ? 3f + hitSize / 3f : type.deathShake; if(type.createScorch){ Effect.scorch(x, y, (int)(hitSize / 5)); diff --git a/core/src/mindustry/entities/comp/WorldLabelComp.java b/core/src/mindustry/entities/comp/WorldLabelComp.java index 51b63c536e..84e4db9ebf 100644 --- a/core/src/mindustry/entities/comp/WorldLabelComp.java +++ b/core/src/mindustry/entities/comp/WorldLabelComp.java @@ -24,6 +24,9 @@ public abstract class WorldLabelComp implements Posc, Drawc, Syncc{ public float fontSize = 1f, z = Layer.playerName + 1; /** Flags are packed into a byte for sync efficiency; see the flag static values. */ public byte flags = flagBackground | flagOutline; + //TODO: add this in 157 + /** If not null, this label gets set to the parent position with x, y used as offsets. */ + //public @Nullable Entityc parent; @Replace public float clipSize(){ @@ -32,6 +35,13 @@ public abstract class WorldLabelComp implements Posc, Drawc, Syncc{ @Override public void draw(){ + //TODO: add this in 157 + /* + float x = this.x, y = this.y; + if(parent instanceof Posc p){ + x += p.x(); + y += p.y(); + }*/ drawAt(text, x, y, z, flags, fontSize, Align.center, (flags & flagAlignLeft) != 0 ? Align.left : (flags & flagAlignRight) != 0 ? Align.right : Align.center); } diff --git a/core/src/mindustry/entities/part/EffectSpawnerPart.java b/core/src/mindustry/entities/part/EffectSpawnerPart.java index 3931781108..8c4881fc6c 100644 --- a/core/src/mindustry/entities/part/EffectSpawnerPart.java +++ b/core/src/mindustry/entities/part/EffectSpawnerPart.java @@ -3,29 +3,38 @@ package mindustry.entities.part; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.util.*; import mindustry.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.graphics.*; -import static arc.math.Mathf.random; +import static arc.math.Mathf.*; import static arc.util.Tmp.*; -/**Spawns effects in a rectangle centered on x and y.*/ +/** Spawns effects in a rectangle centered on x and y. */ public class EffectSpawnerPart extends DrawPart{ public float x, y, width, height, rotation; public boolean mirror = false; - public float effectChance = 0.1f, effectRot, effectRandRot; + public float effectRot, effectRandRot; + /** If >0, the interval, in ticks, between effect spawns. */ + public float effectInterval = 0f; + /** If >0, this is the interval at 0 progress. useProgress is ignored. */ + public float effectIntervalFrom; + public float effectChance = 0.1f; public Effect effect = Fx.sparkShoot; public Color effectColor = Color.white; + /** If true, effectChance will be scaled by progress. */ public boolean useProgress = true; public PartProgress progress = PartProgress.warmup; - /**Shows the spawn rectangles in red.*/ + /** Shows the spawn rectangles in red. */ public boolean debugDraw = false; + protected float effectIntervalState = 0f; + @Override public void draw(PartParams params){ if(debugDraw){ @@ -44,13 +53,16 @@ public class EffectSpawnerPart extends DrawPart{ if(Vars.state.isPaused()) return; + float realInterval = effectIntervalFrom > 0 ? Mathf.lerp(effectIntervalFrom, effectInterval, progress.getClamp(params)) : effectInterval; + for(int i = 0; i < (mirror ? 2 : 1); i++){ - if(!Vars.state.isPaused() && Mathf.chanceDelta(effectChance * (useProgress ? progress.getClamp(params) : 1f))){ + if(!Vars.state.isPaused() && (realInterval > 0f ? (effectIntervalState += Time.delta) >= realInterval : Mathf.chanceDelta(effectChance * (useProgress ? progress.getClamp(params) : 1f)))){ float sign = (i == 0 ? 1f : -1f), rot = params.rotation + (rotation * sign); v1.set(x * sign, y).rotate(params.rotation - 90).add(params.x, params.y); v1.add(v2.set(random(-height * 0.5f, height * 0.5f), random(-width * 0.5f, width * 0.5f)).rotate(rot)); effect.at(v1.x, v1.y, rot + (effectRot * sign) + random(-effectRandRot, effectRandRot), effectColor); + if(realInterval > 0) effectIntervalState %= realInterval; } } } diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index 61f3ce7bd5..39fe8c3573 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -4,6 +4,8 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.*; +import mindustry.ai.*; +import mindustry.ai.types.*; import mindustry.async.*; import mindustry.entities.*; import mindustry.game.*; @@ -53,6 +55,13 @@ public class AIController implements UnitController{ updateMovement(); } + public boolean hasStance(@Nullable UnitStance stance){ + if(unit.controller() instanceof CommandAI ai){ + return ai.hasStance(stance); + } + return false; + } + /** Called when the parent CommandAI changes its stance. */ public void stanceChanged(){} diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index fa1d71ee16..e6f1b98465 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -13,11 +13,13 @@ public class CampaignRules{ public boolean legacyLaunchPads; public boolean rtsAI; public boolean clearSectorOnLose; + public boolean pauseDisabled; public void apply(Planet planet, Rules rules){ rules.staticFog = rules.fog = fog; rules.showSpawns = showSpawns; rules.randomWaveAI = randomWaveAI; + rules.pauseDisabled = pauseDisabled; rules.objectiveTimerMultiplier = difficulty.waveTimeMultiplier; if(planet.showRtsAIRule){ boolean enabled = rtsAI && rules.attackMode; //if attackMode becomes false (waves enabled), turn off RTS AI diff --git a/core/src/mindustry/game/CampaignStats.java b/core/src/mindustry/game/CampaignStats.java new file mode 100644 index 0000000000..c411ec3597 --- /dev/null +++ b/core/src/mindustry/game/CampaignStats.java @@ -0,0 +1,31 @@ +package mindustry.game; + +import arc.struct.*; +import mindustry.type.*; +import mindustry.world.*; + +/** Statistics for a specific planet's campaign. */ +public class CampaignStats{ + /** Enemy units destroyed by type. */ + public ObjectIntMap enemyUnitsDestroyed = new ObjectIntMap<>(); + /** Record of enemy blocks that have been destroyed (from any source) by count. */ + public ObjectIntMap enemyBuildingsDestroyed = new ObjectIntMap<>(); + /** Player team units produced by type. */ + public ObjectIntMap unitsProduced = new ObjectIntMap<>(); + /** Player team units destroyed by type. */ + public ObjectIntMap unitsDestroyed = new ObjectIntMap<>(); + /** Record of blocks that have been placed by count. */ + public ObjectIntMap buildingsBuilt = new ObjectIntMap<>(); + /** Record of blocks that have been placed by count. */ + public ObjectIntMap buildingsDeconstructed = new ObjectIntMap<>(); + /** Record of blocks that have been placed by count. */ + public ObjectIntMap buildingsDestroyed = new ObjectIntMap<>(); + /** Total campaign playtime in milliseconds. */ + public long playtime; + /** Total game-overs. */ + public int sectorsLost; + /** Total times a sector has been captured. If you lose (or get invaded) and re-capture something, this still counts. */ + public int sectorsCaptured; + /** Total waves lasted. */ + public int wavesLasted; +} diff --git a/core/src/mindustry/game/Difficulty.java b/core/src/mindustry/game/Difficulty.java index e6f34ef002..c62a06ec07 100644 --- a/core/src/mindustry/game/Difficulty.java +++ b/core/src/mindustry/game/Difficulty.java @@ -3,8 +3,7 @@ package mindustry.game; import arc.*; public enum Difficulty{ - //TODO these need tweaks - casual(0.75f, 0.5f, 2f), + casual(0.5f, 0.5f, 2f), easy(1f, 0.75f, 1.5f), normal(1f, 1f, 1f), hard(1.25f, 1.5f, 0.8f), diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index da8c7c4a7b..917529014e 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -6,6 +6,7 @@ import arc.util.*; import mindustry.core.GameState.*; import mindustry.ctype.*; import mindustry.gen.*; +import mindustry.graphics.MultiPacker; import mindustry.net.*; import mindustry.net.Packets.*; import mindustry.type.*; @@ -78,16 +79,18 @@ public class EventType{ public static class TurnEvent{} /** Called when the player places a line, mobile or desktop.*/ public static class LineConfirmEvent{} - /** Called when a turret receives ammo, but only when the tutorial is active! */ - public static class TurretAmmoDeliverEvent{} - /** Called when a core receives ammo, but only when the tutorial is active! */ - public static class CoreItemDeliverEvent{} /** Called when the player opens info for a specific block.*/ public static class BlockInfoEvent{} /** Called *after* all content has been initialized. */ public static class ContentInitEvent{} /** Called *after* all content has been added to the atlas, but before its pixmaps are disposed. */ - public static class AtlasPackEvent{} + public static class AtlasPackEvent{ + public final MultiPacker multiPacker; + + public AtlasPackEvent(MultiPacker multiPacker){ + this.multiPacker = multiPacker; + } + } /** Called *after* all mod content has been loaded, but before it has been initialized. */ public static class ModContentLoadEvent{} /** Called when the client game is first loaded. */ diff --git a/core/src/mindustry/game/GameStats.java b/core/src/mindustry/game/GameStats.java index 2ed099532d..531e4cb914 100644 --- a/core/src/mindustry/game/GameStats.java +++ b/core/src/mindustry/game/GameStats.java @@ -22,7 +22,7 @@ public class GameStats{ /** Record of enemy blocks that have been destroyed (from any source) by count. */ public ObjectIntMap destroyedBlockCount = new ObjectIntMap<>(); /** - * Record of items that have entered the core through transport blocks. Used for objectives only. + * Record of items that have entered the core through transport blocks. Used for tutorial objectives only. * This can easily be ""spoofed"" with unloaders, so don't use it for anything remotely important. * */ public ObjectIntMap coreItemCount = new ObjectIntMap<>(); diff --git a/core/src/mindustry/game/MapObjectives.java b/core/src/mindustry/game/MapObjectives.java index 8c1f602754..628d49c6a9 100644 --- a/core/src/mindustry/game/MapObjectives.java +++ b/core/src/mindustry/game/MapObjectives.java @@ -26,6 +26,7 @@ import mindustry.world.*; import mindustry.world.blocks.logic.CanvasBlock.*; import mindustry.world.blocks.logic.LogicDisplay.*; +import java.io.*; import java.lang.annotation.*; import java.util.*; @@ -176,7 +177,7 @@ public class MapObjectives implements Iterable, Eachable, Eachable, Eachable more cautious. */ public float rtsMinWeight = 1.2f; + /** Time until unit factories activate. This is used for enemy teams in attack maps. */ + public float unitFactoryActivationDelay = 0f; /** How fast unit factories build units. */ public float unitBuildSpeedMultiplier = 1f; /** How much damage units deal. */ diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 720fc0fe8a..5218eec98b 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -7,6 +7,7 @@ import arc.graphics.*; import arc.struct.*; import arc.util.*; import mindustry.*; +import mindustry.content.*; import mindustry.core.GameState.*; import mindustry.game.EventType.*; import mindustry.io.*; @@ -46,6 +47,20 @@ public class Saves{ }); } + private void clearOldMegabaseSectors(){ + IntSet serpuloRemoval = IntSet.with(27, 245, 244, 243, 242, 247, 246, 237, 150, 157, 138, 251, 103); + + //clear old megabase sectors from the beta period + saves.removeAll(s -> { + if(s.getSector() != null && s.getSector().planet == Planets.serpulo && serpuloRemoval.contains(s.getSector().id) && s.meta.build < 157 && s.meta.build > 146){ + s.getSector().clearInfo(); + s.file.delete(); + return true; + } + return false; + }); + } + public void load(){ saves.clear(); @@ -70,6 +85,8 @@ public class Saves{ } } + clearOldMegabaseSectors(); + lastSectorSave = saves.find(s -> s.isSector() && s.getName().equals(Core.settings.getString("last-sector-save", ""))); class Remap{ @@ -153,6 +170,7 @@ public class Saves{ //process remaps later to allow swaps of sectors for(var remap : remaps){ + if(remap.sourceSector.planet == Planets.serpulo) Vars.hadSerpuloRemaps = true; var remapTarget = remap.destSector; //overwrite the target sector's info with the save's info @@ -187,7 +205,11 @@ public class Saves{ if(current != null && state.isGame() && !(state.isPaused() && Core.scene.hasDialog())){ if(lastTimestamp != 0){ - totalPlaytime += Time.timeSinceMillis(lastTimestamp); + long change = Time.timeSinceMillis(lastTimestamp); + totalPlaytime += change; + if(state.isCampaign()){ + state.getPlanet().stats().playtime += change; + } } lastTimestamp = Time.millis(); } diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 15159d0b47..f7e2193588 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -23,6 +23,7 @@ import mindustry.game.EventType.*; import mindustry.game.Schematic.*; import mindustry.gen.*; import mindustry.input.*; +import mindustry.input.InputHandler.*; import mindustry.input.Placement.*; import mindustry.io.*; import mindustry.io.TypeIO.*; @@ -48,6 +49,7 @@ public class Schematics implements Loadable{ private static final byte[] header = {'m', 's', 'c', 'h'}; private static final byte version = 1; + private static final boolean limitSchematicSize = true; private static final int padding = 2; private static final int maxPreviewsMobile = 32; @@ -172,7 +174,7 @@ public class Schematics implements Loadable{ public void savePreview(Schematic schematic, Fi file){ FrameBuffer buffer = getBuffer(schematic); Draw.flush(); - buffer.begin(Color.clear); + buffer.begin(); Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(0, 0, buffer.getWidth(), buffer.getHeight()); file.writePng(pixmap); buffer.end(); @@ -251,14 +253,16 @@ public class Schematics implements Loadable{ //scale each plan to fit schematic Draw.trans().scale(resolution / tilesize, resolution / tilesize).translate(tilesize*1.5f, tilesize*1.5f); + QueryEachable eachPlans = new QueryEachable(null, plans); + //draw plans plans.each(req -> { req.animScale = 1f; req.worldContext = false; - req.block.drawPlanRegion(req, plans); + req.block.drawPlanRegion(req, eachPlans); }); - plans.each(req -> req.block.drawPlanConfigTop(req, plans)); + plans.each(req -> req.block.drawPlanConfigTop(req, eachPlans)); Draw.flush(); Draw.trans().idt(); @@ -550,7 +554,7 @@ public class Schematics implements Loadable{ try(DataInputStream stream = new DataInputStream(new InflaterInputStream(input))){ short width = stream.readShort(), height = stream.readShort(); - if(width > 128 || height > 128) throw new IOException("Invalid schematic: Too large (max possible size is 128x128)"); + if(limitSchematicSize && (width > 128 || height > 128)) throw new IOException("Invalid schematic: Too large (max possible size is 128x128)"); StringMap map = new StringMap(); int tags = stream.readUnsignedByte(); @@ -591,7 +595,7 @@ public class Schematics implements Loadable{ int total = stream.readInt(); - if(total > 128 * 128) throw new IOException("Invalid schematic: Too many blocks."); + if(limitSchematicSize && total > 128 * 128) throw new IOException("Invalid schematic: Too many blocks."); Reads read = new Reads(stream); diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index a58634982a..281a38dc99 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -123,6 +123,11 @@ public class Team implements Comparable, Senseable{ return isAI() && !rules().rtsAi; } + /** @return whether unit factories should be active, according to the game rule. */ + public boolean activateUnitFactories(){ + return state.tick >= rules().unitFactoryActivationDelay; + } + public Seq cores(){ return state.teams.cores(this); } diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index d39cfd9797..cce0e78217 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -550,7 +550,6 @@ public class BlockRenderer{ } if(drawQuadtreeDebug){ - //TODO remove Draw.z(Layer.overlayUI); Lines.stroke(1f, Color.green); diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index 532939f4ff..2c5ebb4a5d 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -5,10 +5,12 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.ctype.*; import mindustry.gen.*; +import mindustry.ui.*; import mindustry.world.*; import java.util.*; @@ -19,6 +21,31 @@ public class Drawf{ private static final Vec2[] vecs = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()}; private static final FloatSeq points = new FloatSeq(); + public static void text(String text, float x, float y, Color color){ + text(text, x, y, color, 1f, Align.center); + } + + public static void text(String text, float x, float y, Color color, float scale){ + text(text, x, y, color, scale, Align.center); + } + + public static void text(String text, float x, float y, Color color, float scale, int align){ + Font font = Fonts.outline; + boolean ints = font.usesIntegerPositions(); + font.setUseIntegerPositions(false); + font.getData().setScale(0.25f / Scl.scl(1f) * scale); + font.setColor(color); + font.getCache().clear(); + font.getCache().addText(text, x, y, 0f, align, false); + if(color.a < 1f){ + font.getCache().setAlphas(color.a); + } + font.getCache().draw(); + font.getData().setScale(1f); + font.setColor(Color.white); + font.setUseIntegerPositions(ints); + } + /** Bleeds a mod pixmap if linear filtering is enabled. */ public static void checkBleed(Pixmap pixmap){ if(Core.settings.getBool("linear", true)){ @@ -387,10 +414,18 @@ public class Drawf{ } public static void square(float x, float y, float radius, float rotation, Color color){ - Lines.stroke(3f, Pal.gray.write(Tmp.c3).a(color.a)); - Lines.square(x, y, radius + 1f, rotation); - Lines.stroke(1f, color); - Lines.square(x, y, radius + 1f, rotation); + square(x, y, radius, rotation, color, Pal.gray.write(Tmp.c3).a(color.a)); + } + + public static void square(float x, float y, float radius, float rotation, Color color, Color bgColor){ + square(x, y, radius, rotation, color, bgColor, 1f); + } + + public static void square(float x, float y, float radius, float rotation, Color color, Color bgColor, float scaling){ + Lines.stroke(3f * scaling, bgColor); + Lines.square(x, y, radius + 1f * scaling, rotation); + Lines.stroke(1f * scaling, color); + Lines.square(x, y, radius + 1f * scaling, rotation); Draw.reset(); } @@ -412,6 +447,18 @@ public class Drawf{ Draw.reset(); } + public static void fillPoly(float x, float y, int sides, float radius, float rotation, Color color){ + fillPoly(x, y, sides, radius, rotation, color, Pal.gray, 1f); + } + + public static void fillPoly(float x, float y, int sides, float radius, float rotation, Color color, Color bgColor, float scl){ + Draw.color(bgColor, color.a); + Fill.poly(x, y, sides, radius + 2f*scl, rotation); + Draw.color(color); + Fill.poly(x, y, sides, radius, rotation); + Draw.reset(); + } + public static void square(float x, float y, float radius, float rotation){ square(x, y, radius, rotation, Pal.accent); } @@ -454,6 +501,10 @@ public class Drawf{ } public static void laser(TextureRegion line, TextureRegion start, TextureRegion end, float x, float y, float x2, float y2, float scale){ + laser(line, start, end, x, y, x2, y2, scale, true); + } + + public static void laser(TextureRegion line, TextureRegion start, TextureRegion end, float x, float y, float x2, float y2, float scale, boolean light){ float scl = 8f * scale * Draw.scl, rot = Mathf.angle(x2 - x, y2 - y); float vx = Mathf.cosDeg(rot) * scl, vy = Mathf.sinDeg(rot) * scl; @@ -464,7 +515,7 @@ public class Drawf{ Lines.line(line, x + vx, y + vy, x2 - vx, y2 - vy, false); Lines.stroke(1f); - light(x, y, x2, y2); + if(light) light(x, y, x2, y2); } public static void tri(float x, float y, float width, float length, float rotation){ diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index 80892c6242..e8026b2160 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -165,11 +165,36 @@ public class MinimapRenderer{ Draw.reset(); } - if(fullView && net.active()){ + if(fullView){ for(Player player : Groups.player){ - if(!player.dead()){ + if(!player.dead() && net.active()){ drawLabel(player.x, player.y, player.name, player.color, scaleFactor); } + if(player.pingTime > 0f && renderer.showPings){ + + float rad = 12f; + + Draw.color(Tmp.c1.set(player.color).mul(Color.darkGray)); + Lines.stroke(Scl.scl(scaleFactor * 9f)); + Lines.poly(player.pingX, player.pingY, 4, scaleFactor * rad, 0f); + + Fill.poly(player.pingX, player.pingY + scaleFactor * 30f, 3, scaleFactor * 16f, -90f); + + Draw.color(player.color); + Lines.stroke(Scl.scl(scaleFactor * 3f)); + Lines.poly(player.pingX, player.pingY, 4, scaleFactor * rad, 0f); + + Fill.poly(player.pingX, player.pingY + scaleFactor * 30f, 3, scaleFactor * 10f, -90f); + + if(player.pingText != null){ + drawLabel(player.pingX, player.pingY + scaleFactor * 65f, player.name, player.color, scaleFactor * 0.7f, false); + drawLabel(player.pingX, player.pingY + scaleFactor * 50f, player.pingText, Color.white, scaleFactor, false); + }else{ + drawLabel(player.pingX, player.pingY + scaleFactor * 50f, player.name, player.color, scaleFactor, false); + } + + Draw.color(); + } } } @@ -376,6 +401,10 @@ public class MinimapRenderer{ } public void drawLabel(float x, float y, String text, Color color, float scaleFactor){ + drawLabel(x, y, text, color ,scaleFactor, true); + } + + public void drawLabel(float x, float y, String text, Color color, float scaleFactor, boolean bg){ Font font = Fonts.outline; GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new); boolean ints = font.usesIntegerPositions(); @@ -383,14 +412,16 @@ public class MinimapRenderer{ font.setUseIntegerPositions(false); l.setText(font, text, color, 90f * scaleFactor, Align.left, false); - float yOffset = 20f; - float margin = 3f * scaleFactor; - Draw.color(0f, 0f, 0f, 0.2f); - Fill.rect(x, y + yOffset - l.height/2f, l.width + margin, l.height + margin); - Draw.color(); + if(bg){ + float margin = 3f * scaleFactor; + Draw.color(0f, 0f, 0f, 0.2f); + Fill.rect(x, y + l.height/2f - l.height/2f, l.width + margin, l.height + margin); + Draw.color(); + } + font.setColor(color); - font.draw(text, x - l.width/2f, y + yOffset, 90f * scaleFactor, Align.left, false); + font.draw(text, x - l.width/2f, y + l.height/2f, 90f * scaleFactor, Align.left, false); font.setUseIntegerPositions(ints); font.getData().setScale(1f); diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 78533c7fe7..d2b4207635 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -77,8 +77,12 @@ public class OverlayRenderer{ if(player.dead()) return; + if(renderer.showOtherBuildPlans){ + input.drawOtherBuildPlans(); + } + if(player.isBuilder()){ - player.unit().drawBuildPlans(); + input.drawBuildPlans(); } input.drawBottom(); diff --git a/core/src/mindustry/input/Binding.java b/core/src/mindustry/input/Binding.java index 9842b3c3e9..617cba8e97 100644 --- a/core/src/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -28,6 +28,7 @@ public class Binding{ rotatePlaced = KeyBind.add("rotateplaced", KeyCode.r), diagonalPlacement = KeyBind.add("diagonal_placement", KeyCode.controlLeft), pick = KeyBind.add("pick", KeyCode.mouseMiddle), + ping = KeyBind.add("ping", KeyCode.p), rebuildSelect = KeyBind.add("rebuild_select", KeyCode.b), schematicSelect = KeyBind.add("schematic_select", KeyCode.f), @@ -51,6 +52,8 @@ public class Binding{ unitStancePursueTarget = KeyBind.add("unit_stance_pursue_target", KeyCode.unset), unitStancePatrol = KeyBind.add("unit_stance_patrol", KeyCode.unset), unitStanceRam = KeyBind.add("unit_stance_ram", KeyCode.unset), + unitStanceBoost = KeyBind.add("unit_stance_boost", KeyCode.unset), + unitStanceHoldPosition = KeyBind.add("unit_stance_hold_position", KeyCode.unset), unitCommandMove = KeyBind.add("unit_command_move", KeyCode.unset), unitCommandRepair = KeyBind.add("unit_command_repair", KeyCode.unset), @@ -93,7 +96,7 @@ public class Binding{ planetMap = KeyBind.add("planet_map", KeyCode.n), blockInfo = KeyBind.add("block_info", KeyCode.f1), toggleMenus = KeyBind.add("toggle_menus", KeyCode.c), - screenshot = KeyBind.add("screenshot", KeyCode.p), + screenshot = KeyBind.add("screenshot", KeyCode.f12), togglePowerLines = KeyBind.add("toggle_power_lines", KeyCode.f5), toggleBlockStatus = KeyBind.add("toggle_block_status", KeyCode.f6), playerList = KeyBind.add("player_list", KeyCode.tab, "multiplayer"), diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index c50c591559..108e30dbbc 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -159,7 +159,7 @@ public class DesktopInput extends InputHandler{ drawArrow(splan.block, splan.x, splan.y, splan.rotation, valid); } - splan.block.drawPlan(splan, allPlans(), valid); + splan.block.drawPlan(splan, allPlans, valid); drawSelected(splan.x, splan.y, splan.block, getPlan(splan.x, splan.y, splan.block.size, splan) != null ? Pal.remove : Pal.accent); } @@ -214,7 +214,7 @@ public class DesktopInput extends InputHandler{ Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime, 6f, 0.28f)); bplan.set(cursorX, cursorY, rot, block); bplan.config = block.lastConfig; - block.drawPlanConfig(bplan, allPlans()); + block.drawPlanConfig(bplan, allPlans); bplan.config = null; Draw.reset(); } @@ -475,6 +475,14 @@ public class DesktopInput extends InputHandler{ } } + if(input.keyTap(Binding.ping) && !Core.scene.hasMouse() && !scene.hasKeyboard()){ + if(input.ctrl()){ + ui.showTextInput("", "@ping.text", Vars.maxPingTextLength, "", result -> Call.pingLocation(Vars.player, input.mouseWorldX(), input.mouseWorldY(), UI.formatIcons(result))); + }else{ + Call.pingLocation(Vars.player, input.mouseWorldX(), input.mouseWorldY(), null); + } + } + if(Core.input.keyRelease(Binding.select) && commandRect){ selectUnitsRect(); } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 68bb108c22..9c71c2c580 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -118,25 +118,17 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ private Seq plansOut = new Seq<>(BuildPlan.class); private QuadTree playerPlanTree = new QuadTree<>(new Rect()); + private QuadTree selectPlanTree = new QuadTree<>(new Rect()); public final BlockInventoryFragment inv; public final BlockConfigFragment config; public final PlanConfigFragment planConfig; private WidgetGroup group = new WidgetGroup(); + private BuildPlan overlappingPlan = null; + private Player overlappingPlayer = null; - private final Eachable allPlans = cons -> { - if(!player.dead()){ - player.unit().plans().each(cons); - } - selectPlans.each(cons); - linePlans.each(cons); - }; - - private final Eachable allSelectLines = cons -> { - selectPlans.each(cons); - linePlans.each(cons); - }; + protected Eachable allPlans, allSelectLines, allRenderPlansConfig; public InputHandler(){ group.touchable = Touchable.childrenOnly; @@ -144,6 +136,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ config = new BlockConfigFragment(); planConfig = new PlanConfigFragment(); + createPlanLists(); + Events.on(UnitDestroyEvent.class, e -> { if(e.unit != null && e.unit.isPlayer() && e.unit.getPlayer().isLocal() && e.unit.type.weapons.contains(w -> w.bullet.killShooter)){ player.shooting = false; @@ -152,6 +146,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Events.on(WorldLoadEvent.class, e -> { playerPlanTree = new QuadTree<>(new Rect(0f, 0f, world.unitWidth(), world.unitHeight())); + selectPlanTree = new QuadTree<>(new Rect(0f, 0f, world.unitWidth(), world.unitHeight())); + createPlanLists(); }); Events.on(ResetEvent.class, e -> { @@ -286,6 +282,23 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + @Remote(called = Loc.server, targets = Loc.both, forward = true) + public static void pingLocation(Player player, float x, float y, @Nullable String text){ + if(net.server() && !netServer.admins.allowAction(player, ActionType.pingLocation, event -> { + event.pingX = x; + event.pingY = y; + event.pingText = text; + })) throw new ValidateException(player, "Player was not allowed to ping a location."); + + if(player != null && Vars.player != null && player.team() == Vars.player.team()){ + player.pingX = x; + player.pingY = y; + player.pingTime = 1f; + player.pingText = text == null || text.isEmpty() ? null : + ((text.length() > maxPingTextLength ? text.substring(0, maxPingTextLength) + "..." : text)); + } + } + public static void createItemTransfer(Item item, int amount, float x, float y, Position to, Runnable done){ Fx.itemTransfer.at(x, y, amount, item.color, to); if(done != null){ @@ -853,6 +866,27 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.deathTimer = Player.deathDelay + 1f; //for instant respawn } + protected void createPlanLists(){ + allPlans = new QueryEachable(playerPlanTree, linePlans){ + @Override + public BuildPlan find(int x, int y, int size, Boolf check){ + BuildPlan plan = super.find(x, y, size, check); + if(plan != null) return plan; + + return selectPlanTree.find(x * tilesize - tilesize/2f * size, y * tilesize - tilesize/2f * size, size * tilesize, size * tilesize, check); + } + }; + allSelectLines = new QueryEachable(null, selectPlans, linePlans); + allRenderPlansConfig = new QueryEachable(playerPlanTree, selectPlans); + } + + public void updateSelectQuadtree(){ + selectPlanTree.clear(); + for(var plan : selectPlans){ + selectPlanTree.insert(plan); + } + } + /** Adds an input lock; if this function returns true, input is locked. Used for mod 'cutscenes' or custom camera panning. */ public void addLock(Boolp lock){ inputLocks.add(lock); @@ -887,6 +921,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.shooting = false; } + public void getSyncedPlans(Seq out){ + for(var plan : lastPlans){ + if(!plan.breaking){ + out.add(plan); + } + } + } + public void update(){ if(spectating != null && (!spectating.isValid() || spectating.team != player.team())){ spectating = null; @@ -994,8 +1036,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Call.requestUnitPayload(player, target); }else{ Building build = world.buildWorld(pay.x(), pay.y()); + if(build == null) return; + Payload current = build.getPayload(); - if(build != null && state.teams.canInteract(unit.team, build.team)){ + if(state.teams.canInteract(unit.team, build.team) && + ((current != null && pay.canPickupPayload(current)) || (build.block.buildVisibility != BuildVisibility.hidden && build.canPickup() && pay.canPickup(build)))){ Call.requestBuildPayload(player, build); } } @@ -1003,7 +1048,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void tryDropPayload(){ Unit unit = player.unit(); - if(!(unit instanceof Payloadc)) return; + if(!(unit instanceof Payloadc pay) || !pay.canDropPayload()) return; Call.requestDropPayload(player, player.x, player.y); } @@ -1329,6 +1374,104 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } + //prevents allocation + private static BuildPlan sameQuadPlan; + private static final Boolf sameQuadPlanFinder = b -> b.block == sameQuadPlan.block && b.x == sameQuadPlan.x && b.y == sameQuadPlan.y; + + /** Draws build plans of other players. */ + public void drawOtherBuildPlans(){ + Tmp.v3.set(input.mouseWorld()); + overlappingPlan = null; + overlappingPlayer = null; + + Groups.player.each(player -> { + var plans = player.getPreviewPlans(); + if(player == Vars.player || player.team() != Vars.player.team()){ + plans.clear(); //don't keep irrelevant plans around + return; + } + + if(player.previewPlanTree == null){ + player.previewPlanTree = new QuadTree<>(playerPlanTree.bounds); + player.planEachable = new QueryEachable(player.previewPlanTree); + } + + if(player.previewPlansDirty){ + player.previewPlansDirty = false; + //retain animation state + for(BuildPlan plan : plans){ + sameQuadPlan = plan; + BuildPlan prev = player.previewPlanTree.find(plan.drawx(), plan.drawy(), 1f, 1f, sameQuadPlanFinder); + if(prev != null){ + plan.animScale = prev.animScale; + } + } + player.previewPlanTree.clear(); + for(BuildPlan plan : plans){ + player.previewPlanTree.insert(plan); + } + } + + BuildPlan current = player.isBuilder() ? player.unit().buildPlan() : null; + camera.bounds(Tmp.r1); + + player.previewPlanTree.intersect(Tmp.r1.grow(tilesize * 2f), plan -> { + if(plan.block == null || plan.isDone() || (current != null && player.x == current.x && player.y == current.y && player.unit().activelyBuilding())) return; + + if(Tmp.r2.setCentered(plan.drawx(), plan.drawy(), plan.block.size * tilesize).contains(Tmp.v3)){ + overlappingPlan = plan; + overlappingPlayer= player; + } + + plan.animScale = Mathf.lerpDelta(plan.animScale, 1f, 0.2f * Time.delta); + plan.block.drawOtherPlayerPlan(plan, player.planEachable, overlappingPlan == plan ? 0.7f : 0.25f); + }); + }); + + if(overlappingPlan != null){ + Drawf.arrow(overlappingPlan.drawx(), overlappingPlan.drawy(), overlappingPlayer.x, overlappingPlayer.y, overlappingPlan.block.size * tilesize * 0.6f + tilesize/2f, 2f, overlappingPlayer.color); + Drawf.selected(overlappingPlan.x, overlappingPlan.y, overlappingPlan.block, overlappingPlayer.color); + overlappingPlan.block.drawPlaceText(overlappingPlayer.name, overlappingPlan.x, overlappingPlan.y, overlappingPlayer.color, false); + } + } + + public void drawBuildPlans(){ + if(!player.isBuilder()) return; + + Unit u = player.unit(); + BuildPlan current = u.buildPlan(); + + camera.bounds(Tmp.r1); + plansOut.clear(); + playerPlanTree.intersect(Tmp.r1, plansOut); + + for(BuildPlan plan : plansOut){ + if(plan.progress > 0.01f || (current == plan && plan.initialized && (u.within(plan.x * tilesize, plan.y * tilesize, u.type.buildRange) || state.isEditor()))) continue; + + plan.animScale = 1f; + if(plan.breaking){ + drawBreaking(plan); + }else{ + plan.block.drawPlan(plan, allPlans, Build.validPlace(plan.block, player.team(), plan.x, plan.y, plan.rotation) || planMatches(plan), 1f); + } + } + + camera.bounds(Tmp.r3); + + Draw.reset(); + + //TODO: cannot query for links that are offscreen + for(BuildPlan plan : u.plans){ + if(plan.progress > 0.01f || plan.breaking || (current == plan && plan.initialized && (u.within(plan.x * tilesize, plan.y * tilesize, u.type.buildRange) || state.isEditor()))) continue; + + if(Tmp.r2.setCentered(plan.drawx(), plan.drawy(), plan.block.planConfigClipSize()).overlaps(Tmp.r3)){ + Draw.mixcol(Color.white, 0.24f + Mathf.absin(Time.globalTime, 6f, 0.28f)); + plan.block.drawPlanConfigTop(plan, allRenderPlansConfig); + Draw.reset(); + } + } + } + public void drawBottom(){ } @@ -1633,13 +1776,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ float z = Draw.z(); Draw.z(Layer.endPixeled); font.getData().setScale(1 / renderer.camerascale); - int width = (int)((result.x2 - result.x) / 8); - int height = (int)((result.y2 - result.y) / 8); + + int width = (int)((result.x2 - result.x) / tilesize); + int height = (int)((result.y2 - result.y) / tilesize); int area = width * height; + float offset = 5f / renderer.camerascale * tilesize; font.draw(width + "x" + height + " (" + area + ")", - input.mouseWorldX() + 5 * (4 / renderer.camerascale), - input.mouseWorldY() - 5 * (4 / renderer.camerascale)); + input.mouseWorldX() + (input.mouseWorldX() > x1 * tilesize ? offset : -offset), + input.mouseWorldY() + (input.mouseWorldY() > y1 * tilesize ? offset : -offset)); + font.setColor(Color.white); font.getData().setScale(1); font.setUseIntegerPositions(ints); @@ -1669,6 +1815,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ BuildPlan copy = plan.copy(); plan.block.onNewPlan(copy); player.unit().addBuild(copy, false); + playerPlanTree.insert(copy); } } } @@ -1679,6 +1826,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ BuildPlan copy = plan.copy(); plan.block.onNewPlan(copy); player.unit().addBuild(copy); + playerPlanTree.insert(copy); } } } @@ -1700,7 +1848,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } protected void drawPlan(BuildPlan plan, boolean valid){ - plan.block.drawPlan(plan, allPlans(), valid); + plan.block.drawPlan(plan, allPlans, valid); } /** Draws a placement icon for a specific block. */ @@ -1710,7 +1858,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ bplan.config = block.lastConfig; } bplan.animScale = 1f; - block.drawPlan(bplan, allPlans(), validPlace(x, y, block, rotation)); + block.drawPlan(bplan, allPlans, validPlace(x, y, block, rotation)); } /** Remove everything from the queue in a selection. */ @@ -1923,9 +2071,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } boolean tryRepairDerelict(Tile selected){ - if(!player.dead() && selected != null && !state.rules.editor && player.team() != Team.derelict && selected.build != null && selected.build.block.unlockedNow() && selected.build.team == Team.derelict && - Build.validPlace(selected.block(), player.team(), selected.build.tileX(), selected.build.tileY(), selected.build.rotation)){ - + if(canRepairDerelict(selected)){ player.unit().addBuild(new BuildPlan(selected.build.tileX(), selected.build.tileY(), selected.build.rotation, selected.block(), selected.build.config())); return true; } @@ -2209,24 +2355,36 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return validPlace(x, y, type, rotation, ignore, false); } + //static to avoid capture allocation + private static BuildPlan vpIgnore; + private static Block vpBlock; + private static int vpX, vpY; + + private static final Boolf vpPredicate = plan -> + plan != vpIgnore + && !plan.breaking + && !(vpBlock.canReplace(plan.block) && plan.x == vpX && plan.y == vpY); + public boolean validPlace(int x, int y, Block type, int rotation, @Nullable BuildPlan ignore, boolean ignoreUnits){ + if(!(ignoreUnits ? Build.validPlaceIgnoreUnits(type, player.team(), x, y, rotation, true, true) : Build.validPlace(type, player.team(), x, y, rotation))){ + return false; + } + if(player.isBuilder() && player.unit().plans.size > 0){ Tmp.r1.setCentered(x * tilesize + type.offset, y * tilesize + type.offset, type.size * tilesize); plansOut.clear(); playerPlanTree.intersect(Tmp.r1, plansOut); - for(int i = 0; i < plansOut.size; i++){ - var plan = plansOut.items[i]; - if(plan != ignore - && !plan.breaking - && plan.block.bounds(plan.x, plan.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2)) - && !(type.canReplace(plan.block) && Tmp.r1.equals(Tmp.r2))){ - return false; - } - } + float s = type.size * tilesize; + vpIgnore = ignore; + vpBlock = type; + vpX = x; + vpY = y; + + return playerPlanTree.find(x * tilesize + type.offset - s / 2f, y * tilesize + type.offset - s / 2f, s, s, vpPredicate) == null; } - return ignoreUnits ? Build.validPlaceIgnoreUnits(type, player.team(), x, y, rotation, true, true) : Build.validPlace(type, player.team(), x, y, rotation); + return true; } public boolean validBreak(int x, int y){ @@ -2353,4 +2511,43 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public int x, y, rotation; public boolean last; } + + /** + * In the interest of preserving compatibility, this implementation replaces Eachable with its own methods, and requires blocks to cast it to use it properly. + * It's a massive hack. + * */ + public static class QueryEachable implements Eachable{ + final QuadTree tree; + final Seq[] fallback; + + public QueryEachable(QuadTree tree, Seq... fallback){ + this.tree = tree; + this.fallback = fallback; + } + + @Override + public void each(Cons cons){ + //you're not supposed to use this method anymore + } + + public BuildPlan find(int x, int y, Boolf check){ + return find(x, y, 1, check); + } + + public BuildPlan find(int x, int y, int size, Boolf check){ + if(tree != null){ + BuildPlan plan = tree.find(x * tilesize - tilesize/2f * size, y * tilesize - tilesize/2f * size, size * tilesize, size * tilesize, check); + if(plan != null){ + return plan; + } + } + for(var fallback : fallback){ + var result = fallback.find(check); + if(result != null){ + return (BuildPlan)result; + } + } + return null; + } + } } diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 154b0e957c..0ad4c733db 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -268,7 +268,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } public boolean showCancel(){ - return !player.dead() && (player.unit().isBuilding() || block != null || mode == breaking || !selectPlans.isEmpty()) && !hasSchematic(); + return !player.dead() && (player.unit().isBuilding() || block != null || mode == breaking || !selectPlans.isEmpty()) && !hasSchematic() && !ui.consolefrag.shown(); } public boolean hasSchematic(){ @@ -281,18 +281,24 @@ public class MobileInput extends InputHandler implements GestureListener{ group.fill(t -> { t.visible(this::showCancel); t.bottom().left(); - t.button("@cancel", Icon.cancel, Styles.clearTogglet, () -> { + t.button(Icon.cancel, Styles.cleari, () -> { if(!player.dead()){ player.unit().clearBuilding(); } selectPlans.clear(); mode = none; block = null; - }).width(155f).checked(b -> false).height(50f).margin(12f); + }).width(155f/2f).height(50f).margin(12f); + + t.button(Icon.pause, Styles.clearTogglei, () -> isBuilding = !isBuilding).width(155f/2f).checked(b -> { + boolean paused = !isBuilding; + b.getStyle().imageUp = !paused ? Icon.pause : Icon.play; + return paused; + }).height(50f).margin(12f); }); group.fill(t -> { - t.visible(() -> !hasSchematic() && !(state.isEditor() && Core.settings.getBool("editor-blocks-shown"))); + t.visible(() -> !hasSchematic() && !ui.consolefrag.shown() && !(state.isEditor()&& Core.settings.getBool("editor-blocks-shown"))); t.bottom().left(); t.button("@command.queue", Icon.rightOpen, Styles.clearTogglet, () -> { @@ -313,13 +319,13 @@ public class MobileInput extends InputHandler implements GestureListener{ //for better looking insets t.rect((x, y, w, h) -> { if(Core.scene.marginBottom > 0){ - Tex.paneRight.draw(x, 0, w, y); + Styles.black6.draw(x, 0, w, y); } }).fillX().row(); }); group.fill(t -> { - t.visible(this::hasSchematic); + t.visible(() -> hasSchematic() && !ui.consolefrag.shown()); t.bottom().left(); t.table(Tex.pane, b -> { b.defaults().size(50f); @@ -362,7 +368,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(plan.breaking){ drawSelected(plan.x, plan.y, tile.block(), Pal.remove); }else{ - plan.block.drawPlan(plan, allPlans(), true); + plan.block.drawPlan(plan, allPlans, true); } } @@ -381,7 +387,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(i == linePlans.size - 1 && plan.block.rotate && plan.block.drawArrow){ drawArrow(block, plan.x, plan.y, plan.rotation); } - plan.block.drawPlan(plan, allPlans(), validPlace(plan.x, plan.y, plan.block, plan.rotation) && getPlan(plan.x, plan.y, plan.block.size, null) == null); + plan.block.drawPlan(plan, allPlans, validPlace(plan.x, plan.y, plan.block, plan.rotation) && getPlan(plan.x, plan.y, plan.block.size, null) == null); drawSelected(plan.x, plan.y, plan.block, Pal.accent); } linePlans.each(this::drawOverPlan); @@ -464,7 +470,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(plan.breaking){ drawSelected(plan.x, plan.y, plan.tile().block(), Pal.remove); }else{ - plan.block.drawPlan(plan, allPlans(), validPlace(plan.x, plan.y, plan.block, plan.rotation)); + plan.block.drawPlan(plan, allPlans, validPlace(plan.x, plan.y, plan.block, plan.rotation)); drawSelected(plan.x, plan.y, plan.block, Pal.accent); } } @@ -700,6 +706,8 @@ public class MobileInput extends InputHandler implements GestureListener{ commandTap(x, y, queueCommandMode); }else if(commandMode){ tapCommandUnit(); + }else if(count == 3 && net.active()){ + Call.pingLocation(Vars.player, worldx, worldy, null); }else{ //control units if(count == 2){ @@ -750,6 +758,16 @@ public class MobileInput extends InputHandler implements GestureListener{ manualShooting = down = false; } + @Override + public void getSyncedPlans(Seq out){ + super.getSyncedPlans(out); + for(var plan : selectPlans){ + if(!plan.breaking){ + out.add(plan); + } + } + } + @Override public void update(){ super.update(); diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index 9906aa2655..034c22729e 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -42,6 +42,15 @@ public class JsonIO{ if(object instanceof MappableContent c) return c.name; return super.convertToString(object); } + + @Override + protected Class resolveClass(String className){ + Class result = super.resolveClass(className); + if(Serializable.class.isAssignableFrom(result) || JsonSerializable.class.isAssignableFrom(result)){ + return result; + } + throw new SerializationException("Class deserialization not allowed: " + result); + } }; public static void writeBytes(Object value, Class elementType, DataOutputStream output){ diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index 18f4049b3f..22dd213755 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -6,6 +6,7 @@ import arc.math.geom.*; import arc.struct.*; import arc.util.*; import arc.util.io.*; +import mindustry.*; import mindustry.ai.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; @@ -36,6 +37,7 @@ import static mindustry.Vars.*; @SuppressWarnings("unused") @TypeIOHandler public class TypeIO{ + private static final int maxArraySize = 1000, maxByteArraySize = 40_000; public static void writeObject(Writes write, Object object){ if(object == null){ @@ -57,6 +59,7 @@ public class TypeIO{ write.b((byte)map.getContentType().ordinal()); write.s(map.id); }else if(object instanceof IntSeq arr){ + if(arr.size > maxArraySize) throw new ArcRuntimeException("Array size too large: " + arr.size); write.b((byte)6); write.s((short)arr.size); for(int i = 0; i < arr.size; i++){ @@ -67,6 +70,8 @@ public class TypeIO{ write.i(p.x); write.i(p.y); }else if(object instanceof Point2[] p){ + //255 is the limit here, because it's a byte for some reason + if(p.length > 255) throw new ArcRuntimeException("Array size too large: " + p.length); write.b((byte)8); write.b(p.length); for(Point2 point2 : p){ @@ -92,10 +97,13 @@ public class TypeIO{ write.b((byte)13); write.s(l.ordinal()); }else if(object instanceof byte[] b){ + if(b.length > maxByteArraySize) throw new ArcRuntimeException("Array size too large: " + b.length); write.b((byte)14); write.i(b.length); write.b(b); }else if(object instanceof boolean[] b){ + if(b.length > maxArraySize) throw new ArcRuntimeException("Array size too large: " + b.length); + write.b(16); write.i(b.length); for(boolean bool : b){ @@ -108,6 +116,8 @@ public class TypeIO{ write.b(17); write.i(u.id); }else if(object instanceof Vec2[] vecs){ + if(vecs.length > maxArraySize) throw new ArcRuntimeException("Array size too large: " + vecs.length); + write.b(18); write.s(vecs.length); for(Vec2 v : vecs){ @@ -122,9 +132,13 @@ public class TypeIO{ write.b((byte)20); write.b(t.id); }else if(object instanceof int[] i){ + if(i.length > maxArraySize) throw new ArcRuntimeException("Array size too large: " + i.length); + write.b((byte)21); writeInts(write, i); }else if(object instanceof Object[] objs){ + if(objs.length > maxArraySize) throw new ArcRuntimeException("Array size too large: " + objs.length); + write.b((byte)22); write.i(objs.length); for(Object obj : objs){ @@ -148,23 +162,49 @@ public class TypeIO{ } public static @Nullable Object readObject(Reads read, boolean box, @Nullable ContentMapper mapper){ + return readObject(read, box, mapper, false); + } + + public static @Nullable Object readObjectSafe(Reads read){ + return readObject(read, false, null, true); + } + + public static @Nullable Object readObject(Reads read, boolean box, @Nullable ContentMapper mapper, boolean safe){ + return readObject(read, box, mapper, safe, true); + } + + public static @Nullable Object readObject(Reads read, boolean box, @Nullable ContentMapper mapper, boolean safe, boolean allowArrays){ + //use a much lower array size limit for build plans + int maxArraySize = safe ? TypeIO.maxArraySize : 200; + byte type = read.b(); return switch(type){ case 0 -> null; case 1 -> read.i(); case 2 -> read.l(); case 3 -> read.f(); - case 4 -> readString(read); + case 4 -> { + byte exists = read.b(); + if(exists != 0){ + //in a safe context, strings can only be 1000 chars + yield read.str(safe ? 1000 : 0); + }else{ + yield null; + } + } case 5 -> mapper == null ? content.getByID(ContentType.all[read.b()], read.s()) : mapper.get(ContentType.all[read.b()], read.s()); case 6 -> { - short length = read.s(); - IntSeq arr = new IntSeq(length); - for(int i = 0; i < length; i ++) arr.add(read.i()); + if(!allowArrays) throw new RuntimeException("Nested arrays are not allowed"); + short len = read.s(); + if(len > maxArraySize) throw new RuntimeException("Invalid array size: " + len); + IntSeq arr = new IntSeq(len); + for(int i = 0; i < len; i ++) arr.add(read.i()); yield arr; } case 7 -> new Point2(read.i(), read.i()); case 8 -> { - byte len = read.b(); + if(!allowArrays) throw new RuntimeException("Nested arrays are not allowed"); + int len = read.ub(); Point2[] out = new Point2[len]; for(int i = 0; i < len; i ++) out[i] = Point2.unpack(read.i()); yield out; @@ -175,8 +215,11 @@ public class TypeIO{ case 12 -> !box ? world.build(read.i()) : new BuildingBox(read.i()); case 13 -> LAccess.all[read.s()]; case 14 -> { - int blen = read.i(); - byte[] bytes = new byte[blen]; + if(!allowArrays) throw new RuntimeException("Nested arrays are not allowed"); + int len = read.i(); + if(len > maxByteArraySize) throw new RuntimeException("Invalid array size: " + len); + + byte[] bytes = new byte[len]; read.b(bytes); yield bytes; } @@ -186,14 +229,20 @@ public class TypeIO{ yield null; } case 16 -> { - int boollen = read.i(); - boolean[] bools = new boolean[boollen]; - for(int i = 0; i < boollen; i ++) bools[i] = read.bool(); + if(!allowArrays) throw new RuntimeException("Nested arrays are not allowed"); + int len = read.i(); + if(len > maxArraySize) throw new RuntimeException("Invalid array size: " + len); + + boolean[] bools = new boolean[len]; + for(int i = 0; i < len; i ++) bools[i] = read.bool(); yield bools; } case 17 -> !box ? Groups.unit.getByID(read.i()) : new UnitBox(read.i()); case 18 -> { + if(!allowArrays) throw new RuntimeException("Nested arrays are not allowed"); int len = read.s(); + if(len > maxArraySize) throw new RuntimeException("Invalid array size: " + len); + Vec2[] out = new Vec2[len]; for(int i = 0; i < len; i ++) out[i] = new Vec2(read.f(), read.f()); yield out; @@ -202,9 +251,14 @@ public class TypeIO{ case 20 -> Team.all[read.ub()]; case 21 -> readInts(read); case 22 -> { - int objlen = read.i(); - Object[] objs = new Object[objlen]; - for(int i = 0; i < objlen; i++) objs[i] = readObject(read, box, mapper); + if(!allowArrays) throw new RuntimeException("Nested arrays are not allowed"); + int len = read.i(); + if(len > maxArraySize) throw new RuntimeException("Invalid array size: " + len); + + Object[] objs = new Object[len]; + for(int i = 0; i < len; i++){ + objs[i] = readObject(read, box, mapper, safe, false); + } yield objs; } case 23 -> content.unitCommand(read.us()); @@ -444,6 +498,7 @@ public class TypeIO{ public static Queue readPlansQueue(Reads read){ int used = read.i(); if(used == -1) return null; + if(used >= maxArraySize) throw new RuntimeException("Queue too long: "+ used); var out = new Queue(); for(int i = 0; i < used; i++){ out.add(readPlan(read)); @@ -478,7 +533,7 @@ public class TypeIO{ short block = read.s(); byte rotation = read.b(); boolean hasConfig = read.b() == 1; - Object config = readObject(read); + Object config = readObjectSafe(read); current = new BuildPlan(Point2.x(position), Point2.y(position), rotation, content.block(block)); //should always happen, but is kept for legacy reasons just in case if(hasConfig){ @@ -517,6 +572,65 @@ public class TypeIO{ return reqs; } + public static void writeClientPlans(Writes write, ClientBuildPlans plans){ + if(plans == null){ + write.s(0); + return; + } + write.s((short)plans.size); + //each plan should be ~7-12 bytes + for(BuildPlan plan : plans){ + if(plan.breaking) throw new RuntimeException("Breaking plans should not be sent."); + write.i(Point2.pack(plan.x, plan.y)); + + write.s(plan.block.id); + if(plan.block.rotate){ //no need to write rotation for blocks that don't use it + write.b((byte)plan.rotation); + } + writeObject(write, validClientPlanConfig(plan.config) ? plan.config : null); + } + } + + public static ClientBuildPlans readClientPlans(Reads read){ + short amount = read.s(); + + if(amount == 0) return null; + if(amount > maxPlayerPreviewPlans) throw new RuntimeException("Too many plans: " + amount); + + var result = new ClientBuildPlans(); + result.ensureCapacity(Math.min(amount, maxPlayerPreviewPlans)); + for(int i = 0; i < amount; i++){ + int x = read.us(); + int y = read.us(); + Block block = Vars.content.block(read.us()); + int rotation = (block.rotate ? read.b() : 0); + Object config = readClientPlanConfig(read); + BuildPlan plan = new BuildPlan(x, y, rotation, block, config); + result.add(plan); + } + + return result; + } + + static @Nullable Object readClientPlanConfig(Reads read){ + byte type = read.b(); + return switch(type){ + case 0 -> null; + case 1 -> read.i(); + case 2 -> read.l(); + case 3 -> read.f(); + case 5 -> content.getByID(ContentType.all[read.b()], read.s()); + case 10 -> read.bool(); + case 11 -> read.d(); + default -> throw new IllegalArgumentException("Unknown plan config object type: " + type); + }; + } + + //for client plans, most configs aren't necessary (links are intentionally not displayed/sent) + static boolean validClientPlanConfig(Object o){ + return o == null || o instanceof Number || o instanceof Boolean || o instanceof Content; + } + public static void writeController(Writes write, UnitController control){ //no real unit controller state is written, only the type if(control instanceof Player p){ @@ -705,6 +819,8 @@ public class TypeIO{ public static Rules readRules(Reads read){ int length = read.i(); + //this is only called clientside, but the byte limit is reasonable either way... + if(length > 100_000) throw new ArcRuntimeException("Rules too long"); String string = new String(read.b(new byte[length]), charset); return JsonIO.read(Rules.class, string); } @@ -718,6 +834,7 @@ public class TypeIO{ public static MapObjectives readObjectives(Reads read){ int length = read.i(); + if(length >= 60_000) throw new RuntimeException("Objectives bytes too long: " + length); String string = new String(read.b(new byte[length]), charset); return JsonIO.read(MapObjectives.class, string); } @@ -731,6 +848,7 @@ public class TypeIO{ public static ObjectiveMarker readObjectiveMarker(Reads read){ int length = read.i(); + if(length > maxByteArraySize) throw new ArcRuntimeException("Objective marker too long"); String string = new String(read.b(new byte[length]), charset); return JsonIO.read(MapObjectives.ObjectiveMarker.class, string); } @@ -1129,6 +1247,17 @@ public class TypeIO{ } } + /** wrapper for custom sync code */ + public static class ClientBuildPlans extends Seq{ + public ClientBuildPlans(){ + super(BuildPlan.class); + } + + public ClientBuildPlans(int capacity){ + super(true, capacity, BuildPlan.class); + } + } + /** Converter of an ID to a content instance. */ public interface ContentMapper{ Content get(ContentType type, int id); diff --git a/core/src/mindustry/logic/ConditionOp.java b/core/src/mindustry/logic/ConditionOp.java index bb9b0f7e98..b0c156386d 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -30,7 +30,7 @@ public enum ConditionOp{ public boolean test(LVar va, LVar vb){ if(this == ConditionOp.strictEqual){ - return va.isobj == vb.isobj && ((va.isobj && va.objval == vb.objval) || (!va.isobj && va.numval == vb.numval)); + return va.isobj == vb.isobj && ((va.isobj && Structs.eq(va.objval, vb.objval)) || (!va.isobj && va.numval == vb.numval)); } if(objFunction != null && va.isobj && vb.isobj){ //use object function if both are objects diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 74fb32ff56..b4ad9b3237 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -442,7 +442,7 @@ public class LCanvas extends Table{ .disabled(b -> canvas.statements.getChildren().size >= LExecutor.maxInstructions).size(24f).padRight(6); t.button(Icon.copy, Styles.logici, () -> { - }).size(24f).padRight(6).get().tapped(this::copy); + }).size(24f).padRight(6).disabled(i -> canvas.statements.getChildren().size >= LExecutor.maxInstructions).get().tapped(this::copy); t.button(Icon.cancel, Styles.logici, () -> { remove(); diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index c14123c77f..2c964326f9 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -67,11 +67,13 @@ public class LExecutor{ Events.on(ResetEvent.class, e -> unitTimeouts.clear()); } - public static void runLogicScript(String code){ + public static void runLogicScript(@Nullable String code){ runLogicScript(code, 100_000, false); } - public static void runLogicScript(String code, int maxInstructions, boolean loop){ + public static void runLogicScript(@Nullable String code, int maxInstructions, boolean loop){ + if(code == null || code.isEmpty()) return; + LExecutor executor = new LExecutor(); executor.privileged = true; @@ -617,12 +619,17 @@ public class LExecutor{ public void run(LExecutor exec){ Object targetObj = target.obj(); if(targetObj instanceof LReadable read){ - if(!read.readable(exec)) return; + if(!read.readable(exec)){ + output.setobj(null); + return; + } read.read(position, output); }else{ int address = position.numi(); if(targetObj instanceof CharSequence str){ output.setnum(address < 0 || address >= str.length() ? Double.NaN : (int)str.charAt(address)); + }else{ + output.setobj(null); } } } @@ -1598,6 +1605,7 @@ public class LExecutor{ case unitCap -> state.rules.unitCap = Math.max(value.numi(), 0); case lighting -> state.rules.lighting = value.bool(); case canGameOver -> state.rules.canGameOver = value.bool(); + case pauseDisabled -> state.rules.pauseDisabled = value.bool(); case mapArea -> { int x = p1.numi(), y = p2.numi(), w = p3.numi(), h = p4.numi(); if(!checkMapArea(x, y, w, h, false)){ diff --git a/core/src/mindustry/logic/LParser.java b/core/src/mindustry/logic/LParser.java index 25b7bc9ea1..cc2fb1c104 100644 --- a/core/src/mindustry/logic/LParser.java +++ b/core/src/mindustry/logic/LParser.java @@ -37,17 +37,22 @@ public class LParser{ String string(){ int from = pos; + int utflen = 0; while(++pos < chars.length){ - var c = chars[pos]; + char c = chars[pos]; if(c == '\n'){ error("Missing closing quote \" before end of line."); }else if(c == '"'){ break; } + + // See ByteBufferOutput.writeUTF() + utflen += c != 0 && c <= 0x7F ? 1 : c <= 0x7FF ? 2 : 3; } if(pos >= chars.length || chars[pos] != '"') error("Missing closing quote \" before end of file."); + if(utflen > 65535) error("String value too long."); return new String(chars, from, ++pos - from); } diff --git a/core/src/mindustry/logic/LogicRule.java b/core/src/mindustry/logic/LogicRule.java index b6ca757bb7..a4d1829dc2 100644 --- a/core/src/mindustry/logic/LogicRule.java +++ b/core/src/mindustry/logic/LogicRule.java @@ -19,6 +19,7 @@ public enum LogicRule{ dragMultiplier, ban, unban, + pauseDisabled, //team specific buildSpeed, diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 006aa1566c..185136a290 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -94,7 +94,12 @@ public class Maps{ /** Returns a list of only default maps. */ public Seq defaultMaps(){ - return maps.select(m -> !m.custom); + return maps.select(m -> !m.custom && m.mod == null); + } + + /** Returns a list of only modded maps. */ + public Seq moddedMaps(){ + return maps.select(m -> m.mod != null); } public Map byName(String name){ diff --git a/core/src/mindustry/maps/SectorSubmissions.java b/core/src/mindustry/maps/SectorSubmissions.java index 2c519d90e6..91b43c4d92 100644 --- a/core/src/mindustry/maps/SectorSubmissions.java +++ b/core/src/mindustry/maps/SectorSubmissions.java @@ -22,52 +22,62 @@ public class SectorSubmissions{ } public static void registerSectors(){ - - registerSerpuloSector(76, "Skyon", "https://discord.com/channels/391020510269669376/1379926833411391580/1381831690183250056"); - registerSerpuloSector(47, "tinport", "https://discord.com/channels/391020510269669376/1379926802591645820/1397649518203371544"); - registerSerpuloSector(225, "Summi", "https://discord.com/channels/391020510269669376/1379926925719376152/1399286858482978900"); + registerSerpuloSector(76, "Tyrant-classZzz", "https://discord.com/channels/391020510269669376/1379926833411391580/1479890094486716499"); + registerSerpuloSector(47, "tinport", "https://discord.com/channels/391020510269669376/1379926802591645820/1481778410018570274"); + registerSerpuloSector(225, "Summi", "https://discord.com/channels/391020510269669376/1379926925719376152/1419026814826709103"); //111 has an alternate submission https://discord.com/channels/391020510269669376/1379926842659569864/1404825715244793938 registerSerpuloSector(111, "gausofid", "https://discord.com/channels/391020510269669376/1379926842659569864/1422257393042985114"); - registerSerpuloSector(176, "wpx", "https://discord.com/channels/391020510269669376/1379926887203213353/1390418885081043135"); + registerSerpuloSector(176, "wpx", "https://discord.com/channels/391020510269669376/1379926887203213353/1419025548696621209"); registerSerpuloSector(13, "hoijlhj", "https://discord.com/channels/391020510269669376/1379926785164312810/1402569635299065948"); registerSerpuloSector(259, "tinport", "https://discord.com/channels/391020510269669376/1379928048245280871/1381300770866987049"); registerSerpuloSector(192, "Skeledragon", "https://discord.com/channels/391020510269669376/1379926914122256449/1380767793989029923"); registerSerpuloSector(127, "playfree", "https://discord.com/channels/391020510269669376/1379926869465632829/1380253194428354602"); registerSerpuloSector(207, "cyan", "https://discord.com/channels/391020510269669376/1379926923370827827/1405919087883976837"); - registerSerpuloSector(94, "Wine", "https://discord.com/channels/391020510269669376/1379926838079393802/1406267666976477196"); + registerSerpuloSector(94, "Wine", "https://discord.com/channels/391020510269669376/1379926838079393802/1433736458174468197"); registerSerpuloSector(16, "Namero", "https://discord.com/channels/391020510269669376/1379926788280680579/1409970152283312352"); - registerSerpuloSector(116, "Jamespire", "https://discord.com/channels/391020510269669376/1379926845058711734/1404131805074034712"); + registerSerpuloSector(116, "Jamespire", "https://discord.com/channels/391020510269669376/1379926845058711734/1483297088426082336"); registerSerpuloSector(69, "Oct", "https://discord.com/channels/391020510269669376/1379926831326822610/1406230980120940556"); - registerSerpuloSector(92, "Eggypc/Fish", "https://discord.com/channels/391020510269669376/1379926835621527615/1422178040489971834"); - registerSerpuloSector(197, "Hengryton Luck", "https://discord.com/channels/391020510269669376/1379926916911599676/1411358089759817793"); + registerSerpuloSector(92, "Locla^Glass", "https://discord.com/channels/391020510269669376/1379926835621527615/1484550444369051772"); + registerSerpuloSector(197, "Hengryton Luck", "https://discord.com/channels/391020510269669376/1379926916911599676/1423257237341863966"); registerSerpuloSector(67, "Ếch ngồi đáy giếng", "https://discord.com/channels/391020510269669376/1379926828696866898/1389981795386396768"); //180 has an alternate submission that may be more appropriate in terms of difficulty: https://discord.com/channels/391020510269669376/1379926889648619580/1411534650412892185 - registerSerpuloSector(180, "Locla^Glass", "https://discord.com/channels/391020510269669376/1379926889648619580/1413522098370117765"); - registerSerpuloSector(55, "Namero", "https://discord.com/channels/391020510269669376/1379926823277695189/1412588965256761402"); - registerSerpuloSector(19, "Hengryton Luck", "https://discord.com/channels/391020510269669376/1379926792479183019/1411342610525585468"); + registerSerpuloSector(180, "Locla^Glass", "https://discord.com/channels/391020510269669376/1379926889648619580/1426523800815538178"); + registerSerpuloSector(55, "Amomogus391", "https://discord.com/channels/391020510269669376/1379926823277695189/1478733623829200910"); + registerSerpuloSector(19, "Hengryton Luck", "https://discord.com/channels/391020510269669376/1379926792479183019/1424375936169545730"); registerSerpuloSector(200, "Axye", "https://discord.com/channels/391020510269669376/1379926918429806755/1419180347232485448"); //191 has several alternate submissions registerSerpuloSector(191, "tinport", "https://discord.com/channels/391020510269669376/1379926912004001914/1421139764819660884"); //alternate, more difficult submission: https://discord.com/channels/391020510269669376/1379926782966497322/1416145231853781022 - registerSerpuloSector(6, "Namero", "https://discord.com/channels/391020510269669376/1379926782966497322/1415735385828495464"); - registerSerpuloSector(265, "Dem0", "https://discord.com/channels/391020510269669376/1379928052921929891/1420029529619173459"); + registerSerpuloSector(6, "Locla^Glass", "https://discord.com/channels/391020510269669376/1379926782966497322/1437001083221184535", -1, 9f); + registerSerpuloSector(265, "Dem0", "https://discord.com/channels/391020510269669376/1379928052921929891/1450757980206137359"); registerSerpuloSector(161, "Hengryton Luck", "https://discord.com/channels/391020510269669376/1379926882203730024/1416686287204782217"); registerSerpuloSector(24, "Stormrider", "https://discord.com/channels/391020510269669376/1379926797042581716/1419213541512187935"); - registerSerpuloSector(263, "ltb12", "https://discord.com/channels/391020510269669376/1379928050010951694/1417750251741249569"); - registerSerpuloSector(66, "quad", "https://discord.com/channels/391020510269669376/1379926825941078128/1417752983889907755"); + registerSerpuloSector(263, "Locla^Glass", "https://discord.com/channels/391020510269669376/1379928050010951694/1483982628268019916"); + registerSerpuloSector(66, "quad", "https://discord.com/channels/391020510269669376/1379926825941078128/1419165493008535706"); registerSerpuloSector(248, "iqtik123", "https://discord.com/channels/391020510269669376/1379926979129774151/1417864622412922890"); - registerSerpuloSector(133, "wpx", "https://discord.com/channels/391020510269669376/1379926871227240770/1417920499761156126"); + registerSerpuloSector(133, "wpx", "https://discord.com/channels/391020510269669376/1379926871227240770/1419018550932279440"); registerSerpuloSector(185, "quad", "https://discord.com/channels/391020510269669376/1379926892181983283/1419231958336016458"); + //alternate submission: https://discord.com/channels/391020510269669376/1379928045577703424/1426592904767475745 registerSerpuloSector(254, "wpx", "https://discord.com/channels/391020510269669376/1379928045577703424/1420456601667502193"); - registerSerpuloSector(0, "iqtik123", "https://discord.com/channels/391020510269669376/1379926780860698784/1431356682834940115"); - registerSerpuloSector(103, "enwyz", "https://discord.com/channels/391020510269669376/1379926839559979030/1429203869514207255"); + registerSerpuloSector(0, "iqtik123", "https://discord.com/channels/391020510269669376/1379926780860698784/1482671494268977341"); registerSerpuloSector(30, "cyan", "https://discord.com/channels/391020510269669376/1379926800854945823/1423932799647481910"); registerSerpuloSector(20, "Namero", "https://discord.com/channels/391020510269669376/1379926794114961634/1406768731471872162"); registerSerpuloSector(162, "Bravo Tizmo", "https://discord.com/channels/391020510269669376/1379926884606808247/1443239231366500415"); - registerSerpuloSector(230, "Jamespire", "https://discord.com/channels/391020510269669376/1379926927585841163/1442675816084406305"); + registerSerpuloSector(230, "Jamespire", "https://discord.com/channels/391020510269669376/1379926927585841163/1483113630202335447"); registerSerpuloSector(240, "hhhi17", "https://discord.com/channels/391020510269669376/1253758616117186590/1253758616117186590", -1, 8f); registerSerpuloSector(202, "D&X", "https://discord.com/channels/391020510269669376/1253760205091635201/1253760205091635201", 33, 6f); + //megabases + registerSerpuloSector(246, "enwyz", "https://discord.com/channels/391020510269669376/1379926839559979030/1429203869514207255"); + registerSerpuloSector(244, "Chocomint", "https://discord.com/channels/391020510269669376/1379926929636851812/1474447354982563840"); + registerSerpuloSector(242, "Lilith", "https://discord.com/channels/391020510269669376/1379926873152164004/1470268689201889464"); + registerSerpuloSector(243, "Jamespire", "https://discord.com/channels/391020510269669376/1379926876457537547/1484013941477609543"); + registerSerpuloSector(247, "Locla^Glass", "https://discord.com/channels/391020510269669376/1379926976361533752/1431827990295220266"); + registerSerpuloSector(245, "Grushashusha", "https://discord.com/channels/391020510269669376/1379926971286290584/1485245072034365462"); + registerSerpuloSector(27, "Stormrider", "https://discord.com/channels/391020510269669376/1379926798833287289/1451252137224044722"); + + Planets.serpulo.sectors.get(27).preset.shieldSectors.addAll(Planets.serpulo.sectors.get(246), Planets.serpulo.sectors.get(244), Planets.serpulo.sectors.get(242)); + /* UNUSED SECTORS: registerHiddenSectors(serpulo, 68, //Winter Forest by wpx: https://discord.com/channels/391020510269669376/1165421701362897000/1235654407006322700 diff --git a/core/src/mindustry/maps/filters/GenerateFilter.java b/core/src/mindustry/maps/filters/GenerateFilter.java index 33ae5c3208..74844fb042 100644 --- a/core/src/mindustry/maps/filters/GenerateFilter.java +++ b/core/src/mindustry/maps/filters/GenerateFilter.java @@ -12,7 +12,9 @@ import mindustry.gen.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -public abstract class GenerateFilter implements Cloneable{ +import java.io.*; + +public abstract class GenerateFilter implements Cloneable, Serializable{ public int seed = 0; public void apply(Tiles tiles, GenerateInput in){ diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index 21dd664940..262a80d91a 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -61,6 +61,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ ); float water = 2f / arr[0].length; + //megabase position Vec3 basePos = new Vec3(0.9341721, 0.0, 0.3568221); float rawHeight(Vec3 position){ @@ -112,7 +113,11 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ @Override public void getLockedText(Sector hovered, StringBuilder out){ if((hovered.preset == null || !hovered.preset.requireUnlock) && hovered.near().contains(Sector::hasBase)){ - out.append("[red]").append(Iconc.cancel).append("[]").append(Blocks.coreFoundation.emoji()).append(Core.bundle.get("sector.foundationrequired")); + if(hovered.isShielded()){ + out.append("[red]").append(Iconc.defense).append("[]").append(Core.bundle.get("sector.shielded")); + }else{ + out.append("[red]").append(Iconc.cancel).append("[]").append(Blocks.coreFoundation.emoji()).append(Core.bundle.get("sector.foundationrequired")); + } }else{ super.getLockedText(hovered, out); } @@ -126,7 +131,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ @Override public void getColor(Vec3 position, Color out){ - Block block = getBlock(position); + Block block = getBlock(position, true); //replace salt with sand color if(block == Blocks.salt) block = Blocks.sand; out.set(block.mapColor).a(1f - block.albedo); @@ -157,7 +162,8 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ if(lightScl < 1f) lightScl = Interp.pow5Out.apply(lightScl); float freq = 0.05f; - if(position.dst(basePos) < 0.55f ? + //TODO: once the old megabase returns, change it to 0.55f + if(position.dst(basePos) < 0.3f ? dst*metalDstScl + Simplex.noise3d(seed + 1, 3, 0.4, 5.5f, position.x, position.y + 200f, position.z)*0.08f + ((basePos.dst(position) + 0.00f) % freq < freq/2f ? 1f : 0f) * 0.07f < 0.08f/* || dst <= 0.0001f*/ : dst*metalDstScl + Simplex.noise3d(seed, 3, 0.4, 9f, position.x, position.y + 370f, position.z)*0.06f < 0.045){ @@ -174,7 +180,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ @Override public void genTile(Vec3 position, TileGen tile){ - tile.floor = getBlock(position); + tile.floor = getBlock(position, false); if(tile.floor == Blocks.darkPanel6) tile.floor = Blocks.darkPanel3; tile.block = tile.floor.asFloor().wall; @@ -185,7 +191,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ static double metalDstScl = 0.25; - Block getBlock(Vec3 position){ + Block getBlock(Vec3 position, boolean visualOnly){ float height = rawHeight(position); float px = position.x * scl, py = position.y * scl, pz = position.z * scl; @@ -202,7 +208,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ if(tar > 0.5f){ return tars.get(res, res); }else{ - if(position.within(basePos, 0.65f)){ + if(visualOnly && position.within(basePos, 0.65f)){ float dst = 999f; diff --git a/core/src/mindustry/mod/ClassMap.java b/core/src/mindustry/mod/ClassMap.java index 11f2694510..b6b209f2c5 100644 --- a/core/src/mindustry/mod/ClassMap.java +++ b/core/src/mindustry/mod/ClassMap.java @@ -281,6 +281,8 @@ public class ClassMap{ classes.put("StaticWall", mindustry.world.blocks.environment.StaticWall.class); classes.put("SteamVent", mindustry.world.blocks.environment.SteamVent.class); classes.put("TallBlock", mindustry.world.blocks.environment.TallBlock.class); + classes.put("TiledFloor", mindustry.world.blocks.environment.TiledFloor.class); + classes.put("TiledWall", mindustry.world.blocks.environment.TiledWall.class); classes.put("TreeBlock", mindustry.world.blocks.environment.TreeBlock.class); classes.put("WobbleProp", mindustry.world.blocks.environment.WobbleProp.class); classes.put("HeatBlock", mindustry.world.blocks.heat.HeatBlock.class); @@ -478,6 +480,7 @@ public class ClassMap{ classes.put("ConsumePowerDynamic", mindustry.world.consumers.ConsumePowerDynamic.class); classes.put("DrawArcSmelt", mindustry.world.draw.DrawArcSmelt.class); classes.put("DrawBlock", mindustry.world.draw.DrawBlock.class); + classes.put("DrawBlockParts", mindustry.world.draw.DrawBlockParts.class); classes.put("DrawBlurSpin", mindustry.world.draw.DrawBlurSpin.class); classes.put("DrawBubbles", mindustry.world.draw.DrawBubbles.class); classes.put("DrawCells", mindustry.world.draw.DrawCells.class); diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index 5d799e3f2d..532192aa37 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -91,6 +91,9 @@ public class ContentParser{ return Attribute.add(attr); }); put(Attributes.class, (type, data) -> { + if(!data.isObject()){ + throw new IllegalArgumentException("Attribute definitions must be objects, e.g. {heat: 10}"); + } Attributes attr = new Attributes(); for(var child : data){ Attribute value = Attribute.exists(child.name) ? Attribute.get(child.name) : Attribute.add(child.name); @@ -762,7 +765,12 @@ public class ContentParser{ } if(value.has("sector")){ - preset.initialize(planet, value.getInt("sector", 0)); + //clear old value + Sector prev = preset.sector; + if(prev != null && prev.preset == preset){ + prev.preset = null; + } + preset.initialize(planet, value.getInt("sector", 0), true); } value.remove("sector"); diff --git a/core/src/mindustry/mod/DataPatcher.java b/core/src/mindustry/mod/DataPatcher.java index 180c09c442..e2f06abc44 100644 --- a/core/src/mindustry/mod/DataPatcher.java +++ b/core/src/mindustry/mod/DataPatcher.java @@ -35,6 +35,7 @@ public class DataPatcher{ private ObjectSet usedpatches = new ObjectSet<>(); private Seq resetters = new Seq<>(); private Seq afterCallbacks = new Seq<>(); + private Seq visitStack = new Seq<>(); private @Nullable PatchSet currentlyApplying; /** Currently active patches. Note that apply() should be called after modification. */ @@ -92,6 +93,7 @@ public class DataPatcher{ JsonValue value = parser.getJson().fromJson(null, Jval.read(patch).toString(Jformat.plain)); set.json = value; currentlyApplying = set; + visitStack.clear(); set.name = value.getString("name", ""); value.remove("name"); //patchsets can have a name, ignore it if present @@ -135,12 +137,13 @@ public class DataPatcher{ } void visit(Object object){ + visitStack.add(object); if(object instanceof Content c && usedpatches.add(c)){ after(c::afterPatch); } } - void created(Object object, Object parent){ + void created(Object object){ if(object instanceof Weapon weapon){ weapon.init(); }else if(object instanceof Content cont){ @@ -149,6 +152,15 @@ public class DataPatcher{ } if(!Vars.headless){ + Object parent = null; + //find last item on the stack that can be mapped to this part or weapon + for(int i = visitStack.size - 1; i >= 0; i --){ + Object o = visitStack.items[i]; + if(o != object && (o instanceof Content || o instanceof Weapon)){ + parent = o; + break; + } + } if(object instanceof DrawPart part && parent instanceof MappableContent cont){ part.load(cont.name); }else if(object instanceof DrawPart part && parent instanceof Weapon w){ @@ -166,42 +178,128 @@ public class DataPatcher{ void assign(Object object, String field, Object value, @Nullable FieldData metadata, @Nullable Object parentObject, @Nullable String parentField) throws Exception{ if(field == null || field.isEmpty()) return; - //field.field2.field3 nested syntax - if(field.indexOf('.') != -1){ - //resolve the field chain until the final field is reached - String[] path = field.split("\\."); - for(int i = 0; i < path.length - 1; i++){ - parentObject = object; - parentField = path[i]; - Object[] result = resolve(object, path[i], metadata); - if(result == null){ - warn("Failed to resolve @.@", object, path[i]); - return; - } - object = result[0]; - metadata = (FieldData)result[1]; + int oldLength = visitStack.size; + try{ - if(i < path.length - 2){ - visit(object); + //field.field2.field3 nested syntax + if(field.indexOf('.') != -1){ + //resolve the field chain until the final field is reached + String[] path = field.split("\\."); + for(int i = 0; i < path.length - 1; i++){ + parentObject = object; + parentField = path[i]; + Object[] result = resolve(object, path[i], metadata); + if(result == null){ + warn("Failed to resolve @.@", object, path[i]); + return; + } + object = result[0]; + metadata = (FieldData)result[1]; + + if(i < path.length - 2){ + visit(object); + } } + field = path[path.length - 1]; } - field = path[path.length - 1]; - } - visit(object); + visit(object); - if(object == root){ - if(value instanceof JsonValue jval && jval.isObject()){ - for(var child : jval){ - assign(root, field + "." + child.name, child, null, null, null); + if(object == root){ + if(value instanceof JsonValue jval && jval.isObject()){ + for(var child : jval){ + assign(root, field + "." + child.name, child, null, null, null); + } + }else{ + warn("Content '@' cannot be assigned.", field); } - }else{ - warn("Content '@' cannot be assigned.", field); - } - }else if(object instanceof Seq || object.getClass().isArray()){ + }else if(object instanceof Seq || object.getClass().isArray()){ - if(field.equals("+")){ - var meta = new FieldData(metadata.type.isArray() ? metadata.type.getComponentType() : metadata.elementType, null, null); + if(field.equals("+")){ + var meta = new FieldData(metadata.type.isArray() ? metadata.type.getComponentType() : metadata.elementType, null, null); + boolean multiAdd; + + if(value instanceof JsonValue jval && jval.isArray()){ + meta = metadata; + multiAdd = true; + }else{ + multiAdd = false; + } + + //handle array addition syntax + if(object instanceof Seq s){ + modifiedField(parentObject, parentField, s.copy()); + + assignValue(object, field, meta, () -> null, val -> { + if(multiAdd){ + s.addAll((Seq)val); + }else{ + s.add(val); + } + }, value, false); + }else{ + modifiedField(parentObject, parentField, copyArray(object)); + + var fobj = object; + var fpo = parentObject; + var fpf = parentField; + assignValue(parentObject, parentField, meta, () -> null, val -> { + try{ + //create copy array, put the new object in the last slot, and assign the parent's field to it + int len = Array.getLength(fobj); + Object copy; + + if(multiAdd){ + int otherLen = Array.getLength(val); + copy = Array.newInstance(fobj.getClass().getComponentType(), len + otherLen); + System.arraycopy(val, 0, copy, len, otherLen); + System.arraycopy(fobj, 0, copy, 0, len); + }else{ + copy = Array.newInstance(fobj.getClass().getComponentType(), len + 1); + Array.set(copy, len, val); + System.arraycopy(fobj, 0, copy, 0, len); + } + + assign(fpo, fpf, copy, null, null, null); + }catch(Exception e){ + throw new RuntimeException(e); + } + }, value, false); + } + }else{ + if(metadata != null){ + var meta = new FieldData(metadata.type.isArray() ? metadata.type.getComponentType() : metadata.elementType, null, null); + if(meta.type != null){ + metadata = meta; + } + } + + int i = Strings.parseInt(field); + int length = object instanceof Seq s ? s.size : Array.getLength(object); + + if(i == Integer.MIN_VALUE){ + warn("Invalid number for array access: '@'", field); + return; + }else if(i < 0 || i >= length){ + warn("Number outside of array bounds: '" + field + "' (length is " + length + ")"); + return; + } + + if(object instanceof Seq s){ + modifiedField(parentObject, parentField, s.copy()); + + assignValue(object, field, metadata, () -> s.get(i), val -> s.set(i, val), value, true); + }else{ + modifiedField(parentObject, parentField, copyArray(object)); + + var fobj = object; + assignValue(object, field, metadata, () -> Array.get(fobj, i), val -> Array.set(fobj, i, val), value, true); + } + } + }else if(object instanceof ObjectSet set && field.equals("+")){ + modifiedField(parentObject, parentField, set.copy()); + + var meta = new FieldData(metadata.elementType, null, null); boolean multiAdd; if(value instanceof JsonValue jval && jval.isArray()){ @@ -211,204 +309,123 @@ public class DataPatcher{ multiAdd = false; } - //handle array addition syntax - if(object instanceof Seq s){ - modifiedField(parentObject, parentField, s.copy()); - - assignValue(object, field, meta, () -> null, val -> { - if(multiAdd){ - s.addAll((Seq)val); - }else{ - s.add(val); - } - }, value, false); - }else{ - modifiedField(parentObject, parentField, copyArray(object)); - - var fobj = object; - var fpo = parentObject; - var fpf = parentField; - assignValue(parentObject, parentField, meta, () -> null, val -> { - try{ - //create copy array, put the new object in the last slot, and assign the parent's field to it - int len = Array.getLength(fobj); - Object copy; - - if(multiAdd){ - int otherLen = Array.getLength(val); - copy = Array.newInstance(fobj.getClass().getComponentType(), len + otherLen); - System.arraycopy(val, 0, copy, len, otherLen); - System.arraycopy(fobj, 0, copy, 0, len); - }else{ - copy = Array.newInstance(fobj.getClass().getComponentType(), len + 1); - Array.set(copy, len, val); - System.arraycopy(fobj, 0, copy, 0, len); - } - - assign(fpo, fpf, copy, null, null, null); - }catch(Exception e){ - throw new RuntimeException(e); - } - }, value, false); - } - }else{ - if(metadata != null){ - var meta = new FieldData(metadata.type.isArray() ? metadata.type.getComponentType() : metadata.elementType, null, null); - if(meta.type != null){ - metadata = meta; + assignValue(object, field, multiAdd ? meta : metadata, () -> null, val -> { + if(multiAdd){ + set.addAll((ObjectSet)val); + }else{ + set.add(val); } - } - - int i = Strings.parseInt(field); - int length = object instanceof Seq s ? s.size : Array.getLength(object); - - if(i == Integer.MIN_VALUE){ - warn("Invalid number for array access: '@'", field); + }, value, false); + }else if(object instanceof ObjectMap map){ + if(metadata == null){ + warn("ObjectMap cannot be parsed without metadata: @.@", parentObject, parentField); return; - }else if(i < 0 || i >= length){ - warn("Number outside of array bounds: '" + field + "' (length is " + length + ")"); + } + Object key = convertKeyType(field, metadata.keyType); + if(key == null){ + warn("Null key: '@'", field); return; } - if(object instanceof Seq s){ - var copy = s.copy(); - reset(() -> s.set(copy)); + var copy = map.copy(); + reset(() -> map.set(copy)); - assignValue(object, field, metadata, () -> s.get(i), val -> s.set(i, val), value, false); + if(value instanceof JsonValue jval && jval.isString() && (jval.asString().equals("-"))){ + //removal syntax: + //"value": "-" + map.remove(key); }else{ - modifiedField(parentObject, parentField, copyArray(object)); - - var fobj = object; - assignValue(object, field, metadata, () -> Array.get(fobj, i), val -> Array.set(fobj, i, val), value, false); + assignValue(object, field, new FieldData(metadata.elementType, null, null), () -> map.get(key), val -> map.put(key, val), value, false); + } + }else if(object instanceof ObjectFloatMap map){ + if(metadata == null){ + warn("ObjectFloatMap cannot be parsed without metadata: @.@", parentObject, parentField); + return; + } + Object key = convertKeyType(field, metadata.elementType); + if(key == null){ + warn("Null key: '@'", field); + return; } - } - }else if(object instanceof ObjectSet set && field.equals("+")){ - modifiedField(parentObject, parentField, set.copy()); - var meta = new FieldData(metadata.elementType, null, null); - boolean multiAdd; + var copy = map.copy(); + reset(() -> map.set(copy)); - if(value instanceof JsonValue jval && jval.isArray()){ - meta = metadata; - multiAdd = true; - }else{ - multiAdd = false; - } - - assignValue(object, field, multiAdd ? meta : metadata, () -> null, val -> { - if(multiAdd){ - set.addAll((ObjectSet)val); + if(value instanceof JsonValue jval && jval.isString() && (jval.asString().equals("-"))){ + //removal syntax: + //"value": "-" + map.remove(key, 0f); }else{ - set.add(val); + assignValue(object, field, new FieldData(float.class, null, null), () -> map.get(key, 0f), val -> map.put(key, (Float)val), value, false); } - }, value, false); - }else if(object instanceof ObjectMap map){ - if(metadata == null){ - warn("ObjectMap cannot be parsed without metadata: @.@", parentObject, parentField); - return; - } - Object key = convertKeyType(field, metadata.keyType); - if(key == null){ - warn("Null key: '@'", field); - return; - } - - var copy = map.copy(); - reset(() -> map.set(copy)); - - if(value instanceof JsonValue jval && jval.isString() && (jval.asString().equals("-"))){ - //removal syntax: - //"value": "-" - map.remove(key); + }else if(object instanceof Attributes map && value instanceof JsonValue jval){ + Attribute key = Attribute.getOrNull(field); + if(key == null){ + warn("Unknown attribute: '@'", field); + return; + } + if(!jval.isNumber()){ + warn("Attribute value must be a number: '@'", jval); + return; + } + float prev = map.get(key); + reset(() -> map.set(key, prev)); + map.set(key, jval.asFloat()); }else{ - assignValue(object, field, new FieldData(metadata.elementType, null, null), () -> map.get(key), val -> map.put(key, val), value, false); - } - }else if(object instanceof ObjectFloatMap map){ - if(metadata == null){ - warn("ObjectFloatMap cannot be parsed without metadata: @.@", parentObject, parentField); - return; - } - Object key = convertKeyType(field, metadata.elementType); - if(key == null){ - warn("Null key: '@'", field); - return; - } + Class actualType = object.getClass(); + if(actualType.isAnonymousClass()) actualType = actualType.getSuperclass(); - var copy = map.copy(); - reset(() -> map.set(copy)); + var fields = parser.getJson().getFields(actualType); + var fdata = fields.get(field); + var fobj = object; - if(value instanceof JsonValue jval && jval.isString() && (jval.asString().equals("-"))){ - //removal syntax: - //"value": "-" - map.remove(key, 0f); - }else{ - assignValue(object, field, new FieldData(float.class, null, null), () -> map.get(key, 0f), val -> map.put(key, (Float)val), value, false); - } - }else if(object instanceof Attributes map && value instanceof JsonValue jval){ - Attribute key = Attribute.getOrNull(field); - if(key == null){ - warn("Unknown attribute: '@'", field); - return; - } - if(!jval.isNumber()){ - warn("Attribute value must be a number: '@'", jval); - return; - } - float prev = map.get(key); - reset(() -> map.set(key, prev)); - map.set(key, jval.asFloat()); - }else{ - Class actualType = object.getClass(); - if(actualType.isAnonymousClass()) actualType = actualType.getSuperclass(); + if(value instanceof JsonValue jsv && object instanceof UnitType && field.equals("controller")){ + var fmeta = fields.get("controller"); + assignValue(object, "controller", new FieldData(fmeta), () -> Reflect.get(fobj, fmeta.field), val -> Reflect.set(fobj, fmeta.field, val), (Func)(u -> parser.resolveController(jsv.asString()).get()), true); + }else if(value instanceof JsonValue jsv && object instanceof UnitType && field.equals("aiController")){ + var fmeta = fields.get("aiController"); + assignValue(object, "aiController", new FieldData(fmeta), () -> Reflect.get(fobj, fmeta.field), val -> Reflect.set(fobj, fmeta.field, val), parser.resolveController(jsv.asString()), true); + }else if(fdata != null){ + if(checkField(fdata.field)) return; - var fields = parser.getJson().getFields(actualType); - var fdata = fields.get(field); - var fobj = object; + assignValue(object, field, new FieldData(fdata), () -> Reflect.get(fobj, fdata.field), fv -> { + if(fv == null && !fdata.field.isAnnotationPresent(Nullable.class) && !(Vars.headless && ContentParser.implicitNullable.contains(fdata.field.getType()))){ + warn("Field '@' cannot be null.", fdata.field); + return; + } + Reflect.set(fobj, fdata.field, fv); + }, value, true); + }else if(value instanceof JsonValue jsv && object instanceof Block bl && jsv.isObject() && field.equals("consumes")){ + Seq prevBuilder = Reflect.>get(Block.class, bl, "consumeBuilder").copy(); + boolean hadItems = bl.hasItems, hadLiquids = bl.hasLiquids, hadPower = bl.hasPower, acceptedItems = bl.acceptsItems; + Runnable resetCons = () -> { + Reflect.set(Block.class, bl, "consumeBuilder", prevBuilder); + bl.reinitializeConsumers(); + bl.hasItems = hadItems; + bl.hasLiquids = hadLiquids; + bl.hasPower = hadPower; + bl.acceptsItems = acceptedItems; + }; + reset(resetCons); - if(value instanceof JsonValue jsv && object instanceof UnitType && field.equals("controller")){ - var fmeta = fields.get("controller"); - assignValue(object, "controller", new FieldData(fmeta), () -> Reflect.get(fobj, fmeta.field), val -> Reflect.set(fobj, fmeta.field, val), (Func)(u -> parser.resolveController(jsv.asString()).get()), true); - }else if(value instanceof JsonValue jsv && object instanceof UnitType && field.equals("aiController")){ - var fmeta = fields.get("aiController"); - assignValue(object, "aiController", new FieldData(fmeta), () -> Reflect.get(fobj, fmeta.field), val -> Reflect.set(fobj, fmeta.field, val), parser.resolveController(jsv.asString()), true); - }else if(fdata != null){ - if(checkField(fdata.field)) return; - - assignValue(object, field, new FieldData(fdata), () -> Reflect.get(fobj, fdata.field), fv -> { - if(fv == null && !fdata.field.isAnnotationPresent(Nullable.class) && !(Vars.headless && ContentParser.implicitNullable.contains(fdata.field.getType()))){ - warn("Field '@' cannot be null.", fdata.field); - return; + try{ + bl.hasPower = false; //if a block doesn't have a power consumer, hasPower should be false. if it does, it will get set to true in reinitializeConsumers + parser.readBlockConsumers(bl, jsv); + bl.reinitializeConsumers(); + }catch(Throwable e){ + resetCons.run(); + Log.err(e); + warn("Failed to read consumers for '@': @", bl, Strings.getSimpleMessage(e)); } - Reflect.set(fobj, fdata.field, fv); - }, value, true); - }else if(value instanceof JsonValue jsv && object instanceof Block bl && jsv.isObject() && field.equals("consumes")){ - Seq prevBuilder = Reflect.>get(Block.class, bl, "consumeBuilder").copy(); - boolean hadItems = bl.hasItems, hadLiquids = bl.hasLiquids, hadPower = bl.hasPower, acceptedItems = bl.acceptsItems; - Runnable resetCons = () -> { - Reflect.set(Block.class, bl, "consumeBuilder", prevBuilder); - bl.reinitializeConsumers(); - bl.hasItems = hadItems; - bl.hasLiquids = hadLiquids; - bl.hasPower = hadPower; - bl.acceptsItems = acceptedItems; - }; - reset(resetCons); - - try{ - bl.hasPower = false; //if a block doesn't have a power consumer, hasPower should be false. if it does, it will get set to true in reinitializeConsumers - parser.readBlockConsumers(bl, jsv); - bl.reinitializeConsumers(); - }catch(Throwable e){ - resetCons.run(); - Log.err(e); - warn("Failed to read consumers for '@': @", bl, Strings.getSimpleMessage(e)); + }else if(value instanceof JsonValue jsv && object instanceof UnitType && field.equals("type")){ + var fmeta = fields.get("constructor"); + assignValue(object, "constructor", new FieldData(fmeta), () -> Reflect.get(fobj, fmeta.field), val -> Reflect.set(fobj, fmeta.field, val), parser.unitType(jsv), true); + }else{ + warn("Unknown field '@' for class '@'", field, actualType.getSimpleName()); } - }else if(value instanceof JsonValue jsv && object instanceof UnitType && field.equals("type")){ - var fmeta = fields.get("constructor"); - assignValue(object, "constructor", new FieldData(fmeta), () -> Reflect.get(fobj, fmeta.field), val -> Reflect.set(fobj, fmeta.field, val), parser.unitType(jsv), true); - }else{ - warn("Unknown field '@' for class '@'", field, actualType.getSimpleName()); } + }finally{ + visitStack.truncate(oldLength); } } @@ -426,7 +443,7 @@ public class DataPatcher{ if(modify) modifiedField(object, field, getter.get()); //HACK: listen for creation of objects once - parser.listeners.add((type, jsonData, result) -> created(result, object)); + parser.listeners.add((type, jsonData, result) -> created(result)); try{ setter.get(parser.getJson().readValue(metadata.type, metadata.elementType, jsv)); }catch(Throwable e){ @@ -485,7 +502,16 @@ public class DataPatcher{ return null; } - return new Object[]{object instanceof Seq s ? s.get(i) : Array.get(object, i), null}; + Object prev = object instanceof Seq s ? s.get(i) : Array.get(object, i); + reset(() -> { + if(object instanceof Seq seq){ + seq.set(i, prev); + }else{ + Array.set(object, i, prev); + } + }); + + return new Object[]{prev, metadata != null ? new FieldData(object instanceof Seq ? metadata.elementType : metadata.type.getComponentType(), null, null) : null}; }else if(object instanceof ObjectMap map){ Object key = convertKeyType(field, metadata.keyType); if(key == null){ @@ -534,12 +560,22 @@ public class DataPatcher{ if(usedpatches.add(record)){ resetters.add(() -> { try{ - record.field.set(record.target, record.value); + record.field.set(record.target, value); }catch(Exception e){ throw new RuntimeException(e); } }); } + }else if(target instanceof Seq || target.getClass().isArray()){ + int i = Integer.parseInt(field); + resetters.add(() -> { + + if(target instanceof Seq seq){ + seq.set(i, value); + }else{ + Array.set(target, i, value); + } + }); }else{ warn("Missing field " + field + " for object " + target); } diff --git a/core/src/mindustry/mod/ModListing.java b/core/src/mindustry/mod/ModListing.java index a39d12985b..e18623e204 100644 --- a/core/src/mindustry/mod/ModListing.java +++ b/core/src/mindustry/mod/ModListing.java @@ -2,8 +2,8 @@ package mindustry.mod; /** Mod listing as a data class. */ public class ModListing{ - public String repo, name, internalName, subtitle, author, lastUpdated, description, minGameVersion; - public boolean hasScripts, hasJava, iosCompatible; + public String repo, name, internalName, author, lastUpdated, description, minGameVersion; + public boolean hasScripts, hasJava, iosCompatible, legacyCompatible; public String[] contentTypes = {}; public int stars; diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 3815be9323..899cfef2ca 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -32,7 +32,8 @@ import static mindustry.Vars.*; public class Mods implements Loadable{ private static final String[] metaFiles = {"mod.json", "mod.hjson", "plugin.json", "plugin.hjson"}; - private static final ObjectSet blacklistedMods = ObjectSet.with("ui-lib", "braindustry"); + //it would be nice to parse semver and have syntax like "<1.0.5" here, but mods clearly don't use semver and it's an inconsistent mess + private static final ObjectSet blacklistedMods = ObjectSet.with("ui-lib", "braindustry", "schema", "scheme-size:1.0.5", "scheme-size:1.0.4", "scheme-size:1.0.3", "scheme-size:1.0.1", "scheme-size:1.0.0", "scheme-size:1.1.0", "scheme-size:1.0.4.1"); private Json json = new Json(); private @Nullable Scripts scripts; @@ -336,7 +337,7 @@ public class Mods implements Loadable{ packer.printStats(); - Events.fire(new AtlasPackEvent()); + Events.fire(new AtlasPackEvent(packer)); packer.dispose(); @@ -1183,7 +1184,8 @@ public class Mods implements Loadable{ !skipModLoading() && Core.settings.getBool("mod-" + baseName + "-enabled", true) && Version.isAtLeast(meta.minGameVersion) && - (meta.getMinMajor() >= minJavaModGameVersion || headless) && + (meta.getMinMajor() >= minJavaModGameVersion || headless || meta.legacyCompatible) && + !meta.isBlacklisted() && !skipModCode && initialize ){ @@ -1321,12 +1323,12 @@ public class Mods implements Loadable{ /** Some mods are known to cause issues with the game; this detects and returns whether a mod is manually blacklisted. */ public boolean isBlacklisted(){ - return blacklistedMods.contains(name); + return meta.isBlacklisted(); } /** @return whether this mod is outdated, i.e. not compatible with v8. */ public boolean isOutdated(){ - return getMinMajor() < (isJava() ? minJavaModGameVersion : minModGameVersion); + return getMinMajor() < (isJava() ? minJavaModGameVersion : minModGameVersion) && !meta.legacyCompatible; } public int getMinMajor(){ @@ -1427,8 +1429,15 @@ public class Mods implements Loadable{ public float texturescale = 1.0f; /** If true, bleeding is skipped and no content icons are generated. */ public boolean pregenerated; - /** If set, load the mod content in this order by content names */ + /** If set, load the mod content in this order by content names. */ public String[] contentOrder; + /** Mod from an older major version that is compatible with the latest one as well. */ + public boolean legacyCompatible; + + /** Some mods are known to cause issues with the game; this detects and returns whether a mod is manually blacklisted. */ + public boolean isBlacklisted(){ + return blacklistedMods.contains(name) || blacklistedMods.contains(name + ":" + version); + } public String shortDescription(){ return Strings.truncate(subtitle == null ? (description == null || description.length() > maxModSubtitleLength ? "" : description) : subtitle, maxModSubtitleLength, "..."); diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index f1c107d50a..47ff3fe168 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -13,6 +13,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.payloads.*; +import java.io.*; import java.util.regex.*; import static mindustry.Vars.*; @@ -611,7 +612,7 @@ public class Administration{ } } - public static class PlayerInfo{ + public static class PlayerInfo implements Serializable{ public String id; public String lastName = "", lastIP = ""; public Seq ips = new Seq<>(); @@ -704,6 +705,10 @@ public class Administration{ /** valid only for command building events */ public @Nullable int[] buildingPositions; + /** valid only for location pings */ + public @Nullable String pingText; + public float pingX, pingY; + public PlayerAction set(Player player, ActionType type, Tile tile){ this.player = player; this.type = type; @@ -733,7 +738,7 @@ public class Administration{ } public enum ActionType{ - breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem, control, buildSelect, command, removePlanned, commandUnits, commandBuilding, respawn, pickupBlock, dropPayload + breakBlock, placeBlock, rotate, configure, withdrawItem, depositItem, control, buildSelect, command, removePlanned, commandUnits, commandBuilding, respawn, pickupBlock, dropPayload, pingLocation } } diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index 4051453c38..607dd910ff 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -38,6 +38,7 @@ public class ArcNetProvider implements NetProvider{ private static final LZ4Compressor compressor = LZ4Factory.fastestInstance().fastCompressor(); private volatile int playerLimitCache, packetSpamLimit; + private Ratekeeper clientUdpErrorRate = new Ratekeeper(); public ArcNetProvider(){ ArcNet.errorHandler = e -> { @@ -57,7 +58,17 @@ public class ArcNetProvider implements NetProvider{ packetSpamLimit = Config.packetSpamLimit.num(); }); - client = new Client(8192, 16384, new PacketSerializer()); + client = new Client(8192, 16384, new PacketSerializer()){ + @Override + public void handleNetException(ArcNetException e){ + //allow occasional UDP network errors + if(net.client() && e.getMessage() != null && e.getMessage().contains("UDP deserialization") && clientUdpErrorRate.allow(5000, 2)){ + Log.err("UDP network error", e); + }else{ + super.handleNetException(e); + } + } + }; client.setDiscoveryPacket(packetSupplier); client.addListener(new NetListener(){ @Override @@ -161,7 +172,15 @@ public class ArcNetProvider implements NetProvider{ try{ net.handleServerReceived(k, pack); }catch(Throwable e){ - Log.err(e); + long time = Time.millis(); + //only kick due to errors if there are two within a short span of time + if(Time.timeSinceMillis(k.lastErrorTime) < 2000){ + k.connection.close(DcReason.error); + Log.err("Closing connection due to error: " + k.address + " / " + k.uuid, e); + }else{ + k.lastErrorTime = time; + Log.err("Error reading packet from connection: " + k.address + " / " + k.uuid, e); + } } }); } @@ -190,6 +209,8 @@ public class ArcNetProvider implements NetProvider{ @Override public void connectClient(String ip, int port, Runnable success){ + clientUdpErrorRate.reset(); + Threads.daemon(() -> { try{ //just in case @@ -215,6 +236,7 @@ public class ArcNetProvider implements NetProvider{ @Override public void disconnectClient(){ + clientUdpErrorRate.reset(); client.close(); } @@ -332,6 +354,8 @@ public class ArcNetProvider implements NetProvider{ class ArcConnection extends NetConnection{ public final Connection connection; + long lastErrorTime; + public ArcConnection(String address, Connection connection){ super(address); this.connection = connection; @@ -425,6 +449,7 @@ public class ArcNetProvider implements NetProvider{ }else{ //read length int, followed by compressed lz4 data Packet packet = Net.newPacket(id); + if(!packet.allow(net.server())) throw new RuntimeException("Invalid packet type for endpoint: " + packet.getClass()); var buffer = decompressBuffer.get(); int length = byteBuffer.getShort() & 0xffff; byte compression = byteBuffer.get(); diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java index 2b96a3f231..7892431374 100644 --- a/core/src/mindustry/net/BeControl.java +++ b/core/src/mindustry/net/BeControl.java @@ -35,6 +35,10 @@ public class BeControl{ } public BeControl(){ + + } + + public void init(){ if(active()){ Timer.schedule(() -> { if((Vars.clientLoaded || headless) && checkUpdates && !mobile){ @@ -47,7 +51,7 @@ public class BeControl{ try{ Fi dest = Fi.get(OS.prop("becopy")); Fi self = Fi.get(BeControl.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); - + for(Fi file : self.parent().findAll(f -> !f.equals(self))) file.delete(); self.copyTo(dest); diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index b53601bc1d..2c8a5eba80 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -265,6 +265,10 @@ public class Net{ * Call to handle a packet being received for the client. */ public void handleClientReceived(Packet object){ + if(!object.allow(false)){ + return; + } + object.handled(); if(object instanceof StreamBegin b){ @@ -305,6 +309,9 @@ public class Net{ * Call to handle a packet being received for the server. */ public void handleServerReceived(NetConnection connection, Packet object){ + if(!object.allow(true)){ + return; + } try{ if(connection.hasConnected || object.getPriority() == Packet.priorityHigh){ diff --git a/core/src/mindustry/net/Packet.java b/core/src/mindustry/net/Packet.java index e49b18c572..509f9cf36a 100644 --- a/core/src/mindustry/net/Packet.java +++ b/core/src/mindustry/net/Packet.java @@ -22,6 +22,10 @@ public abstract class Packet{ public void read(Reads read){} public void write(Writes write){} + public boolean allow(boolean server){ + return true; + } + public void read(Reads read, int length){ read(read); } diff --git a/core/src/mindustry/net/Packets.java b/core/src/mindustry/net/Packets.java index e766e59434..af4bc95b12 100644 --- a/core/src/mindustry/net/Packets.java +++ b/core/src/mindustry/net/Packets.java @@ -77,6 +77,11 @@ public class Packets{ public int total; public byte type; + @Override + public boolean allow(boolean server){ + return !server; + } + @Override public void write(Writes buffer){ buffer.i(id); @@ -96,6 +101,11 @@ public class Packets{ public int id; public byte[] data; + @Override + public boolean allow(boolean server){ + return !server; + } + @Override public void write(Writes buffer){ buffer.i(id); diff --git a/core/src/mindustry/net/Streamable.java b/core/src/mindustry/net/Streamable.java index c150fc26f3..f1a1c8e7e7 100644 --- a/core/src/mindustry/net/Streamable.java +++ b/core/src/mindustry/net/Streamable.java @@ -12,6 +12,11 @@ public class Streamable extends Packet{ return priorityHigh; } + @Override + public boolean allow(boolean server){ + return !server; + } + public static class StreamBuilder{ public final int id; public final byte type; diff --git a/core/src/mindustry/net/WorldReloader.java b/core/src/mindustry/net/WorldReloader.java index 8fb1949915..c427171e2d 100644 --- a/core/src/mindustry/net/WorldReloader.java +++ b/core/src/mindustry/net/WorldReloader.java @@ -34,7 +34,7 @@ public class WorldReloader{ }else{ if(net.client()){ net.reset(); - } + } logic.reset(); } diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 3343690cb1..47175052b6 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -123,6 +123,8 @@ public class Planet extends UnlockableContent{ public boolean clearSectorOnLose = false; /** Multiplier for enemy rebuild speeds; only applied in campaign (not standard rules) */ public float enemyBuildSpeedMultiplier = 1f; + /** Default activation delay for enemy factories, if not set in the campaign. */ + public float enemyFactoryActivationDelay = 0; /** If true, the enemy team always has infinite items. */ public boolean enemyInfiniteItems = true; /** If true, enemy cores are replaced with spawnpoints on this planet (for invasions) */ @@ -162,6 +164,9 @@ public class Planet extends UnlockableContent{ /** Loads the planet grid outline mesh. Clientside only. */ public Prov gridMeshLoader = () -> MeshBuilder.buildPlanetGrid(grid, outlineColor, outlineRad * radius); + /** If set, this planet will have the same stats as its parent. Use for shared campaigns. */ + public @Nullable Planet statParent; + /** Planets that are allowed to update at the same time as this one for background calculations. */ public ObjectSet updateGroup = new ObjectSet<>(); /** Global difficulty/modifier settings for this planet's campaign. */ @@ -178,6 +183,9 @@ public class Planet extends UnlockableContent{ /** Data indicating attack sector positions and sector mappings. */ public @Nullable PlanetData data; + /** Statistics of this planet campaign. If statParent is not null, this planet shares the same stats as the parent. */ + private CampaignStats campaignStats = new CampaignStats(); + public Planet(String name, Planet parent, float radius){ super(name); @@ -228,6 +236,34 @@ public class Planet extends UnlockableContent{ campaignRules = Core.settings.getJson(name + "-campaign-rules", CampaignRules.class, () -> campaignRules); } + public CampaignStats stats(){ + return statParent != null ? statParent.campaignStats : campaignStats; + } + + public void loadStats(){ + //there is no need to load stats if the parent's ones are used + if(statParent == null){ + campaignStats = Core.settings.getJson(name + "-campaign-stats", CampaignStats.class, CampaignStats::new); + } + } + + public void saveStats(){ + if(statParent != null && statParent != this){ + statParent.saveStats(); + }else{ + Core.settings.putJson(name + "-campaign-stats", campaignStats); + } + } + + public void clearStats(){ + if(statParent != null && statParent != this){ + statParent.clearStats(); + }else{ + campaignStats = new CampaignStats(); + saveStats(); + } + } + public @Nullable Sector getStartSector(){ return sectors.size == 0 ? null : sectors.get(startSector); } @@ -391,6 +427,7 @@ public class Planet extends UnlockableContent{ public void init(){ applyDefaultRules(campaignRules); loadRules(); + loadStats(); if(techTree == null){ techTree = TechTree.roots.find(n -> n.planet == this); diff --git a/core/src/mindustry/type/SectorPreset.java b/core/src/mindustry/type/SectorPreset.java index 4ceb099d4f..4a252b24eb 100644 --- a/core/src/mindustry/type/SectorPreset.java +++ b/core/src/mindustry/type/SectorPreset.java @@ -68,15 +68,21 @@ public class SectorPreset extends UnlockableContent{ } public void initialize(Planet planet, int sector){ + initialize(planet, sector, false); + } + + public void initialize(Planet planet, int sector, boolean override){ this.planet = planet; if(generator == null){ this.generator = new FileMapGenerator(fileName == null ? this.name : fileName, this); } this.originalPosition = sector; - //auto remap based on data - var data = planet.getData(); - if(data != null){ - sector = data.presets.get(name, sector); + if(!override){ + //auto remap based on data + var data = planet.getData(); + if(data != null){ + sector = data.presets.get(name, sector); + } } sector %= planet.sectors.size; this.sector = planet.sectors.get(sector == -1 ? 0 : sector); diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index e47316c1a1..c5dcf4d7a8 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -648,8 +648,12 @@ public class UnitType extends UnlockableContent implements Senseable{ /** Adds all available unit stances based on the unit's current state. This can change based on the command of the unit. */ public void getUnitStances(Unit unit, Seq out){ + if(!(unit.controller() instanceof CommandAI ai)) return; + + var current = ai.currentCommand(); + //return mining stances based on present items - if(unit.controller() instanceof CommandAI ai && ai.currentCommand() == UnitCommand.mineCommand){ + if(current == UnitCommand.mineCommand){ out.add(UnitStance.mineAuto); for(Item item : indexer.getAllPresentOres()){ if(unit.canMine(item) && ((mineFloor && indexer.hasOre(item)) || (mineWalls && indexer.hasWallOre(item)))){ @@ -660,8 +664,15 @@ public class UnitType extends UnlockableContent implements Senseable{ } } }else{ - out.addAll(stances); + for(var stance : stances){ + if(stance.isCompatible(current)){ + out.add(stance); + } + } } + + //there might be duplicates, but that shouldn't cause issues + out.addAll(current.extraStances); } public boolean allowStance(Unit unit, UnitStance stance){ @@ -795,7 +806,7 @@ public class UnitType extends UnlockableContent implements Senseable{ if(legSplashDamage > 0 && legSplashRange > 0){ stats.add(Stat.legSplashDamage, table -> { - table.add((String)(Core.bundle.format("bullet.splashdamage", Strings.autoFixed(legSplashDamage, 2), + table.add((Core.bundle.format("bullet.splashdamage", Strings.autoFixed(legSplashDamage, 2), Strings.autoFixed(legSplashRange / tilesize, 2))).replace("[stat]", "[white]") + " " + StatUnit.perLeg.localized()); }); } @@ -1066,10 +1077,13 @@ public class UnitType extends UnlockableContent implements Senseable{ //assign default commands. if(commands.size == 0){ - commands.add(UnitCommand.moveCommand, UnitCommand.enterPayloadCommand); + commands.add(UnitCommand.moveCommand); + + if(allowedInPayloads){ + commands.add(UnitCommand.enterPayloadCommand); + } if(canBoost){ - commands.add(UnitCommand.boostCommand); if(buildSpeed > 0f){ commands.add(UnitCommand.rebuildCommand, UnitCommand.assistCommand); @@ -1108,6 +1122,9 @@ public class UnitType extends UnlockableContent implements Senseable{ if(!flying){ stances.add(UnitStance.ram); } + if(canBoost){ + stances.add(UnitStance.boost); + } }else{ stances.addAll(UnitStance.stop, UnitStance.patrol); } diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 4e99cc38c1..d71e88ff86 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -24,6 +24,7 @@ import mindustry.game.*; import mindustry.gen.*; import java.io.*; +import java.util.*; public class Fonts{ private static final String mainFont = "fonts/font.woff"; @@ -71,6 +72,7 @@ public class Fonts{ incremental = true; //most people will never see the monospace font, so don't pre-bake anything characters = "\u0000 "; + fallback.add(() -> Fonts.def); }})).loaded = f -> Fonts.monospace = f; Core.assets.load("icon", Font.class, new FreeTypeFontLoaderParameter("fonts/icon.ttf", new FreeTypeFontParameter(){{ @@ -96,6 +98,26 @@ public class Fonts{ }})).loaded = f -> Fonts.logic = f; } + public static void loadExtraFonts(){ + //Japanese needs to override the default font with its own characters - see https://heistak.github.io/your-code-displays-japanese-wrong/ + if(Locale.getDefault().getLanguage().equals("ja")){ + Core.assets.load("font_jp", Font.class, new FreeTypeFontLoaderParameter("fonts/font_jp.woff", new FreeTypeFontParameter(){{ + size = 18; + incremental = true; + shadowColor = Color.darkGray; + shadowOffsetY = 2; + characters = "\u0000 "; + }})).loaded = f -> Fonts.def.data.setOverride(f.data); + + Core.assets.load("font_jp_outline", Font.class, new FreeTypeFontLoaderParameter("fonts/font_jp.woff", new FreeTypeFontParameter(){{ + size = 18; + incremental = true; + borderColor = Color.darkGray; + characters = "\u0000 "; + }})).loaded = f -> Fonts.outline.data.setOverride(f.data); + } + } + public static @Nullable String unicodeToName(int unicode){ return unicodeToName.get(unicode, () -> Iconc.codeToName.get(unicode)); } @@ -165,7 +187,7 @@ public class Fonts{ stringIcons.put("alphachan", stringIcons.get("alphaaaa")); - //TODO: mod emojis can't work because most mod icons are not on the UI page! + //TODO: mod emojis can't work because most mod icons are not on the UI page! /* if(Vars.mods.list().contains(m -> m.shouldBeEnabled())){ ContentType[] types = {ContentType.liquid, ContentType.item, ContentType.block, ContentType.status, ContentType.unit}; @@ -223,7 +245,7 @@ public class Fonts{ @Override public Font loadSync(AssetManager manager, String fileName, Fi file, FreeTypeFontLoaderParameter parameter){ - if(fileName.equals("outline")){ + if(fileName.endsWith("outline")){ parameter.fontParameters.borderWidth = Scl.scl(2f); parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth; } diff --git a/core/src/mindustry/ui/Menus.java b/core/src/mindustry/ui/Menus.java index 6533f455e1..5b9f651afb 100644 --- a/core/src/mindustry/ui/Menus.java +++ b/core/src/mindustry/ui/Menus.java @@ -122,29 +122,47 @@ public class Menus{ } @Remote(variants = Variant.both, unreliable = true) - public static void infoPopup(String message, float duration, int align, int top, int left, int bottom, int right){ + public static void infoPopup(@Nullable String message, @Nullable String id, float duration, int align, int top, int left, int bottom, int right){ if(message == null) return; - ui.showInfoPopup(message, duration, align, top, left, bottom, right); + ui.showInfoPopup(message, id, duration, align, top, left, bottom, right); + } + + @Remote(variants = Variant.both) + public static void infoPopupReliable(@Nullable String message, @Nullable String id, float duration, int align, int top, int left, int bottom, int right){ + infoPopup(message, id, duration, align, top, left, bottom, right); } @Remote(variants = Variant.both, unreliable = true) - public static void label(String message, float duration, float worldx, float worldy){ - if(message == null) return; - - ui.showLabel(message, duration, worldx, worldy); + public static void infoPopup(@Nullable String message, float duration, int align, int top, int left, int bottom, int right){ + infoPopup(message, null, duration, align, top, left, bottom, right); } @Remote(variants = Variant.both) - public static void infoPopupReliable(String message, float duration, int align, int top, int left, int bottom, int right){ + public static void infoPopupReliable(@Nullable String message, float duration, int align, int top, int left, int bottom, int right){ + infoPopup(message, duration, align, top, left, bottom, right); + } + + @Remote(variants = Variant.both, unreliable = true) + public static void label(@Nullable String message, int id, float duration, float worldx, float worldy){ if(message == null) return; - ui.showInfoPopup(message, duration, align, top, left, bottom, right); + ui.showLabel(message, id, duration, worldx, worldy); } @Remote(variants = Variant.both) - public static void labelReliable(String message, float duration, float worldx, float worldy){ - label(message, duration, worldx, worldy); + public static void labelReliable(@Nullable String message, int id, float duration, float worldx, float worldy){ + label(message, id, duration, worldx, worldy); + } + + @Remote(variants = Variant.both, unreliable = true) + public static void label(@Nullable String message, float duration, float worldx, float worldy){ + label(message, -1, duration, worldx, worldy); + } + + @Remote(variants = Variant.both) + public static void labelReliable(@Nullable String message, float duration, float worldx, float worldy){ + label(message, -1, duration, worldx, worldy); } @Remote(variants = Variant.both) @@ -168,6 +186,13 @@ public class Menus{ ui.showConfirm(Core.bundle.format("linkopen", uri), () -> Core.app.openURI(uri)); } + @Remote(variants = Variant.both) + public static void copyToClipboard(String text){ + if(text == null) return; + + ui.showConfirm(Core.bundle.format("clipboardcopy", text), () -> Core.app.setClipboardText(text)); + } + //internal use only @Remote public static void removeWorldLabel(int id){ diff --git a/core/src/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java index 896fdca8e3..1a4ae25d51 100644 --- a/core/src/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -276,6 +276,7 @@ public class Styles{ imageCheckedColor = Color.white; imageDownColor = Color.white; imageUpColor = Color.gray; + imageDisabledColor = Color.darkGray; }}; selecti = new ImageButtonStyle(){{ checked = buttonSelect; @@ -328,7 +329,7 @@ public class Styles{ down = flatDown; up = black6; over = flatOver; - disabled = black8; + disabled = black6; imageDisabledColor = Color.lightGray; imageUpColor = Color.white; }}; diff --git a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java index 8a978635ec..026f8b4017 100644 --- a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java @@ -69,6 +69,7 @@ public class CampaignRulesDialog extends BaseDialog{ check("@rules.fog", b -> rules.fog = b, () -> rules.fog); check("@rules.showspawns", b -> rules.showSpawns = b, () -> rules.showSpawns); check("@rules.randomwaveai", b -> rules.randomWaveAI = b, () -> rules.randomWaveAI); + check("@rules.pauseDisabled", b -> rules.pauseDisabled = b, () -> rules.pauseDisabled); if(planet.showRtsAIRule){ check("@rules.rtsai.campaign", b -> rules.rtsAI = b, () -> rules.rtsAI); diff --git a/core/src/mindustry/ui/dialogs/CanvasEditDialog.java b/core/src/mindustry/ui/dialogs/CanvasEditDialog.java new file mode 100644 index 0000000000..1ff852b782 --- /dev/null +++ b/core/src/mindustry/ui/dialogs/CanvasEditDialog.java @@ -0,0 +1,282 @@ +package mindustry.ui.dialogs; + +import arc.*; +import arc.files.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.input.*; +import arc.math.*; +import arc.math.geom.*; +import arc.scene.*; +import arc.scene.event.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.blocks.logic.*; +import mindustry.world.blocks.logic.CanvasBlock.*; + +import static mindustry.Vars.*; + +public class CanvasEditDialog extends BaseDialog{ + static final float refreshTime = 60f * 2f; + + int curColor; + boolean fill, modified, grid = true; + float time; + CanvasBuild canvas; + CanvasBlock block; + Pixmap pix; + Texture texture; + + public CanvasEditDialog(CanvasBuild canvas){ + super(""); + titleTable.remove(); + this.canvas = canvas; + block = (CanvasBlock)canvas.block; + int size = block.canvasSize; + pix = block.makePixmap(canvas.data, new Pixmap(size, size)); + texture = new Texture(pix); + curColor = block.palette[0]; + + addCloseButton(160f); + + buttons.button("@import", Icon.image, () -> platform.showFileChooser(true, "png", this::importFrom)); + + buttons.button("@export", Icon.export, () -> platform.showFileChooser(false, "png", this::exportTo)); + + hidden(() -> { + save(); + + texture.dispose(); + pix.dispose(); + }); + + resized(this::hide); + + //update at an interval so that people can see what is being drawn + update(() -> { + if(!canvas.isValid()){ + hide(); + } + + time += Time.delta; + + if(time >= refreshTime){ + save(); + time = 0f; + } + }); + + cont.table(Tex.pane, body -> { + body.add(new Element(){ + int lastX, lastY; + IntSeq stack = new IntSeq(); + + int convertX(float ex){ + return (int)((ex) / (width / size)); + } + + int convertY(float ey){ + return pix.height - 1 - (int)((ey) / (height / size)); + } + + { + addListener(new InputListener(){ + + @Override + public boolean touchDown(InputEvent event, float ex, float ey, int pointer, KeyCode button){ + int cx = convertX(ex), cy = convertY(ey); + + if(button == KeyCode.mouseLeft){ + if(fill){ + if(!pix.in(cx, cy)) return false; + stack.clear(); + int src = curColor; + int dst = pix.get(cx, cy); + if(src != dst){ + stack.add(Point2.pack(cx, cy)); + while(!stack.isEmpty()){ + int current = stack.pop(); + int x = Point2.x(current), y = Point2.y(current); + draw(x, y); + for(int i = 0; i < 4; i++){ + int nx = x + Geometry.d4x(i), ny = y + Geometry.d4y(i); + if(nx >= 0 && ny >= 0 && nx < pix.width && ny < pix.height && pix.getRaw(nx, ny) == dst){ + stack.add(Point2.pack(nx, ny)); + } + } + } + } + + return false; + }else{ + draw(cx, cy); + lastX = cx; + lastY = cy; + } + }else if(button == KeyCode.mouseMiddle){ + curColor = pix.get(cx, cy); + return false; + } + return true; + } + + @Override + public void touchDragged(InputEvent event, float ex, float ey, int pointer){ + if(fill) return; + int cx = convertX(ex), cy = convertY(ey); + Bresenham2.line(lastX, lastY, cx, cy, (x, y) -> draw(x, y)); + lastX = cx; + lastY = cy; + } + }); + } + + void draw(int x, int y){ + if(pix.in(x, y) && pix.get(x, y) != curColor){ + pix.set(x, y, curColor); + Pixmaps.drawPixel(texture, x, y, curColor); + modified = true; + } + } + + @Override + public void draw(){ + Tmp.tr1.set(texture); + Draw.alpha(parentAlpha); + Draw.rect(Tmp.tr1, x + width/2f, y + height/2f, width, height); + + //draw grid + if(grid){ + float xspace = (getWidth() / size); + float yspace = (getHeight() / size); + float s = 1f; + + int minspace = 10; + + int jumpx = (int)(Math.max(minspace, xspace) / xspace); + int jumpy = (int)(Math.max(minspace, yspace) / yspace); + + for(int x = 0; x <= size; x += jumpx){ + Fill.crect((int)(this.x + xspace * x - s), y - s, 2, getHeight() + (x == size ? 1 : 0)); + } + + for(int y = 0; y <= size; y += jumpy){ + Fill.crect(x - s, (int)(this.y + y * yspace - s), getWidth(), 2); + } + } + + if(!mobile){ + Vec2 s = screenToLocalCoordinates(Core.input.mouse()); + if(s.x >= 0 && s.y >= 0 && s.x < width && s.y < height){ + float sx = Mathf.round(s.x, width / size), sy = Mathf.round(s.y, height / size); + + Lines.stroke(Scl.scl(6f)); + Draw.color(Pal.accent); + Lines.rect(sx + x, sy + y, width / size, height / size, Lines.getStroke() - 1f); + + Draw.reset(); + } + } + } + }).size(mobile && !Core.graphics.isPortrait() ? Math.min(290f, Core.graphics.getHeight() / Scl.scl(1f) - 75f / Scl.scl(1f)) : 480f); + }).colspan(3); + + cont.row(); + + cont.table(Tex.button, t -> { + t.button(Icon.grid, Styles.clearNoneTogglei, () -> grid = !grid).checked(grid).size(44f); + }); + + cont.table(Tex.button, p -> { + for(int i = 0; i < block.palette.length; i++){ + int fi = i; + + if(i % 8 == 0){ + p.row(); + } + + var button = p.button(Tex.whiteui, Styles.squareTogglei, 30, () -> { + curColor = block.palette[fi]; + }).size(44).checked(b -> curColor == block.palette[fi]).get(); + button.getStyle().imageUpColor = new Color(block.palette[i]); + } + }); + + cont.table(Tex.button, t -> { + t.button(Icon.fill, Styles.clearNoneTogglei, () -> fill = !fill).size(44f); + }); + + buttons.defaults().size(150f, 64f); + } + + void exportTo(Fi file){ + try{ + file.writePng(pix); + }catch(Exception e){ + ui.showException(e); + } + } + + void importFrom(Fi file){ + try{ + Pixmap source = new Pixmap(file); + int size = pix.width; + if(source.width > size || source.height > size){ + float ratio = (float)Math.max(source.width, source.height) / size; + Pixmap dest = new Pixmap(size, size); + dest.draw(source, 0, 0, source.width, source.height, (size - (int)(source.width / ratio))/2, (size - (int)(source.height / ratio))/2, (int)(source.width / ratio), (int)(source.height / ratio)); + source.dispose(); + source = dest; + }else if(source.width < size || source.height < size){ + pix.fill(block.palette[0]); + Pixmap dest = new Pixmap(size, size); + dest.draw(source, (size - source.width)/2, (size - source.height)/2); + source.dispose(); + source = dest; + } + int sizeX = Math.min(source.width, pix.width), sizeY = Math.min(source.height, pix.height); + for(int x = 0; x < sizeX; x++){ + for(int y = 0; y < sizeY; y++){ + int c = source.getRaw(x, y); + pix.setRaw(x, y, findClosest(c)); + } + } + + texture.draw(pix); + modified = true; + }catch(Exception e){ + ui.showException("@editor.errorload", e); + } + } + + int findClosest(int color){ + //blend the new color over the bg color for more accurate selection + if(Color.ai(color) < 255){ + color = Pixmap.blend(block.palette[0], color); + } + Tmp.c1.set(color); + float nearestDst = 100f; + int nearest = 0; + for(int i = 0; i < block.palette.length; i++){ + if(block.palette[i] == color) return color; + Tmp.c2.set(block.palette[i]); + float dst = Tmp.c1.dst(Tmp.c2); + if(dst < nearestDst){ + nearest = i; + nearestDst = dst; + } + } + return block.palette[nearest]; + } + + void save(){ + if(modified && canvas.isValid()){ + canvas.configure(canvas.packPixmap(pix)); + modified = false; + } + } +} diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index b1aab84fae..bc658d7e18 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -81,14 +81,14 @@ public class ContentInfoDialog extends BaseDialog{ if(map.size == 0) continue; if(stats.useCategories){ - table.add("@category." + cat.name).color(Pal.accent).fillX(); + table.add(cat.localized()).color(Pal.accent).fillX(); table.row(); } for(Stat stat : map.keys()){ table.table(inset -> { inset.left(); - inset.add("[lightgray]" + stat.localized() + ":[] ").left().top(); + stats.statInfo(inset.add("[lightgray]" + stat.localized() + ":[] ").left().top(), stat); Seq arr = map.get(stat); for(StatValue value : arr){ value.display(inset); diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 98c85e5372..52e5181fa8 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -217,6 +217,7 @@ public class CustomRulesDialog extends BaseDialog{ category("environment"); + check("@rules.pauseDisabled", b -> rules.pauseDisabled = b, () -> rules.pauseDisabled); check("@rules.explosions", b -> rules.damageExplosions = b, () -> rules.damageExplosions); check("@rules.fire", b -> rules.fire = b, () -> rules.fire); check("@rules.fog", b -> rules.fog = b, () -> rules.fog); @@ -319,6 +320,7 @@ public class CustomRulesDialog extends BaseDialog{ check("@rules.fillitems", b -> teams.fillItems = b, () -> teams.fillItems); number("@rules.buildspeedmultiplier", f -> teams.buildSpeedMultiplier = f, () -> teams.buildSpeedMultiplier, 0.001f, 50f); + number("@rules.unitfactoryactivation", f -> teams.unitFactoryActivationDelay = f * 60f, () -> teams.unitFactoryActivationDelay / 60f); number("@rules.unitdamagemultiplier", f -> teams.unitDamageMultiplier = f, () -> teams.unitDamageMultiplier); number("@rules.unitcrashdamagemultiplier", f -> teams.unitCrashDamageMultiplier = f, () -> teams.unitCrashDamageMultiplier); number("@rules.unitminespeedmultiplier", f -> teams.unitMineSpeedMultiplier = f, () -> teams.unitMineSpeedMultiplier); diff --git a/core/src/mindustry/ui/dialogs/GameOverDialog.java b/core/src/mindustry/ui/dialogs/GameOverDialog.java index 343ae3afa8..55892ec517 100644 --- a/core/src/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustry/ui/dialogs/GameOverDialog.java @@ -2,16 +2,19 @@ package mindustry.ui.dialogs; import arc.*; import arc.flabel.*; +import arc.input.*; import arc.math.*; import arc.scene.actions.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.util.*; +import mindustry.*; import mindustry.core.GameState.*; -import mindustry.game.EventType.*; import mindustry.game.*; +import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.type.*; import mindustry.ui.*; import static mindustry.Vars.*; @@ -96,6 +99,7 @@ public class GameOverDialog extends BaseDialog{ } if(state.isCampaign()){ + Sector prev = state.getSector(); if(net.client()){ buttons.button("@gameover.disconnect", () -> { logic.reset(); @@ -107,6 +111,23 @@ public class GameOverDialog extends BaseDialog{ buttons.button("@continue", () -> { hide(); ui.planet.show(); + + if(prev.info.attempts >= 2 && prev.planet.campaignRules.difficulty == Difficulty.normal && Core.settings.getBoolOnce("difficultyguide")){ + Time.runTask(10f, () -> { + BaseDialog dialog = new BaseDialog("@difficulty.guide.title"); + dialog.setFillParent(false); + dialog.cont.add("@difficulty.guide").width(mobile ? 400f : 500f).wrap().pad(10f).get().setAlignment(Align.center, Align.center); + dialog.buttons.defaults().size(200f, 60f).pad(2f); + dialog.buttons.button("@hide", Icon.cancel, dialog::hide); + dialog.buttons.button("@difficulty.guide.confirm", Icon.book, () -> { + dialog.hide(); + Vars.ui.campaignRules.show(prev.planet); + }); + dialog.keyDown(KeyCode.escape, dialog::hide); + dialog.keyDown(KeyCode.back, dialog::hide); + dialog.show(); + }); + } }).size(170f, 60f); } }else{ @@ -123,7 +144,7 @@ public class GameOverDialog extends BaseDialog{ parent.add(new StatLabel(stat, value, delay)).top().pad(5).growX().height(50).row(); } - private static class StatLabel extends Table { + private static class StatLabel extends Table{ private float progress = 0; public StatLabel(String stat, int value, float delay){ @@ -141,8 +162,8 @@ public class GameOverDialog extends BaseDialog{ Label valueLabel = new Label("", Styles.outlineLabel); valueLabel.setAlignment(Align.right); - add(statLabel).left().growX().padLeft(5); - add(valueLabel).right().growX().padRight(5); + add(statLabel).left().growX().uniformX().padLeft(5); + add(valueLabel).right().growX().uniformX().padRight(5); actions( Actions.scaleTo(0, 1), diff --git a/core/src/mindustry/ui/dialogs/IconSelectDialog.java b/core/src/mindustry/ui/dialogs/IconSelectDialog.java index 459fbda0d6..5ccec6d605 100644 --- a/core/src/mindustry/ui/dialogs/IconSelectDialog.java +++ b/core/src/mindustry/ui/dialogs/IconSelectDialog.java @@ -35,7 +35,7 @@ public class IconSelectDialog extends Dialog{ consumer.get(0); }); - int cols = (int)Math.min(20, Core.graphics.getWidth() / Scl.scl(52f)); + int cols = Math.max((int)Math.min(20, Core.graphics.getWidth() / Scl.scl(52f)), 1); int i = 1; for(var key : accessibleIcons){ diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 0c38dd9ab2..a6c4cee76d 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -439,10 +439,10 @@ public class JoinDialog extends BaseDialog{ } if(!serverSearch.isEmpty() && !(group.name.toLowerCase().contains(serverSearch) - || res.name.toLowerCase().contains(serverSearch) - || res.description.toLowerCase().contains(serverSearch) - || res.mapname.toLowerCase().contains(serverSearch) - || (res.modeName != null && res.modeName.toLowerCase().contains(serverSearch)))) return; + || Strings.stripColors(res.name.toLowerCase()).contains(serverSearch) + || Strings.stripColors(res.description.toLowerCase()).contains(serverSearch) + || Strings.stripColors(res.mapname.toLowerCase()).contains(serverSearch) + || (res.modeName != null && Strings.stripColors(res.modeName.toLowerCase()).contains(serverSearch)))) return; if(groupTable[0] == null){ addHeader(groupTable, group, hidden, favorite, true); @@ -582,7 +582,7 @@ public class JoinDialog extends BaseDialog{ local.button(b -> buildServer(host, b, true, true), style, () -> { Events.fire(new ClientPreConnectEvent(host)); safeConnect(host.address, host.port, host.version); - }).width(w).top().left().growY(); + }).width(w).top().left().pad(2f).growY(); } public void connect(String ip, int port){ diff --git a/core/src/mindustry/ui/dialogs/MapListDialog.java b/core/src/mindustry/ui/dialogs/MapListDialog.java index 1cdd01e0c6..3cd420b8b4 100644 --- a/core/src/mindustry/ui/dialogs/MapListDialog.java +++ b/core/src/mindustry/ui/dialogs/MapListDialog.java @@ -27,8 +27,12 @@ public abstract class MapListDialog extends BaseDialog{ private boolean showBuiltIn = Core.settings.getBool("editorshowbuiltinmaps", true), showCustom = Core.settings.getBool("editorshowcustommaps", true), + showModded = Core.settings.getBool("editorshowmoddedmaps", true), searchAuthor = Core.settings.getBool("editorsearchauthor", false), searchDescription = Core.settings.getBool("editorsearchdescription", false), + searchModname = Core.settings.getBool("editorsearchmodname", false), + prioritizeModded = Core.settings.getBool("editorprioritizemodded", false), + prioritizeCustom = Core.settings.getBool("editorprioritizecustom", false), displayType; public MapListDialog(String title, boolean displayType){ @@ -88,7 +92,7 @@ public abstract class MapListDialog extends BaseDialog{ cont.add(search).growX(); cont.row(); - cont.add(pane).padLeft(28f).uniformX().growY(); + cont.add(pane).padLeft(28f).uniformX().grow().padBottom(64f); } void rebuildMaps(){ @@ -102,62 +106,78 @@ public abstract class MapListDialog extends BaseDialog{ int i = 0; - Seq mapList = showCustom ? - showBuiltIn ? maps.all() : maps.customMaps() : - showBuiltIn ? maps.defaultMaps() : null; + Seq mapList = new Seq<>(); - if(mapList != null){ - for(Map map : mapList){ + if(showCustom) mapList.addAll(maps.customMaps()); + if(showBuiltIn) mapList.addAll(maps.defaultMaps()); + if(showModded) mapList.addAll(maps.moddedMaps()); - boolean invalid = false; - for(Gamemode mode : modes){ - invalid |= !mode.valid(map); - } - if(invalid || (searchString != null - && !map.plainName().toLowerCase().contains(searchString) - && (!searchAuthor || !map.plainAuthor().toLowerCase().contains(searchString)) - && (!searchDescription || !map.plainDescription().toLowerCase().contains(searchString)))){ - continue; - } + mapList.distinct(); - noMapsShown = false; + if(prioritizeModded){ + Seq ordered = new Seq<>(); + ordered.addAll(mapList.select(m -> m.mod != null).sortComparing(m -> m.mod.meta.displayName)); + ordered.addAll(mapList.select(m -> m.mod == null).sortComparing(m -> m.plainName())); + mapList = ordered; + }else if(prioritizeCustom){ + Seq ordered = new Seq<>(); + ordered.addAll(mapList.select(m -> m.custom)).sortComparing(m -> m.plainName()); + ordered.addAll(mapList.select(m -> !m.custom).sortComparing(m -> m.plainName())); + mapList = ordered; + }else{ + mapList.sortComparing(m -> m.plainName()); + } + for(Map map : mapList){ - if(i % maxwidth == 0){ - mapTable.row(); - } - - TextButton button = mapTable.button("", Styles.grayt, () -> showMap(map)).width(mapsize).bottom().pad(8).get(); - button.clearChildren(); - button.margin(9); - button.bottom(); - - //TODO hide in editor? - button.table(t -> { - t.left(); - for(Gamemode mode : Gamemode.all){ - TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name()) + "Small"); - if(mode.valid(map) && Core.atlas.isFound(icon.getRegion())){ - t.image(icon).size(16f).pad(4f); - } - } - if(t.getChildren().size == 0){ - t.add().size(16f).pad(4f); - } - }).left().row(); - - button.add(map.name()).width(mapsize - 18f).center().get().setEllipsis(true); - button.row(); - button.image().growX().pad(4).color(Pal.gray); - button.row(); - button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f); - - if(displayType){ - button.row(); - button.add(map.custom ? "@custom" : map.workshop ? "@workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.displayName : "@builtin").color(Color.gray).padTop(3); - } - - i++; + boolean invalid = false; + for(Gamemode mode : modes){ + invalid |= !mode.valid(map); } + if(invalid || (searchString != null + && !map.plainName().toLowerCase().contains(searchString) + && (!searchAuthor || !map.plainAuthor().toLowerCase().contains(searchString)) + && (!searchDescription || !map.plainDescription().toLowerCase().contains(searchString)) + && (!searchModname || !(map.mod == null ? "" : Strings.stripColors(map.mod.meta.displayName).toLowerCase()).contains(searchString)))){ + continue; + } + + noMapsShown = false; + + if(i % maxwidth == 0){ + mapTable.row(); + } + + TextButton button = mapTable.button("", Styles.grayt, () -> showMap(map)).width(mapsize).bottom().pad(8).get(); + button.clearChildren(); + button.margin(9); + button.bottom(); + + //TODO hide in editor? + button.table(t -> { + t.left(); + for(Gamemode mode : Gamemode.all){ + TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name()) + "Small"); + if(mode.valid(map) && Core.atlas.isFound(icon.getRegion())){ + t.image(icon).size(16f).pad(4f); + } + } + if(t.getChildren().size == 0){ + t.add().size(16f).pad(4f); + } + }).left().row(); + + button.add(map.name()).width(mapsize - 18f).center().get().setEllipsis(true); + button.row(); + button.image().growX().pad(4).color(Pal.gray); + button.row(); + button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f); + + if(displayType){ + button.row(); + button.add(map.custom ? "@custom" : map.workshop ? "@workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.displayName : "@builtin").color(Color.gray).padTop(3); + } + + i++; } if(noMapsShown){ @@ -169,29 +189,63 @@ public abstract class MapListDialog extends BaseDialog{ activeDialog = new BaseDialog("@editor.filters"); activeDialog.addCloseButton(); activeDialog.cont.table(menu -> { - menu.add("@editor.filters.mode").width(150f).left(); - menu.table(t -> { - for(Gamemode mode : Gamemode.all){ - TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name())); - if(Core.atlas.isFound(icon.getRegion())){ - t.button(icon, Styles.emptyTogglei, () -> { - if(modes.contains(mode)){ - modes.remove(mode); - }else{ - modes.add(mode); + menu.table(tab -> { + // Gamemodes + tab.table(t -> { + t.add("@editor.filters.mode").padBottom(6f).row(); + t.table(Tex.button, left -> { + for(Gamemode mode : Gamemode.all){ + TextureRegionDrawable icon = Vars.ui.getIcon("mode" + Strings.capitalize(mode.name())); + if(Core.atlas.isFound(icon.getRegion())){ + left.button(icon, Styles.emptyTogglei, () -> { + if(modes.contains(mode)){ + modes.remove(mode); + }else{ + modes.add(mode); + } + rebuildMaps(); + }).left().size(60f).checked(modes.contains(mode)).tooltip("@mode." + mode.name() + ".name"); } + } + }); + }).pad(5f); + tab.add().width(60f); + // Priorities + tab.table(t -> { + t.add("@editor.filters.priorities").padBottom(6f).row(); + t.table(Tex.button, right ->{ + right.button(ui.getIcon("players"), Styles.emptyTogglei, () -> { + prioritizeCustom = !prioritizeCustom; + if(prioritizeModded){ + prioritizeModded = false; + Core.settings.put("editorprioritizemodded", false); + } + Core.settings.put("editorprioritizecustom", prioritizeCustom); rebuildMaps(); - }).size(60f).checked(modes.contains(mode)).tooltip("@mode." + mode.name() + ".name"); - } - } + }).size(60f).checked(b -> showCustom && prioritizeCustom).tooltip("@editor.filters.prioritizecustom").disabled(b -> !showCustom); + right.button(ui.getIcon("hammer"), Styles.emptyTogglei, () -> { + prioritizeModded = !prioritizeModded; + if(prioritizeCustom){ + prioritizeCustom = false; + Core.settings.put("editorprioritizecustom", false); + } + Core.settings.put("editorprioritizemodded", prioritizeModded); + rebuildMaps(); + }).size(60f).checked(b-> showModded && prioritizeModded).tooltip("@editor.filters.prioritizemod").disabled(b -> !showModded); + }); + }).expandX().pad(5f); }).padBottom(10f); menu.row(); - menu.add("@editor.filters.type").width(150f).left(); + menu.add("@editor.filters.type").width(120f).left().row(); menu.table(Tex.button, t -> { t.button("@custom", Styles.flatTogglet, () -> { showCustom = !showCustom; Core.settings.put("editorshowcustommaps", showCustom); + if(!showCustom){ + prioritizeCustom = false; + Core.settings.put("editorprioritizecustom", false); + } rebuildMaps(); }).size(150f, 60f).checked(showCustom); t.button("@builtin", Styles.flatTogglet, () -> { @@ -199,10 +253,18 @@ public abstract class MapListDialog extends BaseDialog{ Core.settings.put("editorshowbuiltinmaps", showBuiltIn); rebuildMaps(); }).size(150f, 60f).checked(showBuiltIn); + t.button("@modded", Styles.flatTogglet, () -> { + showModded = !showModded; + Core.settings.put("editorshowmoddedmaps", showModded); + if(!showModded){ + prioritizeModded = false; + Core.settings.put("editorprioritizemodded", false); + } + rebuildMaps(); + }).size(150f, 60f).checked(showModded); }).padBottom(10f); menu.row(); - - menu.add("@editor.filters.search").width(150f).left(); + menu.add("@editor.filters.search").width(120f).left().row(); menu.table(Tex.button, t -> { t.button("@editor.filters.author", Styles.flatTogglet, () -> { searchAuthor = !searchAuthor; @@ -214,6 +276,11 @@ public abstract class MapListDialog extends BaseDialog{ Core.settings.put("editorsearchdescription", searchDescription); rebuildMaps(); }).size(150f, 60f).checked(searchDescription); + t.button("@editor.filters.modname", Styles.flatTogglet, () -> { + searchModname = !searchModname; + Core.settings.put("editorsearchmodname", searchModname); + rebuildMaps(); + }).size(150f, 60f).checked(searchModname); }); }); diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 96bab6f64b..96515fb70f 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -314,7 +314,7 @@ public class ModsDialog extends BaseDialog{ }).size(50f); } }).growX().right().padRight(-8f).padTop(-8f); - }, Styles.flatBordert, () -> showMod(item)).size(w, h).growX().pad(4f); + }, Styles.grayt, () -> showMod(item)).size(w, h).growX().pad(4f); pane[0].row(); } } @@ -544,11 +544,11 @@ public class ModsDialog extends BaseDialog{ "\n[lightgray]\uE809 " + mod.stars + (!Version.isAtLeast(mod.minGameVersion) ? "\n" + Core.bundle.format("mod.requiresversion", mod.minGameVersion) : - ((mod.hasJava && Strings.parseDouble(mod.minGameVersion, 0) < minJavaModGameVersion) ? "\n" + Core.bundle.get("mod.incompatiblemod") : "")); + ((mod.hasJava && Strings.parseDouble(mod.minGameVersion, 0) < minJavaModGameVersion && !mod.legacyCompatible) ? "\n" + Core.bundle.get("mod.incompatiblemod") : "")); con.add(infoText).width(358f).wrap().grow().pad(4f, 2f, 4f, 6f).top().left().labelAlign(Align.topLeft); - }, Styles.flatBordert, () -> { + }, Styles.grayt, () -> { var sel = new BaseDialog(mod.name); sel.cont.pane(p -> p.add(mod.description + "\n\n[accent]" + Core.bundle.get("editor.author") + "[lightgray] " + mod.author) .width(mobile ? 400f : 500f).wrap().pad(4f).labelAlign(Align.center, Align.left)).grow(); diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index 8c8b7c4966..34bda027dc 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -36,7 +36,13 @@ public class PausedDialog extends BaseDialog{ }).size(70f).tooltip("@customize").visible(() -> state.rules.allowEditRules && (net.server() || !net.active())); })).grow().row(); - shown(this::rebuild); + shown(() -> { + rebuild(); + + if(state.isCampaign()){ + state.getPlanet().saveStats(); + } + }); addCloseListener(); } @@ -54,10 +60,14 @@ public class PausedDialog extends BaseDialog{ float dw = 220f; cont.defaults().width(dw).height(55).pad(5f); - cont.button("@objective", Icon.info, () -> ui.fullText.show("@objective", state.rules.sector.preset.description)) - .visible(() -> state.rules.sector != null && state.rules.sector.preset != null && state.rules.sector.preset.description != null).padTop(-60f); + boolean showObjective = state.rules.sector != null && state.rules.sector.preset != null && state.rules.sector.preset.description != null; + + if(showObjective){ + cont.button("@objective", Icon.info, () -> ui.fullText.show("@objective", state.rules.sector != null && state.rules.sector.preset != null ? state.rules.sector.preset.description : "oh dear")).padTop(-60f); + } cont.button("@abandon", Icon.cancel, () -> ui.planet.abandonSectorConfirm(state.rules.sector, this::hide)).padTop(-60f) + .colspan(showObjective ? 1 : 2).width(showObjective ? dw : dw * 2 + 10f) .disabled(b -> net.client() || state.gameOver).visible(() -> state.rules.sector != null).row(); cont.button("@back", Icon.left, this::hide).name("back"); diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index c252d74b6c..a8d281b886 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -72,7 +72,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ private Texture[] planetTextures; private Element mainView; - private CampaignRulesDialog campaignRules = new CampaignRulesDialog(); private SectorSelectDialog selectDialog = new SectorSelectDialog(); public PlanetDialog(){ @@ -213,6 +212,12 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ diag.hide(); }).size(300f, 64f).disabled(b -> selected[0] == null); + app.post(diag::show); + }else if(hadSerpuloRemaps && settings.getBoolOnce("serpulo-remaps-notice")){ + var diag = new BaseDialog("@campaign.rework.title"); + diag.cont.add("@campaign.rework.serpulo").labelAlign(Align.center).growX().wrap().maxWidth(500f); + diag.buttons.button("@ok", Icon.ok, diag::hide).size(280f, 64f); + app.post(diag::show); } }); @@ -226,11 +231,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ }}).loaded = t -> planetTextures[fi] = t; assets.finishLoadingAsset(names[i]); } - - //unlock defaults for older campaign saves (TODO move? where to?) - if(content.planets().contains(p -> p.sectors.contains(Sector::hasBase)) || Blocks.scatter.unlocked() || Blocks.router.unlocked()){ - Seq.with(Blocks.junction, Blocks.mechanicalDrill, Blocks.conveyor, Blocks.duo, Items.copper, Items.lead).each(UnlockableContent::quietUnlock); - } } /** show with no limitations, just as a map. */ @@ -414,7 +414,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ boolean canSelect(Sector sector){ if(mode == select) return sector.hasBase() && launchSector != null && sector.planet == launchSector.planet; - if(mode == planetLaunch && sector.hasBase()) return false; + //sectors with addStartingItems = true can't be landed on, as they override the core and items of the interplanetary accelerator + //at the moment, this is only true of Ground Zero in vanilla + //TODO: maybe relax these restrictions and add better support for these sorts of "tutorial" starting sectors later + if(mode == planetLaunch && (sector.hasBase() || (sector.preset != null && sector.preset.addStartingItems))) return false; if(sector.planet.generator == null) return false; @@ -513,8 +516,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ for(Sector sec : planet.sectors){ //draw shield arc - if(sec.shieldTarget != null && !sec.isCaptured() && !sec.shieldTarget.isCaptured()){ - planets.drawArcLine(planet, sec.tile.v, sec.shieldTarget.tile.v, Team.crux.color.write(Tmp.c2).a(state.uiAlpha), Tmp.c3.set(Tmp.c2).mulA(0.5f), 0.15f, 110f, 25, 0.006f); + if(sec.shieldTarget != null && !sec.isCaptured() && !sec.shieldTarget.isCaptured() && (planet.generator.allowLanding(sec) || planet.generator.allowLanding(sec.shieldTarget))){ + planets.drawArcLine(planet, sec.tile.v, sec.shieldTarget.tile.v, Team.crux.color.write(Tmp.c2).a(state.uiAlpha), Tmp.c3.set(Tmp.c2).mulA(0.5f), 0.3f, 110f, 25, 0.006f); } if(sec.hasBase()){ @@ -731,7 +734,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ ScrollPane pane = new ScrollPane(null, Styles.smallPane); t.add(pane).colspan(2).row(); t.button("@campaign.difficulty", Icon.bookSmall, () -> { - campaignRules.show(state.planet); + Vars.ui.campaignRules.show(state.planet); }).margin(12f).size(208f, 40f).padTop(12f).visible(() -> state.planet.allowCampaignRules && mode != planetLaunch).row(); t.add().height(64f); //padding for close button Table starsTable = new Table(Styles.black); diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index e9e8bb7b6a..1242eefc43 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -54,11 +54,16 @@ public class SettingsMenuDialog extends BaseDialog{ rebuildMenu(); }); + int[] lastRebuildSize = {Core.graphics.getWidth(), Core.graphics.getHeight()}; onResize(() -> { - graphics.rebuild(); - sound.rebuild(); - game.rebuild(); - updateScrollFocus(); + if(lastRebuildSize[0] != Core.graphics.getWidth() || lastRebuildSize[1] != Core.graphics.getHeight()){ + graphics.rebuild(); + sound.rebuild(); + game.rebuild(); + updateScrollFocus(); + lastRebuildSize[0] = Core.graphics.getWidth(); + lastRebuildSize[1] = Core.graphics.getHeight(); + } }); cont.clearChildren(); @@ -134,6 +139,7 @@ public class SettingsMenuDialog extends BaseDialog{ t.button("@settings.clearcampaignsaves", Icon.trash, style, () -> { ui.showConfirm("@confirm", "@settings.clearcampaignsaves.confirm", () -> { for(var planet : content.planets()){ + planet.clearStats(); for(var sec : planet.sectors){ sec.clearInfo(); if(sec.save != null){ @@ -326,10 +332,6 @@ public class SettingsMenuDialog extends BaseDialog{ } }*/ - if(!mobile){ - game.checkPref("crashreport", true); - } - game.checkPref("communityservers", true, val -> { defaultServers.clear(); if(val){ @@ -369,9 +371,14 @@ public class SettingsMenuDialog extends BaseDialog{ } } - if(!mobile){ - game.checkPref("console", false); - } + game.checkPref("console", false); + + graphics.sliderPref("uiEdgePadding", 0, 0, 100, s -> s + "px", s -> { + if(ui != null){ + ui.updateMargins(); + Core.scene.resize(Core.graphics.getWidth(), Core.graphics.getHeight()); + } + }); int[] lastUiScale = {settings.getInt("uiscale", 100)}; @@ -425,20 +432,13 @@ public class SettingsMenuDialog extends BaseDialog{ if(!mobile){ graphics.checkPref("vsync", true, b -> Core.graphics.setVSync(b)); - graphics.checkPref("fullscreen", false, b -> { - if(b){ - Core.graphics.setFullscreen(); - }else{ - Core.graphics.setWindowedMode(Core.graphics.getWidth(), Core.graphics.getHeight()); - } - }); + graphics.checkPref("fullscreen", false, b -> Core.graphics.setFullscreen(b)); Core.graphics.setVSync(Core.settings.getBool("vsync")); if(Core.settings.getBool("fullscreen")){ - Core.app.post(() -> Core.graphics.setFullscreen()); + Core.app.post(() -> Core.graphics.setFullscreen(true)); } - }else if(!ios){ graphics.checkPref("landscape", false, b -> { if(b){ @@ -454,7 +454,7 @@ public class SettingsMenuDialog extends BaseDialog{ } graphics.checkPref("effects", true); - graphics.checkPref("atmosphere", !mobile); + graphics.checkPref("atmosphere", true); graphics.checkPref("drawlight", true); graphics.checkPref("destroyedblocks", true); graphics.checkPref("blockstatus", false); @@ -473,13 +473,14 @@ public class SettingsMenuDialog extends BaseDialog{ } graphics.checkPref("fps", false); graphics.checkPref("playerindicators", true); + graphics.checkPref("showpings", true); + graphics.checkPref("showotherbuildplans", true); graphics.checkPref("indicators", true); graphics.checkPref("showweather", true); graphics.checkPref("animatedwater", true); if(Shaders.shield != null){ - //animated shields are off by default on android (generally lower spec devices) - graphics.checkPref("animatedshields", !android); + graphics.checkPref("animatedshields", true); } graphics.checkPref("bloom", true, val -> renderer.toggleBloom(val)); @@ -656,8 +657,16 @@ public class SettingsMenuDialog extends BaseDialog{ } public SliderSetting sliderPref(String name, int def, int min, int max, int step, StringProcessor s){ + return sliderPref(name, def, min, max, step, s, null); + } + + public SliderSetting sliderPref(String name, int def, int min, int max, StringProcessor s, Intc changed){ + return sliderPref(name, def, min, max, 1, s, changed); + } + + public SliderSetting sliderPref(String name, int def, int min, int max, int step, StringProcessor s, Intc changed){ SliderSetting res; - list.add(res = new SliderSetting(name, def, min, max, step, s)); + list.add(res = new SliderSetting(name, def, min, max, step, s, changed)); settings.defaults(name, def); rebuild(); return res; @@ -766,14 +775,16 @@ public class SettingsMenuDialog extends BaseDialog{ public static class SliderSetting extends Setting{ int def, min, max, step; StringProcessor sp; + Intc changed; - public SliderSetting(String name, int def, int min, int max, int step, StringProcessor s){ + public SliderSetting(String name, int def, int min, int max, int step, StringProcessor s, Intc changed){ super(name); this.def = def; this.min = min; this.max = max; this.step = step; this.sp = s; + this.changed = changed; } @Override @@ -792,6 +803,7 @@ public class SettingsMenuDialog extends BaseDialog{ slider.changed(() -> { settings.put(name, (int)slider.getValue()); value.setText(sp.get((int)slider.getValue())); + if(changed != null) changed.get((int)slider.getValue()); }); slider.change(); diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index add50b5864..b807e2195d 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -39,6 +39,7 @@ public class ChatFragment extends Table{ private Seq history = new Seq<>(); private int historyPos = 0; private int scrollPos = 0; + private boolean lastFrameHadFocus; public ChatFragment(){ super(); @@ -59,8 +60,9 @@ public class ChatFragment extends Table{ }); update(() -> { + boolean hasOtherFocus = (scene.getKeyboardFocus() != null && !chatfield.hasKeyboard()) && !(ui.minimapfrag.shown() && !(scene.getKeyboardFocus() instanceof TextField)); - if(net.active() && input.keyTap(Binding.chat) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null || ui.minimapfrag.shown()) && !ui.consolefrag.shown()){ + if(net.active() && input.keyTap(Binding.chat) && !hasOtherFocus && !lastFrameHadFocus && !ui.consolefrag.shown()){ toggle(); } @@ -79,6 +81,8 @@ public class ChatFragment extends Table{ } scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chatScroll), 0, Math.max(0, messages.size - messagesShown)); } + + lastFrameHadFocus = hasOtherFocus; }); history.insert(0, ""); @@ -194,6 +198,26 @@ public class ChatFragment extends Table{ } } + //ping format: "x,y [text]" + private void checkPing(String message){ + int comma = message.indexOf(','); + if(comma != -1){ + int space = message.indexOf(' ', comma + 1); + //handle a space after the comma + boolean extra = false; + if(space == comma + 1){ + extra = true; + space = message.indexOf(' ', comma + 2); + } + if(space != -1){ + int x = Strings.parseInt(message, 10, -1, 0, comma), y = Strings.parseInt(message, 10, -1, comma + 1 + (extra ? 1 : 0), space); + if(world.tiles.in(x, y)){ + Call.pingLocation(player, x * tilesize, y * tilesize, message.substring(space).trim()); + } + } + } + } + private void sendMessage(){ String message = chatfield.getText().trim(); clearChatInput(); @@ -205,6 +229,8 @@ public class ChatFragment extends Table{ message = UI.formatIcons(message); + checkPing(message); + Events.fire(new ClientChatEvent(message)); Call.sendChatMessage(message); diff --git a/core/src/mindustry/ui/fragments/ConsoleFragment.java b/core/src/mindustry/ui/fragments/ConsoleFragment.java index 3542163354..07e24fe2b6 100644 --- a/core/src/mindustry/ui/fragments/ConsoleFragment.java +++ b/core/src/mindustry/ui/fragments/ConsoleFragment.java @@ -13,6 +13,7 @@ import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.game.EventType.*; +import mindustry.gen.*; import mindustry.input.*; import mindustry.ui.*; @@ -27,8 +28,8 @@ public class ConsoleFragment extends Table{ private Label fieldlabel = new Label(">"); private Font font; private GlyphLayout layout = new GlyphLayout(); - private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50); - private Color shadowColor = new Color(0, 0, 0, 0.4f); + private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = mobile ? Scl.scl(60) : Scl.scl(50); + private Color shadowColor = new Color(0, 0, 0, 0.7f); private float textspacing = Scl.scl(10); private Seq history = new Seq<>(); private int historyPos = 0; @@ -53,6 +54,8 @@ public class ConsoleFragment extends Table{ clearChatInput(); } + if(mobile) open = false; + return shown; }); @@ -102,7 +105,36 @@ public class ConsoleFragment extends Table{ bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(6f); - add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); + if(mobile){ + float s = 58f; + button(Icon.chat, Styles.cleari, () -> { + TextInput input = new TextInput(); + input.accepted = text -> { + chatfield.setText(text); + sendMessage(); + clearChatInput(); + Core.input.setOnscreenKeyboardVisible(false); + }; + Core.input.getTextInput(input); + }).left().padLeft(-offsetx * 2f - 5f).size(s); + + button(Icon.upOpen, Styles.cleari, () -> scrollPos = Mathf.clamp(scrollPos + 1, 0, Math.max(0, messages.size))).disabled(b -> scrollPos >= messages.size).size(s).padLeft(4f); + + button(Icon.downOpen, Styles.cleari, () -> scrollPos = Mathf.clamp(scrollPos - 1, 0, Math.max(0, messages.size))).disabled(b -> scrollPos <= 0).size(s).padLeft(4f); + + button(Icon.fileText, Styles.cleari, () -> platform.showFileChooser(true, "js", file -> { + try{ + mods.getScripts().runConsole(file.readString()); + }catch(Exception e){ + Log.err(e); + } + })).size(s).padLeft(4f); + + button(Icon.cancel, Styles.cleari, () -> shown = false).size(s).padLeft(4f); + + }else{ + add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); + } } protected void rect(float x, float y, float w, float h){ @@ -189,25 +221,18 @@ public class ConsoleFragment extends Table{ "\n"; } + public void toggleMobile(){ + shown = !shown; + open = false; //never true on mobile + } + public void toggle(){ if(!open){ Events.fire(Trigger.openConsole); scene.setKeyboardFocus(chatfield); open = !open; - if(mobile){ - TextInput input = new TextInput(); - input.accepted = text -> { - chatfield.setText(text); - sendMessage(); - hide(); - Core.input.setOnscreenKeyboardVisible(false); - }; - input.canceled = this::hide; - Core.input.getTextInput(input); - }else{ - chatfield.fireClick(); - } + chatfield.fireClick(); }else{ scene.setKeyboardFocus(null); open = !open; diff --git a/core/src/mindustry/ui/fragments/HintsFragment.java b/core/src/mindustry/ui/fragments/HintsFragment.java index 62110d9a09..1fe9763bb2 100644 --- a/core/src/mindustry/ui/fragments/HintsFragment.java +++ b/core/src/mindustry/ui/fragments/HintsFragment.java @@ -252,11 +252,6 @@ public class HintsFragment{ () -> indexer.getFlagged(state.rules.defaultTeam, BlockFlag.extinguisher).size > 0 ), - generator( - () -> control.input.block == Blocks.combustionGenerator, - () -> ui.hints.placedBlocks.contains(Blocks.combustionGenerator) - ), - rebuildSelect( () -> state.rules.defaultTeam.data().plans.size >= 10, () -> control.input.isRebuildSelecting() diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 9881c6f648..ecb7234bef 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -51,6 +51,7 @@ public class HudFragment{ private Table lastUnlockTable; private Table lastUnlockLayout; private long lastToast; + private float pauseDisableDur; private Seq blocksOut = new Seq<>(); private Table hudLabel; @@ -128,7 +129,7 @@ public class HudFragment{ } saveFavorites(); } - + private void rebuildBlockSelection(Table blockSelection, String searchText){ blockSelection.clear(); @@ -213,7 +214,7 @@ public class HudFragment{ }else{ favIcon.setScale(0.7f); } - + Table overlay = new Table().align(Align.topRight); overlay.touchable = Touchable.disabled; overlay.add(favIcon).size(2f).pad(12f); @@ -282,11 +283,28 @@ public class HudFragment{ //paused table parent.fill(t -> { + float sidePad = dsize * 5 + 4f; t.name = "paused"; - t.top().visible(() -> state.isPaused() && shown && !netServer.isWaitingForPlayers()).touchable = Touchable.disabled; - t.table(Styles.black6, top -> top.label(() -> state.gameOver && state.isCampaign() ? "@sector.curlost" : "@paused") - .style(Styles.outlineLabel).pad(8f)).height(pauseHeight).growX(); - //.padLeft(dsize * 5 + 4f) to prevent alpha overlap on left + t.top().visible(() -> state.isPaused() && shown && !netServer.isWaitingForPlayers() && !(mobile && Core.graphics.isPortrait())).touchable = Touchable.disabled; + t.table(Styles.black6, top -> { + top.label(() -> state.gameOver && state.isCampaign() ? "@sector.curlost" : "@paused") + .style(Styles.outlineLabel).pad(8f); + top.spacerX(() -> sidePad + Core.scene.marginLeft - Core.scene.marginRight); + }).height(pauseHeight).growX() + .padLeft(sidePad); + }); + + //pause disabled table + parent.fill(t -> { + t.name = "pause-disabled"; + t.top().visible(() -> pauseDisableDur > 0f && shown && !mobile && !netServer.isWaitingForPlayers() && !state.isPaused() && !(state.gameOver && state.isCampaign())).touchable = Touchable.disabled; + t.update(() -> { + t.color.a = t.color.a > 0f && pauseDisableDur > 0f ? t.color.a - Time.delta / pauseDisableDur : 1f; + if(t.color.a <= 0f){ + pauseDisableDur = 0f; + } + }); + t.table(Styles.black6, top -> top.label(() -> "@pause.disabled").style(Styles.outlineLabel).pad(8f)).height(pauseHeight).growX(); }); //left/right gutter areas @@ -295,6 +313,7 @@ public class HudFragment{ y = 0f; w = Core.graphics.getWidth(); h = Core.graphics.getHeight(); + Draw.color(); if(Core.scene.marginLeft > 0){ paneRight.draw(x, y, Core.scene.marginLeft, h); } @@ -340,19 +359,43 @@ public class HudFragment{ //for better inset visuals cont.rect((x, y, w, h) -> { if(Core.scene.marginTop > 0){ + Draw.color(); Tex.paneRight.draw(x, y, w, Core.scene.marginTop); } }).fillX().row(); + //paused in portrait mode + cont.label(() -> state.gameOver && state.isCampaign() ? "@sector.curlost" : "@paused") + .style(Styles.outlineLabel) + .labelAlign(Align.center) + .visible(() -> state.isPaused() && shown && !netServer.isWaitingForPlayers() && Core.graphics.isPortrait()) + .touchable(Touchable.disabled).height(20f).padTop(-40f).fillX(); + + cont.row(); + cont.table(select -> { select.name = "mobile buttons"; select.left(); select.defaults().size(dsize).left(); + select.background(Styles.black6); - ImageButtonStyle style = Styles.cleari; + ImageButtonStyle style = Styles.clearNonei; select.button(Icon.menu, style, ui.paused::show).name("menu"); - flip = select.button(Icon.upOpen, style, this::toggleMenus).get(); + flip = select.button(Icon.upOpen, style, () -> { + if(Core.settings.getBool("console")){ + ui.consolefrag.toggleMobile(); + }else{ + toggleMenus(); + } + }).update(i -> { + if(Core.settings.getBool("console")){ + i.getStyle().imageUp = Icon.terminal; + shown = true; //force shown when console is enabled, because there is no other way to show/hide + }else{ + i.getStyle().imageUp = shown ? Icon.downOpen : Icon.upOpen; + } + }).get(); flip.name = "flip"; select.button(Icon.paste, style, ui.schematics::show) @@ -361,14 +404,15 @@ public class HudFragment{ select.button(Icon.pause, style, () -> { if(net.active()){ ui.listfrag.toggle(); - }else{ + }else if(!state.rules.pauseDisabled){ state.set(state.isPaused() ? State.playing : State.paused); } }).name("pause").update(i -> { if(net.active()){ + i.setDisabled(false); i.getStyle().imageUp = Icon.players; }else{ - i.setDisabled(false); + i.setDisabled(state.rules.pauseDisabled || (state.isCampaign() && state.afterGameOver)); i.getStyle().imageUp = state.isPaused() ? Icon.play : Icon.pause; } }); @@ -432,7 +476,7 @@ public class HudFragment{ @Override public float getPrefHeight(){ - return Scl.scl(120f); + return Scl.scl(123f); } }).name("waves/editor"); @@ -470,7 +514,6 @@ public class HudFragment{ editorMain.table(Tex.buttonEdge4, t -> { t.name = "teams"; - t.top().table(teams -> { teams.left(); for(Team team : Team.baseTeams){ @@ -541,7 +584,7 @@ public class HudFragment{ t.name = "coreinfo"; - t.collapser(v -> v.add().height(pauseHeight), () -> state.isPaused() && !netServer.isWaitingForPlayers()).row(); + t.collapser(v -> v.add().height(pauseHeight), () -> !netServer.isWaitingForPlayers() && (state.isPaused() || pauseDisableDur > 0f)).row(); t.table(c -> { //core items @@ -722,6 +765,10 @@ public class HudFragment{ }); } + public void showPauseDisabled(){ + pauseDisableDur = 60f; + } + /** Show unlock notification for a new recipe. */ public void showUnlock(UnlockableContent content){ //some content may not have icons... yet @@ -813,10 +860,6 @@ public class HudFragment{ } private void toggleMenus(){ - if(flip != null){ - flip.getStyle().imageUp = shown ? Icon.downOpen : Icon.upOpen; - } - shown = !shown; } @@ -1003,7 +1046,7 @@ public class HudFragment{ String text = obj.text(); if(text != null && !text.isEmpty()){ if(!first) builder.append("\n[white]"); - builder.append(text); + builder.append(UI.formatIcons(text)); first = false; } @@ -1122,7 +1165,7 @@ public class HudFragment{ if(applied != null){ for(StatusEffect effect : content.statusEffects()){ if(applied.get(effect.id) && !effect.isHidden()){ - t.image(effect.uiIcon).size(iconMed).get() + t.image(effect.uiIcon).scaling(Scaling.fit).size(iconMed).get() .addListener(new Tooltip(l -> l.label(() -> player.dead() ? "" : effect.localizedName + " [lightgray]" + UI.formatTime(player.unit().getDuration(effect))).style(Styles.outlineLabel))); } diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index f725053265..e95befc475 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -62,7 +62,7 @@ public class MenuFragment{ parent.fill(c -> c.bottom().right().button(Icon.discord, new ImageButtonStyle(){{ up = discordBanner; - }}, ui.discord::show).marginTop(9f).marginLeft(10f).tooltip("@discord").size(84, 45).name("discord")); + }}, ui.discord::show).visible(() -> !ui.consolefrag.shown()).marginTop(9f).marginLeft(10f).tooltip("@discord").size(84, 45).name("discord")); //info icon if(mobile){ @@ -85,11 +85,16 @@ public class MenuFragment{ } }); - parent.fill(c -> c.bottom().left().button("", new TextButtonStyle(){{ - font = Fonts.def; - fontColor = Color.white; - up = infoBanner; - }}, ui.about::show).size(84, 45).name("info")); + parent.fill(c -> { + c.bottom().left(); + c.button(Icon.terminal, () -> ui.consolefrag.toggleMobile()).visible(() -> !ui.consolefrag.shown() && Core.settings.getBool("console")).pad(4f).size(60f).left().row(); + + c.button("", new TextButtonStyle(){{ + font = Fonts.def; + fontColor = Color.white; + up = infoBanner; + }}, ui.about::show).size(84, 45).visible(() -> !ui.consolefrag.shown()).name("info"); + }); }else if(becontrol.active()){ parent.fill(c -> c.bottom().right().button("@be.check", Icon.refresh, () -> { ui.loadfrag.show(); diff --git a/core/src/mindustry/ui/fragments/MinimapFragment.java b/core/src/mindustry/ui/fragments/MinimapFragment.java index d595b9beae..6756e878d1 100644 --- a/core/src/mindustry/ui/fragments/MinimapFragment.java +++ b/core/src/mindustry/ui/fragments/MinimapFragment.java @@ -8,12 +8,16 @@ import arc.math.*; import arc.math.geom.*; import arc.scene.*; import arc.scene.event.*; +import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.util.*; +import mindustry.*; +import mindustry.core.*; import mindustry.gen.*; import mindustry.input.*; import mindustry.ui.*; +import static arc.Core.*; import static mindustry.Vars.*; public class MinimapFragment{ @@ -56,7 +60,7 @@ public class MinimapFragment{ elem.visible(() -> shown); elem.update(() -> { - if(!ui.chatfrag.shown()){ + if(!ui.chatfrag.shown() && !(scene.getKeyboardFocus() instanceof TextField)){ elem.requestKeyboard(); elem.requestScroll(); } @@ -98,6 +102,15 @@ public class MinimapFragment{ } } + @Override + public void tap(InputEvent event, float x, float y, int count, KeyCode button){ + super.tap(event, x, y, count, button); + if(mobile && count == 2){ + Vec2 pos = convert(x, y); + Call.pingLocation(Vars.player, pos.x, pos.y, null); + } + } + @Override public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){ lastZoom = zoom; @@ -111,6 +124,19 @@ public class MinimapFragment{ zoom = Mathf.clamp(zoom - amountY / 10f * zoom, 0.25f, 10f); return true; } + + @Override + public boolean keyDown(InputEvent event, KeyCode keycode){ + if(keycode == Binding.ping.value.key){ + Vec2 pos = convert(event.stageX, event.stageY).cpy(); + if(input.ctrl()){ + ui.showTextInput("", "@ping.text", Vars.maxPingTextLength, "", result -> Call.pingLocation(Vars.player, pos.x, pos.y, UI.formatIcons(result))); + }else{ + Call.pingLocation(Vars.player, pos.x, pos.y, null); + } + } + return super.keyDown(event, keycode); + } }); parent.fill(t -> { @@ -127,9 +153,12 @@ public class MinimapFragment{ } public void panTo(float relativeX, float relativeY){ + control.input.panCamera(convert(relativeX, relativeY).clamp(-tilesize/2f, -tilesize/2f, world.unitWidth() + tilesize/2f, world.unitHeight() + tilesize/2f)); + } + + public Vec2 convert(float relativeX, float relativeY){ Rect r = getRectBounds(); - Tmp.v1.set(relativeX, relativeY).sub(r.x, r.y).scl(1f / r.width, 1f / r.height).scl(world.unitWidth(), world.unitHeight()); - control.input.panCamera(Tmp.v1.clamp(-tilesize/2f, -tilesize/2f, world.unitWidth() + tilesize/2f, world.unitHeight() + tilesize/2f)); + return Tmp.v1.set(relativeX, relativeY).sub(r.x - scene.marginLeft, r.y - scene.marginBottom).scl(1f / r.width, 1f / r.height).scl(world.unitWidth(), world.unitHeight()).sub(tilesize/2f, tilesize/2f); } public boolean shown(){ diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 2050811b53..d379e40472 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -126,6 +126,7 @@ public class PlacementFragment{ toggler.remove(); build(group); toggler.setZIndex(index); + lastDisplayState = null; } boolean updatePick(InputHandler input){ diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index b7739913f1..6d44f33d32 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -24,6 +24,7 @@ import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.graphics.MultiPacker.*; +import mindustry.input.InputHandler.*; import mindustry.logic.*; import mindustry.mod.*; import mindustry.type.*; @@ -510,9 +511,12 @@ public class Block extends UnlockableContent implements Senseable{ } public float drawPlaceText(String text, int x, int y, boolean valid){ + return drawPlaceText(text, x, y, valid ? Pal.accent : Pal.remove, true); + } + + public float drawPlaceText(String text, int x, int y, Color color, boolean drawLine){ if(renderer.pixelate) return 0; - Color color = valid ? Pal.accent : Pal.remove; Font font = Fonts.outline; GlyphLayout layout = Pools.obtain(GlyphLayout.class, GlyphLayout::new); boolean ints = font.usesIntegerPositions(); @@ -526,10 +530,12 @@ public class Block extends UnlockableContent implements Senseable{ float dx = x * tilesize + offset, dy = y * tilesize + offset + size * tilesize / 2f + 3; font.draw(text, dx, dy + layout.height + 1, Align.center); dy -= 1f; - Lines.stroke(2f, Color.darkGray); - Lines.line(dx - layout.width / 2f - 2f, dy, dx + layout.width / 2f + 1.5f, dy); - Lines.stroke(1f, color); - Lines.line(dx - layout.width / 2f - 2f, dy, dx + layout.width / 2f + 1.5f, dy); + if(drawLine){ + Lines.stroke(2f, Color.darkGray); + Lines.line(dx - layout.width / 2f - 2f, dy, dx + layout.width / 2f + 1.5f, dy); + Lines.stroke(1f, color); + Lines.line(dx - layout.width / 2f - 2f, dy, dx + layout.width / 2f + 1.5f, dy); + } font.setUseIntegerPositions(ints); font.setColor(Color.white); @@ -553,7 +559,7 @@ public class Block extends UnlockableContent implements Senseable{ Tile tile = world.tile(x, y); if(tile == null) return 0; return tile.getLinkedTilesAs(this, tempTiles) - .sumf(other -> !floating && other.floor().isDeep() ? 0 : other.floor().attributes.get(attr)); + .sumf(other -> !floating && !placeableLiquid && other.floor().isDeep() ? 0 : other.floor().attributes.get(attr)); } public TextureRegion getDisplayIcon(Tile tile){ @@ -811,6 +817,16 @@ public class Block extends UnlockableContent implements Senseable{ Draw.reset(); } + public void drawOtherPlayerPlan(BuildPlan plan, Eachable list, float alpha){ + Draw.mixcol(Color.white, Mathf.absin(Time.globalTime, 6f, 0.15f)); + Draw.alpha(alpha); + float prevScale = Draw.scl; + Draw.scl *= plan.animScale; + drawPlanRegion(plan, list); + Draw.scl = prevScale; + Draw.reset(); + } + public void drawPlanRegion(BuildPlan plan, Eachable list){ drawDefaultPlanRegion(plan, list); } @@ -818,17 +834,29 @@ public class Block extends UnlockableContent implements Senseable{ /** this is a different method so subclasses can call it even after overriding the base */ public void drawDefaultPlanRegion(BuildPlan plan, Eachable list){ TextureRegion reg = getPlanRegion(plan, list); + float a = Draw.getColorAlpha(); Draw.rect(reg, plan.drawx(), plan.drawy(), !rotate || !rotateDraw ? 0 : plan.rotation * 90); if(plan.worldContext && player != null && teamRegion != null && teamRegion.found()){ - if(teamRegions[player.team().id] == teamRegion) Draw.color(player.team().color); + if(teamRegions[player.team().id] == teamRegion) Draw.color(player.team().color, a); Draw.rect(teamRegions[player.team().id], plan.drawx(), plan.drawy()); - Draw.color(); + Draw.color(1f, 1f, 1f, a); } drawPlanConfig(plan, list); } + public static BuildPlan findPlan(Eachable list, int x, int y, Boolf predicate){ + return findPlan(list, x, y, 1, predicate); + } + + public static BuildPlan findPlan(Eachable list, int x, int y, int size, Boolf predicate){ + if(list instanceof QueryEachable q){ + return q.find(x, y, size, predicate); + } + return null; + } + public TextureRegion getPlanRegion(BuildPlan plan, Eachable list){ return fullIcon; } @@ -847,7 +875,7 @@ public class Block extends UnlockableContent implements Senseable{ Color color = content instanceof Item i ? i.color : content instanceof Liquid l ? l.color : null; if(color == null) return; - Draw.color(color); + Draw.color(color, Draw.getColorAlpha()); Draw.rect(region, plan.drawx(), plan.drawy()); Draw.color(); } @@ -860,6 +888,10 @@ public class Block extends UnlockableContent implements Senseable{ } + public float planConfigClipSize(){ + return clipSize; + } + /** Transforms the internal position of this config using the specified function, and return the result. */ public Object pointConfig(Object config, Cons transformer){ return config; diff --git a/core/src/mindustry/world/blocks/Attributes.java b/core/src/mindustry/world/blocks/Attributes.java index e1e73a1ab9..b4e91b3a91 100644 --- a/core/src/mindustry/world/blocks/Attributes.java +++ b/core/src/mindustry/world/blocks/Attributes.java @@ -64,4 +64,20 @@ public class Attributes implements JsonSerializable{ System.arraycopy(last, 0, arr, 0, Math.min(last.length, arr.length)); } } + + @Override + public String toString(){ + StringBuilder res = new StringBuilder(); + res.append("Attributes{"); + boolean any = false; + for(int i = 0; i < arr.length; i++){ + if(arr[i] != 0){ + res.append(Attribute.all[i]).append(": ").append(arr[i]).append(", "); + any = true; + } + } + if(any) res.setLength(res.length() - 2); + res.append("}"); + return res.toString(); + } } diff --git a/core/src/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java index 4cefac1434..43a9413ef8 100644 --- a/core/src/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -1,5 +1,6 @@ package mindustry.world.blocks; +import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; @@ -18,6 +19,23 @@ public interface Autotiler{ class AutotilerHolder{ static final int[] blendresult = new int[5]; static final BuildPlan[] directionals = new BuildPlan[4]; + + static BuildPlan plan; + static final Boolf blendFinder = other -> { + if(other.breaking || other == plan) return false; + + int i = 0; + for(Point2 point : Geometry.d4){ + int x = plan.x + point.x, y = plan.y + point.y; + if(x >= other.x -(other.block.size - 1) / 2 && x <= other.x + (other.block.size / 2) && y >= other.y -(other.block.size - 1) / 2 && y <= other.y + (other.block.size / 2)){ + directionals[i] = other; + } + i++; + } + + //this technically doesn't "find" anything, since it needs to scan up to 4 conveyors in every direction. + return false; + }; } /** @@ -56,26 +74,15 @@ public interface Autotiler{ return region; } - default @Nullable int[] getTiling(BuildPlan req, Eachable list){ - if(req.tile() == null) return null; + default @Nullable int[] getTiling(BuildPlan plan, Eachable list){ + if(plan.tile() == null) return null; BuildPlan[] directionals = AutotilerHolder.directionals; Arrays.fill(directionals, null); - //TODO this is O(n^2), very slow, should use quadtree or intmap or something instead - list.each(other -> { - if(other.breaking || other == req) return; + AutotilerHolder.plan = plan; + Block.findPlan(list, plan.x, plan.y, plan.block.size + 2, AutotilerHolder.blendFinder); - int i = 0; - for(Point2 point : Geometry.d4){ - int x = req.x + point.x, y = req.y + point.y; - if(x >= other.x -(other.block.size - 1) / 2 && x <= other.x + (other.block.size / 2) && y >= other.y -(other.block.size - 1) / 2 && y <= other.y + (other.block.size / 2)){ - directionals[i] = other; - } - i++; - } - }); - - return buildBlending(req.tile(), req.rotation, directionals, req.worldContext); + return buildBlending(plan.tile(), plan.rotation, directionals, plan.worldContext); } /** diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 2844a09939..974ebaaad4 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -351,9 +351,7 @@ public class Turret extends ReloadTurret{ @Override public boolean shouldConsume(){ - //when the block is first placed, it shouldn't consume power/liquid just to "cool down" from the initial reload - //thus, it should only consume once it has actually shot at something - return isShooting() || (reloadCounter < reload && totalShots > 0); + return isShooting() || reloadCounter < reload; } @Override diff --git a/core/src/mindustry/world/blocks/distribution/DirectionBridge.java b/core/src/mindustry/world/blocks/distribution/DirectionBridge.java index 89091e8faf..992669cd26 100644 --- a/core/src/mindustry/world/blocks/distribution/DirectionBridge.java +++ b/core/src/mindustry/world/blocks/distribution/DirectionBridge.java @@ -1,5 +1,6 @@ package mindustry.world.blocks.distribution; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -19,7 +20,6 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class DirectionBridge extends Block{ - private static BuildPlan otherReq; private int otherDst = 0; public @Load("@-bridge") TextureRegion bridgeRegion; @@ -56,23 +56,27 @@ public class DirectionBridge extends Block{ Draw.rect(dirRegion, plan.drawx(), plan.drawy(), plan.rotation * 90); } + private static BuildPlan currentPlan, otherPlan; + private Boolf planFinder = other -> { + if(other.block == this && currentPlan != other && Mathf.clamp(other.x - currentPlan.x, -1, 1) == Geometry.d4x(currentPlan.rotation) && Mathf.clamp(other.y - currentPlan.y, -1, 1) == Geometry.d4y(currentPlan.rotation)){ + int dst = Math.max(Math.abs(other.x - currentPlan.x), Math.abs(other.y - currentPlan.y)); + if(dst <= otherDst){ + otherPlan = other; + otherDst = dst; + } + } + return false; + }; + @Override public void drawPlanConfigTop(BuildPlan plan, Eachable list){ - otherReq = null; otherDst = range; - Point2 d = Geometry.d4(plan.rotation); - list.each(other -> { - if(other.block == this && plan != other && Mathf.clamp(other.x - plan.x, -1, 1) == d.x && Mathf.clamp(other.y - plan.y, -1, 1) == d.y){ - int dst = Math.max(Math.abs(other.x - plan.x), Math.abs(other.y - plan.y)); - if(dst <= otherDst){ - otherReq = other; - otherDst = dst; - } - } - }); + otherPlan = null; + currentPlan = plan; + findPlan(list, plan.x, plan.y, range * 2 + 1, planFinder); - if(otherReq != null){ - drawBridge(plan.rotation, plan.drawx(), plan.drawy(), otherReq.drawx(), otherReq.drawy(), null); + if(otherPlan != null){ + drawBridge(plan.rotation, plan.drawx(), plan.drawy(), otherPlan.drawx(), otherPlan.drawy(), null); } } diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index cc963cf50e..5141e14109 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -1,5 +1,6 @@ package mindustry.world.blocks.distribution; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -21,8 +22,6 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class ItemBridge extends Block{ - private static BuildPlan otherReq; - public final int timerCheckMoved = timers ++; public int range; @@ -75,17 +74,21 @@ public class ItemBridge extends Block{ } } + private static int currentFindX, currentFindY; + private static BuildPlan currentPlan; + private static final Boolf planFinder = other -> other.block == currentPlan.block && currentPlan != other && currentFindX == other.x && currentFindY == other.y; + @Override public void drawPlanConfigTop(BuildPlan plan, Eachable list){ - otherReq = null; - list.each(other -> { - if(other.block == this && plan != other && plan.config instanceof Point2 p && p.equals(other.x - plan.x, other.y - plan.y)){ - otherReq = other; - } - }); + if(plan.config instanceof Point2 p && (Math.abs(p.x) <= range && Math.abs(p.y) <= range && (p.x == 0 || p.y == 0))){ + currentFindX = plan.x + p.x; + currentFindY = plan.y + p.y; + currentPlan = plan; + var otherReq = findPlan(list, currentFindX, currentFindY, planFinder); - if(otherReq != null){ - drawBridge(plan, otherReq.drawx(), otherReq.drawy(), 0); + if(otherReq != null){ + drawBridge(plan, otherReq.drawx(), otherReq.drawy(), 0); + } } } diff --git a/core/src/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java index 3951754487..a2c598c844 100644 --- a/core/src/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -107,11 +107,13 @@ public class Conduit extends LiquidBlock implements Autotiler{ if(bits == null) return; + float pa = Draw.getColorAlpha(); + Draw.scl(bits[1], bits[2]); - Draw.color(botColor); - Draw.alpha(0.5f); + Draw.color(botColor, pa * botColor.a); + Draw.alpha(0.5f * pa); Draw.rect(botRegions[bits[0]], plan.drawx(), plan.drawy(), plan.rotation * 90); - Draw.color(); + Draw.color(Color.white, pa); Draw.rect(topRegions[bits[0]], plan.drawx(), plan.drawy(), plan.rotation * 90); Draw.scl(); } diff --git a/core/src/mindustry/world/blocks/logic/CanvasBlock.java b/core/src/mindustry/world/blocks/logic/CanvasBlock.java index f6535c07ef..54470c6b24 100644 --- a/core/src/mindustry/world/blocks/logic/CanvasBlock.java +++ b/core/src/mindustry/world/blocks/logic/CanvasBlock.java @@ -1,14 +1,9 @@ package mindustry.world.blocks.logic; -import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; -import arc.input.*; import arc.math.*; import arc.math.geom.*; -import arc.scene.*; -import arc.scene.event.*; -import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; @@ -16,9 +11,9 @@ import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; import mindustry.gen.*; -import mindustry.graphics.*; import mindustry.logic.*; import mindustry.ui.*; +import mindustry.ui.dialogs.*; import mindustry.world.*; import static mindustry.Vars.*; @@ -52,11 +47,18 @@ public class CanvasBlock extends Block{ if(build.data.length == bytes.length){ System.arraycopy(bytes, 0, build.data, 0, bytes.length); build.invalidated = true; - build.updateTexture(); } }); } + public void setPaletteFromString(String value){ + String[] split = value.split("\n"); + palette = new int[split.length]; + for(int i = 0; i < split.length; i++){ + palette[i] = (Integer.parseInt(split[i], 16) << 8) | 0xff; + } + } + @Override public void init(){ super.init(); @@ -85,8 +87,7 @@ public class CanvasBlock extends Block{ tempBlend = 0; - //O(N^2), awful - list.each(other -> { + findPlan(list, plan.x, plan.y, size + 1, other -> { if(other.block == this){ for(int i = 0; i < 4; i++){ if(other.x == plan.x + Geometry.d4x(i) * size && other.y == plan.y + Geometry.d4y(i) * size){ @@ -94,6 +95,7 @@ public class CanvasBlock extends Block{ } } } + return false; }); int blending = tempBlend; @@ -159,13 +161,6 @@ public class CanvasBlock extends Block{ } } - public void setPixel(int x, int y, int index){ - if(x >= 0 && y >= 0 && x < canvasSize && y < canvasSize && index >= 0 && index < palette.length){ - setByte(data, (y * canvasSize + x) * bitsPerPixel, index); - invalidated = true; - } - } - public double getPixel(int pos){ if(pos >= 0 && pos < canvasSize * canvasSize){ return getByte(data, pos * bitsPerPixel); @@ -173,13 +168,6 @@ public class CanvasBlock extends Block{ return Double.NaN; } - public int getPixel(int x, int y){ - if(x >= 0 && y >= 0 && x < canvasSize && y < canvasSize){ - return getByte(data, (y * canvasSize + x) * bitsPerPixel); - } - return 0; - } - public void updateTexture(){ if(headless || (texture != null && !invalidated)) return; @@ -307,163 +295,7 @@ public class CanvasBlock extends Block{ @Override public void buildConfiguration(Table table){ - table.button(Icon.pencil, Styles.cleari, () -> { - Dialog dialog = new Dialog(); - - Pixmap pix = makePixmap(data, new Pixmap(canvasSize, canvasSize)); - Texture texture = new Texture(pix); - int[] curColor = {palette[0]}; - boolean[] modified = {false}; - boolean[] fill = {false}; - - dialog.hidden(() -> { - texture.dispose(); - pix.dispose(); - }); - - dialog.resized(dialog::hide); - - dialog.cont.table(Tex.pane, body -> { - body.add(new Element(){ - int lastX, lastY; - IntSeq stack = new IntSeq(); - - int convertX(float ex){ - return (int)((ex) / (width / canvasSize)); - } - - int convertY(float ey){ - return pix.height - 1 - (int)((ey) / (height / canvasSize)); - } - - { - addListener(new InputListener(){ - - @Override - public boolean touchDown(InputEvent event, float ex, float ey, int pointer, KeyCode button){ - int cx = convertX(ex), cy = convertY(ey); - if(fill[0]){ - stack.clear(); - int src = curColor[0]; - int dst = pix.get(cx, cy); - if(src != dst){ - stack.add(Point2.pack(cx, cy)); - while(!stack.isEmpty()){ - int current = stack.pop(); - int x = Point2.x(current), y = Point2.y(current); - draw(x, y); - for(int i = 0; i < 4; i++){ - int nx = x + Geometry.d4x(i), ny = y + Geometry.d4y(i); - if(nx >= 0 && ny >= 0 && nx < pix.width && ny < pix.height && pix.getRaw(nx, ny) == dst){ - stack.add(Point2.pack(nx, ny)); - } - } - } - } - - }else{ - draw(cx, cy); - lastX = cx; - lastY = cy; - } - return true; - } - - @Override - public void touchDragged(InputEvent event, float ex, float ey, int pointer){ - if(fill[0]) return; - int cx = convertX(ex), cy = convertY(ey); - Bresenham2.line(lastX, lastY, cx, cy, (x, y) -> draw(x, y)); - lastX = cx; - lastY = cy; - } - }); - } - - void draw(int x, int y){ - if(pix.get(x, y) != curColor[0]){ - pix.set(x, y, curColor[0]); - Pixmaps.drawPixel(texture, x, y, curColor[0]); - modified[0] = true; - } - } - - @Override - public void draw(){ - Tmp.tr1.set(texture); - Draw.alpha(parentAlpha); - Draw.rect(Tmp.tr1, x + width/2f, y + height/2f, width, height); - - //draw grid - { - float xspace = (getWidth() / canvasSize); - float yspace = (getHeight() / canvasSize); - float s = 1f; - - int minspace = 10; - - int jumpx = (int)(Math.max(minspace, xspace) / xspace); - int jumpy = (int)(Math.max(minspace, yspace) / yspace); - - for(int x = 0; x <= canvasSize; x += jumpx){ - Fill.crect((int)(this.x + xspace * x - s), y - s, 2, getHeight() + (x == canvasSize ? 1 : 0)); - } - - for(int y = 0; y <= canvasSize; y += jumpy){ - Fill.crect(x - s, (int)(this.y + y * yspace - s), getWidth(), 2); - } - } - - if(!mobile){ - Vec2 s = screenToLocalCoordinates(Core.input.mouse()); - if(s.x >= 0 && s.y >= 0 && s.x < width && s.y < height){ - float sx = Mathf.round(s.x, width / canvasSize), sy = Mathf.round(s.y, height / canvasSize); - - Lines.stroke(Scl.scl(6f)); - Draw.color(Pal.accent); - Lines.rect(sx + x, sy + y, width / canvasSize, height / canvasSize, Lines.getStroke() - 1f); - - Draw.reset(); - } - } - } - }).size(mobile && !Core.graphics.isPortrait() ? Math.min(290f, Core.graphics.getHeight() / Scl.scl(1f) - 75f / Scl.scl(1f)) : 480f); - }).colspan(3); - - dialog.cont.row(); - - dialog.cont.add().size(60f); - - dialog.cont.table(Tex.button, p -> { - for(int i = 0; i < palette.length; i++){ - int fi = i; - - var button = p.button(Tex.whiteui, Styles.squareTogglei, 30, () -> { - curColor[0] = palette[fi]; - }).size(44).checked(b -> curColor[0] == palette[fi]).get(); - button.getStyle().imageUpColor = new Color(palette[i]); - } - }); - - dialog.cont.table(Tex.button, t -> { - t.button(Icon.fill, Styles.clearNoneTogglei, () -> { - fill[0] = !fill[0]; - }).size(44f); - }); - - dialog.closeOnBack(); - - dialog.buttons.defaults().size(150f, 64f); - dialog.buttons.button("@cancel", Icon.cancel, dialog::hide); - dialog.buttons.button("@ok", Icon.ok, () -> { - if(modified[0]){ - configure(packPixmap(pix)); - } - dialog.hide(); - }); - - dialog.show(); - }).size(40f); + table.button(Icon.pencil, Styles.cleari, () -> new CanvasEditDialog(this).show()).size(40f); } @Override diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index 0f6e713350..5ae3fa965f 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -20,6 +20,7 @@ import mindustry.graphics.*; import mindustry.io.*; import mindustry.io.TypeIO.*; import mindustry.logic.*; +import mindustry.logic.LExecutor.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.ConstructBlock.*; @@ -36,6 +37,8 @@ public class LogicBlock extends Block{ public static final int maxNameLength = 32; private static final IntSet usedBuildings = new IntSet(); + private static final IntSeq waitIndices = new IntSeq(); + private static final FloatSeq waitValues = new FloatSeq(); public int maxInstructionScale = 5; public int instructionsPerTick = 1; @@ -82,17 +85,16 @@ public class LogicBlock extends Block{ if(!entity.validLink(world.build(pos))) return; var lbuild = world.build(pos); int x = lbuild.tileX(), y = lbuild.tileY(); + int oldSize = entity.links.size; - LogicLink link = entity.links.find(l -> l.x == x && l.y == y); + entity.links.removeAll(l -> world.build(l.x, l.y) == lbuild); - if(link != null){ - entity.links.remove(link); - //disable when unlinking + if(oldSize > entity.links.size){ //check whether any were removed + //re-enable the target when unlinking if(lbuild.block.autoResetEnabled && lbuild.lastDisabler == entity){ lbuild.enabled = true; } }else{ - entity.links.remove(l -> world.build(l.x, l.y) == lbuild); entity.links.add(new LogicLink(x, y, entity.findLinkName(lbuild.block), true)); } @@ -700,7 +702,7 @@ public class LogicBlock extends Block{ @Override public byte version(){ - return 3; + return 4; } @Override @@ -746,6 +748,23 @@ public class LogicBlock extends Block{ TypeIO.writeString(write, tag); write.s(iconTag); + + waitIndices.clear(); + waitValues.clear(); + for(int i = 0; i < executor.instructions.length; i ++){ + if(executor.instructions[i] instanceof WaitI wait){ + waitValues.add(wait.curTime); + waitIndices.add(i); + } + } + + write.s(waitIndices.size); + for(int i = 0; i < waitIndices.size; i++){ + write.s(waitIndices.get(i)); + write.f(waitValues.get(i)); + } + + write.f(accumulator); } @Override @@ -784,6 +803,31 @@ public class LogicBlock extends Block{ //skip memory, it isn't used anymore read.skip(memory * 8); + if(privileged && revision >= 2){ + ipt = Mathf.clamp(read.s(), 1, maxInstructionsPerTick); + } + + if(revision >= 3){ + tag = TypeIO.readString(read); + iconTag = (char)read.us(); + } + + IntSeq waitIndices = new IntSeq(); + FloatSeq waitValues = new FloatSeq(); + + //read wait times into list for processing once the asm is loaded + if(revision >= 4){ + int waits = read.us(); + for(int i = 0; i < waits; i++){ + int index = read.us(); + float value = read.f(); + waitIndices.add(index); + waitValues.add(value); + } + + accumulator = read.f(); + } + loadBlock = () -> updateCode(code, false, asm -> { //load up the variables that were stored for(int i = 0; i < varcount; i++){ @@ -801,17 +845,16 @@ public class LogicBlock extends Block{ } } } + + //wait times can only be applied once the instructions are loaded and exist + for(int i = 0; i < waitIndices.size; i++){ + int waitIndex = waitIndices.get(i); + if(waitIndex >= 0 && waitIndex < asm.instructions.length && asm.instructions[waitIndex] instanceof WaitI wait){ + wait.curTime = waitValues.get(i); + } + } }); - if(privileged && revision >= 2){ - ipt = Mathf.clamp(read.s(), 1, maxInstructionsPerTick); - } - - if(revision >= 3){ - tag = TypeIO.readString(read); - iconTag = (char)read.us(); - } - } } } diff --git a/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java b/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java index 494be2ecc1..c9a0caa87f 100644 --- a/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/payloads/PayloadConveyor.java @@ -118,7 +118,10 @@ public class PayloadConveyor extends Block{ }else{ next = null; } + checkBlocked(); + } + void checkBlocked(){ int ntrns = 1 + size/2; Tile next = tile.nearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns); blocked = (next != null && next.solid() && !(next.block().outputsPayload || next.block().acceptsPayload)) || (this.next != null && this.next.payloadCheck(rotation)); @@ -156,6 +159,7 @@ public class PayloadConveyor extends Block{ boolean had = item != null; if(valid && stepAccepted != curStep && item != null){ + checkBlocked(); if(next != null){ //trigger update forward next.updateTile(); diff --git a/core/src/mindustry/world/blocks/power/LightBlock.java b/core/src/mindustry/world/blocks/power/LightBlock.java index 041399f5b7..a7b2a67b37 100644 --- a/core/src/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/mindustry/world/blocks/power/LightBlock.java @@ -95,7 +95,7 @@ public class LightBlock extends Block{ @Override public void draw(){ super.draw(); - Draw.color(Tmp.c1.set(color).a(0.4f)); + Draw.color(Tmp.c1.set(color).a(0.6f)); Draw.rect(topRegion, x, y); Draw.color(); } diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index a14cea2951..8c1b877637 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -23,7 +23,6 @@ import mindustry.world.modules.*; import static mindustry.Vars.*; public class PowerNode extends PowerBlock{ - protected static BuildPlan otherReq; protected static int returnInt = 0; protected final static ObjectSet graphs = new ObjectSet<>(); /** The maximum range of all power nodes on the map */ @@ -42,6 +41,7 @@ public class PowerNode extends PowerBlock{ public PowerNode(String name){ super(name); configurable = true; + ignoreResizeConfig = true; consumesPower = false; outputsPower = false; canOverdrive = false; @@ -179,11 +179,15 @@ public class PowerNode extends PowerBlock{ } public void drawLaser(float x1, float y1, float x2, float y2, int size1, int size2){ + drawLaser(x1, y1, x2, y2, size1, size2, true); + } + + public void drawLaser(float x1, float y1, float x2, float y2, int size1, int size2, boolean light){ float angle1 = Angles.angle(x1, y1, x2, y2), vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1), len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f; - Drawf.laser(laser, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, laserScale); + Drawf.laser(laser, laserEnd, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, laserScale, light); } protected boolean overlaps(float srcx, float srcy, Tile other, Block otherBlock, float range){ @@ -315,34 +319,36 @@ public class PowerNode extends PowerBlock{ }); } + private static int currentFindX, currentFindY; + private static BuildPlan currentPlan; + private static final Boolf planFinder = other -> other.block != null + && (currentFindX >= other.x - ((other.block.size - 1) / 2) && currentFindY >= other.y - ((other.block.size - 1) / 2) && currentFindX <= other.x + other.block.size / 2 && currentFindY <= other.y + other.block.size / 2) + && other != currentPlan && other.block.hasPower; + @Override public void drawPlanConfigTop(BuildPlan plan, Eachable list){ if(plan.config instanceof Point2[] ps){ setupColor(1f); for(Point2 point : ps){ - int px = plan.x + point.x, py = plan.y + point.y; - otherReq = null; - list.each(other -> { - if(other.block != null - && (px >= other.x - ((other.block.size-1)/2) && py >= other.y - ((other.block.size-1)/2) && px <= other.x + other.block.size/2 && py <= other.y + other.block.size/2) - && other != plan && other.block.hasPower){ - otherReq = other; - } - }); + currentFindX = plan.x + point.x; + currentFindY = plan.y + point.y; + currentPlan = plan; - //uncomment for debugging connection translation issues in schematics - //Draw.color(Color.red); - //Lines.line(plan.drawx(), plan.drawy(), px * tilesize, py * tilesize); - //Draw.color(); + var otherReq = findPlan(list, currentFindX, currentFindY, planFinder); if(otherReq == null || otherReq.block == null) continue; - drawLaser(plan.drawx(), plan.drawy(), otherReq.drawx(), otherReq.drawy(), size, otherReq.block.size); + drawLaser(plan.drawx(), plan.drawy(), otherReq.drawx(), otherReq.drawy(), size, otherReq.block.size, false); } Draw.color(); } } + @Override + public float planConfigClipSize(){ + return laserRange * tilesize * 2f + size * tilesize; + } + public boolean linkValid(Building tile, Building link){ return linkValid(tile, link, true); } diff --git a/core/src/mindustry/world/blocks/production/BeamDrill.java b/core/src/mindustry/world/blocks/production/BeamDrill.java index a142f890ea..c3e51ec146 100644 --- a/core/src/mindustry/world/blocks/production/BeamDrill.java +++ b/core/src/mindustry/world/blocks/production/BeamDrill.java @@ -248,7 +248,7 @@ public class BeamDrill extends Block{ float multiplier = Mathf.lerp(1f, optionalBoostIntensity, optionalEfficiency); float drillTime = getDrillTime(lastItem); boostWarmup = Mathf.lerpDelta(boostWarmup, optionalEfficiency, 0.1f); - lastDrillSpeed = (facingAmount * multiplier * timeScale) / drillTime; + lastDrillSpeed = (facingAmount * multiplier * timeScale) / drillTime * efficiency; time += edelta() * multiplier; diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 8c00eb03c4..cc123b120a 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -97,7 +97,7 @@ public class Drill extends Block{ } @Override - public void drawPlanConfigTop(BuildPlan plan, Eachable list){ + public void drawPlanConfig(BuildPlan plan, Eachable list){ if(!plan.worldContext) return; Tile tile = plan.tile(); if(tile == null) return; @@ -105,7 +105,7 @@ public class Drill extends Block{ countOre(tile); if(returnItem == null || !drawMineItem) return; - Draw.color(returnItem.color); + Draw.tint(returnItem.color); Draw.rect(itemRegion, plan.drawx(), plan.drawy()); Draw.color(); } diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 6efd4520d2..0fc1ef457b 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -135,6 +135,16 @@ public class GenericCrafter extends Block{ super.init(); } + @Override + public void afterPatch(){ + super.afterPatch(); + + outputsLiquid = outputLiquids != null; + + if(outputItems != null) hasItems = true; + if(outputLiquids != null) hasLiquids = true; + } + @Override public void drawPlanRegion(BuildPlan plan, Eachable list){ drawer.drawPlan(this, plan, list); diff --git a/core/src/mindustry/world/blocks/production/Incinerator.java b/core/src/mindustry/world/blocks/production/Incinerator.java index 198a420e7f..445c509654 100644 --- a/core/src/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/mindustry/world/blocks/production/Incinerator.java @@ -64,7 +64,7 @@ public class Incinerator extends Block{ @Override public boolean acceptItem(Building source, Item item){ - return heat > 0.5f; + return heat > 0.5f && enabled; } @Override @@ -76,7 +76,7 @@ public class Incinerator extends Block{ @Override public boolean acceptLiquid(Building source, Liquid liquid){ - return heat > 0.5f && liquid.incinerable; + return heat > 0.5f && liquid.incinerable && enabled; } } } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index ef917ff030..59617ef6b7 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -248,6 +248,12 @@ public class Reconstructor extends UnitBlock{ return upgrade != null && (team.isAI() || upgrade.unlockedNowHost()) && !upgrade.isBanned(); } + @Override + public BlockStatus status(){ + if(!team.activateUnitFactories()) return BlockStatus.inactive; + return super.status(); + } + @Override public int getMaximumAccepted(Item item){ return Mathf.round(capacities[item.id] * state.rules.unitCost(team)); @@ -352,7 +358,7 @@ public class Reconstructor extends UnitBlock{ @Override public boolean shouldConsume(){ - return constructing && enabled; + return constructing && enabled && team.activateUnitFactories(); } @Override diff --git a/core/src/mindustry/world/blocks/units/RepairTower.java b/core/src/mindustry/world/blocks/units/RepairTower.java index b935b2878d..b48ac4400d 100644 --- a/core/src/mindustry/world/blocks/units/RepairTower.java +++ b/core/src/mindustry/world/blocks/units/RepairTower.java @@ -29,6 +29,7 @@ public class RepairTower extends Block{ update = true; solid = true; suppressable = true; + flags = EnumSet.of(BlockFlag.repair); } @Override diff --git a/core/src/mindustry/world/blocks/units/UnitAssembler.java b/core/src/mindustry/world/blocks/units/UnitAssembler.java index ab6488e84b..c979953a40 100644 --- a/core/src/mindustry/world/blocks/units/UnitAssembler.java +++ b/core/src/mindustry/world/blocks/units/UnitAssembler.java @@ -98,8 +98,8 @@ public class UnitAssembler extends PayloadBlock{ //overlapping construction areas not allowed; grow by a tiny amount so edges can't overlap either. Rect rect = getRect(Tmp.r1, tile.worldx() + offset, tile.worldy() + offset, rotation).grow(0.1f); return - !indexer.getFlagged(team, BlockFlag.unitAssembler).contains(b -> getRect(Tmp.r2, b.x, b.y, b.rotation).overlaps(rect)) && - !team.data().getBuildings(ConstructBlock.get(size)).contains(b -> ((ConstructBuild)b).current instanceof UnitAssembler && getRect(Tmp.r2, b.x, b.y, b.rotation).overlaps(rect)); + !indexer.getFlagged(team, BlockFlag.unitAssembler).contains(b -> b.block instanceof UnitAssembler assembler && assembler.getRect(Tmp.r2, b.x, b.y, b.rotation).overlaps(rect)) && + !team.data().getBuildings(ConstructBlock.get(size)).contains(b -> ((ConstructBuild)b).current instanceof UnitAssembler assembler && assembler.getRect(Tmp.r2, b.x, b.y, b.rotation).overlaps(rect)); } @Override @@ -377,7 +377,7 @@ public class UnitAssembler extends PayloadBlock{ @Override public boolean shouldConsume(){ //liquid is only consumed when building is being done - return enabled && !wasOccupied && Units.canCreate(team, plan().unit) && consPayload.efficiency(this) > 0 && consItem.efficiency(this) > 0; + return enabled && !wasOccupied && Units.canCreate(team, plan().unit) && consPayload.efficiency(this) > 0 && consItem.efficiency(this) > 0 && team.activateUnitFactories(); } @Override @@ -676,6 +676,12 @@ public class UnitAssembler extends PayloadBlock{ Sounds.shootPayload.at(x, y, 1f + Mathf.range(0.1f), 1f); } + @Override + public BlockStatus status(){ + if(!team.activateUnitFactories()) return BlockStatus.inactive; + return super.status(); + } + @Override public double sense(LAccess sensor){ if(sensor == LAccess.progress) return progress; diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 15a82d6226..8f461e3874 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -437,7 +437,13 @@ public class UnitFactory extends UnitBlock{ @Override public boolean shouldConsume(){ if(currentPlan == -1) return false; - return enabled && payload == null; + return enabled && payload == null && team.activateUnitFactories(); + } + + @Override + public BlockStatus status(){ + if(!team.activateUnitFactories()) return BlockStatus.inactive; + return super.status(); } @Override diff --git a/core/src/mindustry/world/draw/DrawBlockParts.java b/core/src/mindustry/world/draw/DrawBlockParts.java new file mode 100644 index 0000000000..7df6f5ed84 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawBlockParts.java @@ -0,0 +1,56 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import arc.struct.*; +import arc.util.*; +import mindustry.entities.part.*; +import mindustry.entities.units.*; +import mindustry.gen.*; +import mindustry.world.*; + +public class DrawBlockParts extends DrawBlock{ + public Seq parts = new Seq<>(); + public TextureRegion preview; + + @Override + public void getRegionsToOutline(Block block, Seq out){ + for(var part : parts){ + part.getOutlines(out); + } + } + + @Override + public void drawPlan(Block block, BuildPlan plan, Eachable list){ + if(preview.found()){ + Draw.rect(preview, plan.drawx(), plan.drawy(), block.rotate ? plan.rotation * 90f - 90f : 0f); + } + } + + @Override + public void draw(Building build){ + if(parts.size > 0){ + float progress = build.progress(); + + var params = DrawPart.params.set(build.warmup(), 1f - progress, 1f - progress, 0f, 0f, 0f, build.x, build.y, build.rotdeg()); + + for(var part : parts){ + part.draw(params); + } + } + } + + @Override + public void load(Block block){ + preview = Core.atlas.find(block.name + "-preview"); + + for(var part : parts){ + part.load(block.name); + } + } + + @Override + public TextureRegion[] icons(Block block){ + return preview.found() ? new TextureRegion[]{preview} : super.icons(block); + } +} diff --git a/core/src/mindustry/world/draw/DrawCultivator.java b/core/src/mindustry/world/draw/DrawCultivator.java index c4717baa40..e40efea300 100644 --- a/core/src/mindustry/world/draw/DrawCultivator.java +++ b/core/src/mindustry/world/draw/DrawCultivator.java @@ -15,7 +15,7 @@ public class DrawCultivator extends DrawBlock{ public int bubbles = 12, sides = 8; public float strokeMin = 0.2f, spread = 3f, timeScl = 70f; - public float recurrence = 6f, radius = 3f; + public float recurrence = 6f, radius = 3f, x, y; public TextureRegion middle; @@ -27,12 +27,12 @@ public class DrawCultivator extends DrawBlock{ rand.setSeed(build.pos()); for(int i = 0; i < bubbles; i++){ - float x = rand.range(spread), y = rand.range(spread); + float rx = rand.range(spread), ry = rand.range(spread); float life = 1f - ((Time.time / timeScl + rand.random(recurrence)) % recurrence); if(life > 0){ Lines.stroke(build.warmup() * (life + strokeMin)); - Lines.poly(build.x + x, build.y + y, sides, (1f - life) * radius); + Lines.poly(build.x + rx + x, build.y + ry + y, sides, (1f - life) * radius); } } diff --git a/core/src/mindustry/world/draw/DrawFade.java b/core/src/mindustry/world/draw/DrawFade.java index 1b9798babf..6f51c59faa 100644 --- a/core/src/mindustry/world/draw/DrawFade.java +++ b/core/src/mindustry/world/draw/DrawFade.java @@ -8,13 +8,13 @@ import mindustry.world.*; public class DrawFade extends DrawBlock{ public String suffix = "-top"; - public float alpha = 0.6f, scale = 3f; + public float alpha = 0.6f, scale = 3f, x, y; public TextureRegion region; @Override public void draw(Building build){ Draw.alpha(Mathf.absin(build.totalProgress(), scale, alpha) * build.warmup()); - Draw.rect(region, build.x, build.y); + Draw.rect(region, build.x + x, build.y + y); Draw.reset(); } diff --git a/core/src/mindustry/world/draw/DrawPistons.java b/core/src/mindustry/world/draw/DrawPistons.java index 117a361cad..d7eafd9a35 100644 --- a/core/src/mindustry/world/draw/DrawPistons.java +++ b/core/src/mindustry/world/draw/DrawPistons.java @@ -9,7 +9,7 @@ import mindustry.gen.*; import mindustry.world.*; public class DrawPistons extends DrawBlock{ - public float sinMag = 4f, sinScl = 6f, sinOffset = 50f, sideOffset = 0f, lenOffset = -1f, horiOffset = 0f, angleOffset = 0f; + public float sinMag = 4f, sinScl = 6f, sinOffset = 50f, sideOffset = 0f, lenOffset = -1f, horiOffset = 0f, angleOffset = 0f, x, y; public int sides = 4; public String suffix = "-piston"; public TextureRegion region1, region2, regiont, iconRegion; @@ -35,7 +35,7 @@ public class DrawPistons extends DrawBlock{ } Tmp.v1.trns(angle, len, -horiOffset); - Draw.rect(reg, build.x + Tmp.v1.x, build.y + Tmp.v1.y, angle); + Draw.rect(reg, build.x + Tmp.v1.x + x, build.y + Tmp.v1.y + y, angle); Draw.yscl = 1f; } diff --git a/core/src/mindustry/world/draw/DrawPlasma.java b/core/src/mindustry/world/draw/DrawPlasma.java index 398d384fdc..9a2afe7584 100644 --- a/core/src/mindustry/world/draw/DrawPlasma.java +++ b/core/src/mindustry/world/draw/DrawPlasma.java @@ -10,6 +10,7 @@ import mindustry.graphics.*; import mindustry.world.*; public class DrawPlasma extends DrawFlame{ + public float x, y; public TextureRegion[] regions; public String suffix = "-plasma-"; public int plasmas = 4; @@ -39,7 +40,7 @@ public class DrawPlasma extends DrawFlame{ Draw.color(plasma1, plasma2, (float)i / regions.length); Draw.alpha((0.3f + Mathf.absin(Time.time, 2f + i * 2f, 0.3f + i * 0.05f)) * build.warmup()); - Draw.rect(regions[i], build.x, build.y, r, r, build.totalProgress() * (12 + i * 6f)); + Draw.rect(regions[i], build.x + x, build.y + y, r, r, build.totalProgress() * (12 + i * 6f)); } Draw.color(); Draw.blend(); diff --git a/core/src/mindustry/world/draw/DrawPulseShape.java b/core/src/mindustry/world/draw/DrawPulseShape.java index 36f1e8475a..29b16d700c 100644 --- a/core/src/mindustry/world/draw/DrawPulseShape.java +++ b/core/src/mindustry/world/draw/DrawPulseShape.java @@ -12,7 +12,7 @@ import static mindustry.Vars.*; public class DrawPulseShape extends DrawBlock{ public Color color = Pal.accent.cpy(); - public float stroke = 2f, timeScl = 100f, minStroke = 0.2f; + public float stroke = 2f, timeScl = 100f, minStroke = 0.2f, x, y; public float radiusScl = 1f; public float layer = -1f; public boolean square = true; @@ -36,13 +36,13 @@ public class DrawPulseShape extends DrawBlock{ Lines.stroke((stroke * f + minStroke) * build.warmup()); if(square){ - Lines.square(build.x, build.y, Math.min(1f + (1f - f) * rad, rad)); + Lines.square(build.x + x, build.y + y, Math.min(1f + (1f - f) * rad, rad)); }else{ float r = Math.max(0f, Mathf.clamp(2f - f * 2f) * rad - f - 0.2f), w = Mathf.clamp(0.5f - f) * rad * 2f; Lines.beginLine(); for(int i = 0; i < 4; i++){ - Lines.linePoint(build.x + Geometry.d4(i).x * r + Geometry.d4(i).y * w, build.y + Geometry.d4(i).y * r - Geometry.d4(i).x * w); - if(f < 0.5f) Lines.linePoint(build.x + Geometry.d4(i).x * r - Geometry.d4(i).y * w, build.y + Geometry.d4(i).y * r + Geometry.d4(i).x * w); + Lines.linePoint(build.x + x + Geometry.d4(i).x * r + Geometry.d4(i).y * w, build.y + y + Geometry.d4(i).y * r - Geometry.d4(i).x * w); + if(f < 0.5f) Lines.linePoint(build.x + x + Geometry.d4(i).x * r - Geometry.d4(i).y * w, build.y + y + Geometry.d4(i).y * r + Geometry.d4(i).x * w); } Lines.endLine(true); } diff --git a/core/src/mindustry/world/draw/DrawSideRegion.java b/core/src/mindustry/world/draw/DrawSideRegion.java index e1b3dfca6a..b2507f37ce 100644 --- a/core/src/mindustry/world/draw/DrawSideRegion.java +++ b/core/src/mindustry/world/draw/DrawSideRegion.java @@ -10,7 +10,6 @@ import mindustry.world.*; public class DrawSideRegion extends DrawBlock{ public TextureRegion top1, top2; - @Override public void draw(Building build){ Draw.rect(build.rotation > 1 ? top2 : top1, build.x, build.y, build.rotdeg()); diff --git a/core/src/mindustry/world/draw/DrawWeave.java b/core/src/mindustry/world/draw/DrawWeave.java index d95652455e..ee010bbdc4 100644 --- a/core/src/mindustry/world/draw/DrawWeave.java +++ b/core/src/mindustry/world/draw/DrawWeave.java @@ -10,6 +10,7 @@ import mindustry.world.*; public class DrawWeave extends DrawBlock{ public TextureRegion weave; + public float x, y; @Override public void draw(Building build){ @@ -19,8 +20,8 @@ public class DrawWeave extends DrawBlock{ Draw.alpha(build.warmup()); Lines.lineAngleCenter( - build.x + Mathf.sin(build.totalProgress(), 6f, Vars.tilesize / 3f * build.block.size), - build.y, + build.x + x + Mathf.sin(build.totalProgress(), 6f, Vars.tilesize / 3f * build.block.size), + build.y + y, 90, build.block.size * Vars.tilesize / 2f); diff --git a/core/src/mindustry/world/meta/BuildVisibility.java b/core/src/mindustry/world/meta/BuildVisibility.java index c4809d2e62..a9ca7d6421 100644 --- a/core/src/mindustry/world/meta/BuildVisibility.java +++ b/core/src/mindustry/world/meta/BuildVisibility.java @@ -17,7 +17,7 @@ public class BuildVisibility{ campaignOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.isCampaign() || !Vars.state.isGame()), legacyLaunchPadOnly = new BuildVisibility(() -> (Vars.state == null || Vars.state.isCampaign() && Vars.state.getPlanet().campaignRules.legacyLaunchPads) && Blocks.advancedLaunchPad != null && Blocks.advancedLaunchPad.unlocked()), notLegacyLaunchPadOnly = new BuildVisibility(() -> (Vars.state == null || !Vars.state.isGame() || Vars.state.rules.infiniteResources || Vars.state.isCampaign() && !Vars.state.getPlanet().campaignRules.legacyLaunchPads)), - lightingOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.lighting || Vars.state.isCampaign() || !Vars.state.isGame()), + lightingOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.lighting || Vars.state.isCampaign() || !Vars.state.isGame() || Vars.state.rules.infiniteResources), ammoOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.unitAmmo), fogOnly = new BuildVisibility(() -> Vars.state == null || Vars.state.rules.fog || Vars.state.rules.editor || !Vars.state.isGame()); diff --git a/core/src/mindustry/world/meta/Stat.java b/core/src/mindustry/world/meta/Stat.java index c2f207259a..63a41ce768 100644 --- a/core/src/mindustry/world/meta/Stat.java +++ b/core/src/mindustry/world/meta/Stat.java @@ -86,7 +86,6 @@ public class Stat implements Comparable{ reload = new Stat("reload", StatCat.function), crushDamage = new Stat("crushDamage", StatCat.function), legSplashDamage = new Stat("legSplashDamage", StatCat.function), - legSplashRange = new Stat("legSplashRange", StatCat.function), targetsAir = new Stat("targetsAir", StatCat.function), targetsGround = new Stat("targetsGround", StatCat.function), damage = new Stat("damage", StatCat.function), diff --git a/core/src/mindustry/world/meta/StatValues.java b/core/src/mindustry/world/meta/StatValues.java index 58134e5c84..ed4923b10a 100644 --- a/core/src/mindustry/world/meta/StatValues.java +++ b/core/src/mindustry/world/meta/StatValues.java @@ -733,11 +733,11 @@ public class StatValues{ sep(bt, "@bullet.armorpierce"); } - if(type.armorMultiplier != 1f){ + if(type.armorMultiplier != 1f && !type.pierceArmor){ if(type.armorMultiplier > 1f){ - sep(bt, Core.bundle.format("bullet.armorweakness", (int)(type.armorMultiplier * 100))); + sep(bt, Core.bundle.format("bullet.armorweakness", (type.armorMultiplier))); }else if(Mathf.sign(type.armorMultiplier) == 1){ - sep(bt, Core.bundle.format("bullet.armorpiercing", (int)((1 - type.armorMultiplier) * 100))); + sep(bt, Core.bundle.format("bullet.partialarmorpierce", (int)((1 - type.armorMultiplier) * 100))); }else{ sep(bt, Core.bundle.format("bullet.antiarmor", (-type.armorMultiplier))); } diff --git a/core/src/mindustry/world/meta/Stats.java b/core/src/mindustry/world/meta/Stats.java index d9651e9b6d..e9adfb6bd5 100644 --- a/core/src/mindustry/world/meta/Stats.java +++ b/core/src/mindustry/world/meta/Stats.java @@ -1,11 +1,17 @@ package mindustry.world.meta; +import arc.*; +import arc.scene.ui.layout.*; import arc.struct.ObjectMap.*; import arc.struct.*; import arc.util.*; +import mindustry.*; +import mindustry.gen.*; import mindustry.mod.*; import mindustry.type.*; +import java.util.*; + /** Hold and organizes a list of block stats. */ @NoPatch public class Stats{ @@ -131,4 +137,21 @@ public class Stats{ } return map; } + + public void statInfo(Cell cell, Stat stat){ + if(cell == null || stat == null) return; + + String key = "stat." + stat.name.toLowerCase(Locale.ROOT); + if(Core.bundle.has(key + ".info")){ + if(Vars.mobile && !Core.graphics.isPortrait()){ //disabled in portrait - broken and goes offscreen + Table table = new Table(); + table.add(cell.get()).left().expandX().fillX(); + cell.clearElement(); + table.button(Icon.infoSmall, () -> Vars.ui.showInfo("@" + key + ".info")).size(32f).right(); + cell.setElement(table).left().expandX().fillX(); + }else{ + cell.tooltip("@" + key + ".info"); + } + } + } } diff --git a/desktop/build.gradle b/desktop/build.gradle index d30d59c78a..0898451c27 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -3,10 +3,9 @@ sourceSets.main.java.srcDirs = ["src/"] project.ext.mainClassName = "mindustry.desktop.DesktopLauncher" project.ext.assetsDir = new File("../core/assets") -def enableTemplates = true def JDK_DIR = "$System.env.JDK_DIR" def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns") -def platforms = ["Linux64", "Windows64", "Windows32", "MacOS"] +def platforms = ["Linux64", "Windows64", "MacOS"] tasks.register('run', JavaExec){ dependsOn classes @@ -112,80 +111,66 @@ platforms.each{ platform -> delete "build/packr/output/" } - //the Windows32 version uses an old java-8 based template, because packr and jpackage don't support win32 - if(enableTemplates && (platform == "Windows32")){ - copy{ - into "build/packr/output" - from "${JDK_DIR}/templates/${platform.toString().toLowerCase()}" - } + def jarPath = JDK_DIR + "packr.jar" + def args = new String[]{"java", "-jar", jarPath} - copy{ - into "build/packr/output/jre" - rename("${appName}.jar", "desktop.jar") - from "build/libs/${appName}.jar" - } - }else{ - def jarPath = JDK_DIR + "packr.jar" - def args = new String[]{"java", "-jar", jarPath} - - args += new String[]{ - "--platform", platform == "MacOS" ? "Mac" : platform.toString(), - "--jdk", JDK_DIR + "jre-${platform.toString().toLowerCase()}", - "--executable", appName, - "--classpath", "$rootDir/desktop/build/packr/desktop.jar".toString(), - "--mainclass", project.ext.mainClassName, - "--verbose", - "--bundle", getPackage() + ".mac", - "--icon", ICON_DIR, - "--output", "$rootDir/desktop/build/packr/output".toString(), - "--removelibs", "$rootDir/desktop/build/packr/desktop.jar".toString() - } - - args += "--vmargs" - - if(platform == "MacOS"){ - args += "XstartOnFirstThread" - } - - args += "Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1" - args += "XX:+ShowCodeDetailsInExceptionMessages" - args += "XX:+UseCompactObjectHeaders" - args += "enable-native-access=ALL-UNNAMED" - - exec{ - commandLine args.toList() - standardOutput = System.out - } - - def outputJsonFile = platform != "MacOS" ? file("build/packr/output/Mindustry.json") : file("build/packr/output/${appName}.app/Contents/Resources/Mindustry.json") - - if(platform != "MacOS"){ - copy{ - into "build/packr/output/jre/" - from "build/packr/output/desktop.jar" - } - - delete{ - delete "build/packr/output/desktop.jar" - } - - outputJsonFile.text = outputJsonFile.text.replace("desktop.jar", "jre/desktop.jar") - }else{ - copy{ - into "build/packr/output/${appName}.app/Contents/" - from "build/packr/output/Contents/" - } - - delete{ - delete "build/packr/output/Contents/" - } - } - - //packr is broken and won't let me add one hyphen, so I have to do that myself later - outputJsonFile.text = outputJsonFile.text.replace("-enable-native-access=ALL-UNNAMED", "--enable-native-access=ALL-UNNAMED") + args += new String[]{ + "--platform", platform == "MacOS" ? "Mac" : platform.toString(), + "--jdk", JDK_DIR + "jre-${platform.toString().toLowerCase()}", + "--executable", appName, + "--classpath", "$rootDir/desktop/build/packr/desktop.jar".toString(), + "--mainclass", project.ext.mainClassName, + "--verbose", + "--bundle", getPackage() + ".mac", + "--icon", ICON_DIR, + "--output", "$rootDir/desktop/build/packr/output".toString(), + "--removelibs", "$rootDir/desktop/build/packr/desktop.jar".toString() } - if((platform == "Windows64" || platform == "Windows32")){ + args += "--vmargs" + + if(platform == "MacOS"){ + args += "XstartOnFirstThread" + } + + args += "Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1" + args += "XX:+ShowCodeDetailsInExceptionMessages" + args += "XX:+UseCompactObjectHeaders" + args += "enable-native-access=ALL-UNNAMED" + + project.services.get(ExecOperations).exec{ + commandLine args.toList() + standardOutput = System.out + } + + def outputJsonFile = platform != "MacOS" ? file("build/packr/output/Mindustry.json") : file("build/packr/output/${appName}.app/Contents/Resources/Mindustry.json") + + if(platform != "MacOS"){ + copy{ + into "build/packr/output/jre/" + from "build/packr/output/desktop.jar" + } + + delete{ + delete "build/packr/output/desktop.jar" + } + + outputJsonFile.text = outputJsonFile.text.replace("desktop.jar", "jre/desktop.jar") + }else{ + copy{ + into "build/packr/output/${appName}.app/Contents/" + from "build/packr/output/Contents/" + } + + delete{ + delete "build/packr/output/Contents/" + } + } + + //packr is broken and won't let me add one hyphen, so I have to do that myself later + outputJsonFile.text = outputJsonFile.text.replace("-enable-native-access=ALL-UNNAMED", "--enable-native-access=ALL-UNNAMED") + + if((platform == "Windows64")){ copy{ from "build/packr/output/jre/bin/msvcr100.dll" into "build/packr/output/" @@ -197,8 +182,8 @@ platforms.each{ platform -> copy{ def lib = platform == "MacOS" || platform == "Linux64" ? "lib" : "" from zipTree(platform == "MacOS" ? "build/packr/output/${appName}.app/Contents/Resources/desktop.jar" : "build/packr/output/jre/desktop.jar").matching{ - include "${lib}steamworks4j${platform == "Windows64" ? '64.dll' : platform == "Windows32" ? '.dll' : platform == "Linux64" ? '.so' : '.dylib'}" - include "${lib}steam_api${platform == "Windows64" ? '64.dll' : platform == "Windows32" ? '.dll' : platform == "Linux64" ? '.so' : '.dylib'}" + include "${lib}steamworks4j${platform == "Windows64" ? '64.dll' : platform == "Linux64" ? '.so' : '.dylib'}" + include "${lib}steam_api${platform == "Windows64" ? '64.dll' : platform == "Linux64" ? '.so' : '.dylib'}" } into platform != "MacOS" ? "build/packr/output/" : "build/packr/output/${appName}.app/Contents/Resources" } diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java index f4e1dfa6f7..572e1fb6fc 100644 --- a/desktop/src/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -153,11 +153,11 @@ public class DesktopLauncher extends ClientLauncher{ this.args = args; if(useDiscord){ + Runtime.getRuntime().addShutdownHook(new Thread(DiscordRPC::close)); Threads.daemon(() -> { try{ DiscordRPC.connect(discordID); Log.info("Initialized Discord rich presence."); - Runtime.getRuntime().addShutdownHook(new Thread(DiscordRPC::close)); }catch(NoDiscordClientException none){ //don't log if no client is found useDiscord = false; diff --git a/desktop/src/mindustry/desktop/steam/SNet.java b/desktop/src/mindustry/desktop/steam/SNet.java index db3baf0175..8d959b20eb 100644 --- a/desktop/src/mindustry/desktop/steam/SNet.java +++ b/desktop/src/mindustry/desktop/steam/SNet.java @@ -270,9 +270,10 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, } int version = Strings.parseInt(smat.getLobbyData(steamIDLobby, "version"), -1); + boolean hidden = smat.getLobbyData(steamIDLobby, "hidden").equals("true"); //check version - if(version != Version.build){ + if(version != Version.build && !hidden){ ui.loadfrag.hide(); ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated) + "\n[]" + Core.bundle.format("server.versions", Version.build, version)); diff --git a/gradle.properties b/gradle.properties index 9e4b145ae4..8df335e096 100644 --- a/gradle.properties +++ b/gradle.properties @@ -26,4 +26,4 @@ org.gradle.caching=true org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.connectionTimeout=100000 android.enableR8.fullMode=false -archash=f9a551ad15 +archash=50ec671746 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3ae1e2f124..2f2958b923 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ios/build.gradle b/ios/build.gradle index f61a602c9b..088c7a7014 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -35,7 +35,6 @@ task incrementConfig{ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-ios") implementation arcModule("natives:natives-freetype-ios") implementation arcModule("backends:backend-robovm") diff --git a/server/build.gradle b/server/build.gradle index 24252a0271..536d691cfe 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -38,6 +38,7 @@ tasks.register('dist', Jar){ from files(sourceSets.main.output.resourcesDir) from{ configurations.runtimeClasspath.collect{ it.isDirectory() ? it : zipTree(it) } } from files(project.assetsDir) + exclude("bloomshaders/**") exclude("sprites/**") exclude("music/**") exclude("sounds/**") diff --git a/servers_v7.json b/servers_v7.json index dbc5e920a7..c71563735e 100644 --- a/servers_v7.json +++ b/servers_v7.json @@ -310,12 +310,6 @@ "15.235.181.136:12171" ] }, - { - "name": "Korea", - "address": [ - "mindustry.kr" - ] - }, { "name": "Extra Utilities", "address": [ diff --git a/settings.gradle b/settings.gradle index d16da6d9d3..027d2a3269 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,10 +6,10 @@ include 'desktop', 'core', 'server', 'ios', 'annotations', 'tools', 'tests' def hasSdk = System.getenv("ANDROID_HOME") != null +def localProperties = new Properties() if(new File(settingsDir, 'local.properties').exists()){ - def properties = new Properties() - properties.load(new File(settingsDir, 'local.properties').newDataInputStream()) - if(properties.containsKey("sdk.dir")) hasSdk = true + localProperties.load(new File(settingsDir, 'local.properties').newDataInputStream()) + if(localProperties.containsKey("sdk.dir")) hasSdk = true } if(System.getenv("JITPACK") == "true") hasSdk = false @@ -20,6 +20,10 @@ if(hasSdk){ println("No Android SDK found. Skipping Android module.") } +if(hasProperty("localRhino") || localProperties.getOrDefault("localRhino", "false") == "true"){ + includeBuild("../rhino") +} + if(!hasProperty("noLocalArc")){ if(new File(rootDir.parent, 'Arc').exists()){ println("Compiling with localArc") diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 5ea8e47422..7aca153caf 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -904,6 +904,8 @@ public class ApplicationTests{ Time.setDeltaProvider(() -> 1f); logic.reset(); + //pathfinder pollutes queue with garbage, causing OOM + Reflect.get(HeadlessApplication.class, Core.app, "runnables").clear(); state.rules.sector = zone.sector; world.loadGenerator(zone.generator.map.width, zone.generator.map.height, tiles -> zone.generator.generate(tiles, new WorldParams())); zone.rules.get(state.rules); @@ -961,6 +963,11 @@ public class ApplicationTests{ } } + assertFalse(Vars.indexer.isBlockPresent(Blocks.powerSource), "Sector '" + zone + "' must not have power sources."); + assertFalse(Vars.indexer.isBlockPresent(Blocks.powerVoid), "Sector '" + zone + "' must not have power voids."); + assertFalse(Vars.indexer.isBlockPresent(Blocks.itemSource), "Sector '" + zone + "' must not have item sources."); + assertFalse(Vars.indexer.isBlockPresent(Blocks.liquidSource), "Sector '" + zone + "' must not have liquid sources."); + assertEquals(1, Team.sharded.cores().size, "Sector must have one core: " + zone + " (" + Team.sharded.cores() + ")"); assertTrue(hasSpawnPoint, "Sector \"" + zone.name + "\" has no spawn points."); diff --git a/tests/src/test/java/PatcherTests.java b/tests/src/test/java/PatcherTests.java index 561f821f54..4795d5b53a 100644 --- a/tests/src/test/java/PatcherTests.java +++ b/tests/src/test/java/PatcherTests.java @@ -534,6 +534,65 @@ public class PatcherTests{ assertEquals(oldDamage, UnitTypes.dagger.weapons.first().bullet.damage); } + @Test + void nestedArrays() throws Exception{ + + Vars.state.patcher.apply(Seq.with(""" + { + "block.ship-refabricator.upgrades.0": { + "0": "dagger", + "1": "mace" + } + } + """)); + assertNoWarnings(); + + assertEquals(UnitTypes.dagger, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.mace, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + + resetAfter(); + + assertEquals(UnitTypes.elude, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.avert, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + } + + @Test + void nestedArrays2() throws Exception{ + + Vars.state.patcher.apply(Seq.with(""" + { + "block.ship-refabricator": { + "upgrades.0.0": "dagger", + "upgrades.0.1": "mace" + } + } + """)); + assertNoWarnings(); + + assertEquals(UnitTypes.dagger, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.mace, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + + resetAfter(); + + assertEquals(UnitTypes.elude, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[0]); + assertEquals(UnitTypes.avert, ((Reconstructor)Blocks.shipRefabricator).upgrades.get(0)[1]); + } + + @Test + void arrayMulti() throws Exception{ + int size = UnitTypes.emanate.weapons.size; + + Vars.state.patcher.apply(Seq.with(""" + {"name":"Patch0","unit":{"emanate":{"weapons":{"0":{"type":"Weapon","name":"toxopid-cannon"}},"weapons.+":[{"name":"sei-launcher"}]}}} + """)); + + assertEquals(UnitTypes.emanate.weapons.size, size + 1); + + resetAfter(); + + assertEquals(UnitTypes.emanate.weapons.size, size); + } + @Test void customAttribute() throws Exception{ int amount = Attribute.all.length; diff --git a/tools/build.gradle b/tools/build.gradle index 28b3842033..c2b15be338 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -102,7 +102,7 @@ static void antialias(File file){ new Fi(file).writePng(out) } -task antialiasImages(){ +tasks.register('antialiasImages'){ doLast{ for(def img : project.getProperty("images").split(",")){ println(project.getProperty("startdir") + "/" + img) @@ -111,7 +111,7 @@ task antialiasImages(){ } } -task tileImages(){ +tasks.register('tileImages'){ doLast{ for(def img : project.getProperty("images").split(",")){ println(project.getProperty("startdir") + "/" + img) @@ -120,7 +120,8 @@ task tileImages(){ } } -task pack(dependsOn: [classes, configurations.runtimeClasspath]){ +tasks.register('pack'){ + dependsOn = [classes, configurations.runtimeClasspath] doLast{ //cleanup old sprites @@ -136,8 +137,9 @@ task pack(dependsOn: [classes, configurations.runtimeClasspath]){ //run generation task; generate all needed sprites file(genFolder).mkdirs() - javaexec{ - main = "mindustry.tools.ImagePacker" + + project.services.get(ExecOperations).javaexec{ + mainClass = "mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath workingDir = genFolder } @@ -188,7 +190,8 @@ task pack(dependsOn: [classes, configurations.runtimeClasspath]){ } } -task genSprites(dependsOn: classes, type: JavaExec){ +tasks.register('genSprites', JavaExec){ + dependsOn classes finalizedBy 'antialiasGen' mainClass = "mindustry.tools.ImagePacker" @@ -197,7 +200,8 @@ task genSprites(dependsOn: classes, type: JavaExec){ workingDir = genFolder } -task fontgen(dependsOn: classes, type: JavaExec){ +tasks.register('fontgen', JavaExec){ + dependsOn classes /* icon font pipeline: 1. take set of pre-defined icons and SVGs 2. use Fontello API to get a font with these @@ -232,30 +236,32 @@ task fontgen(dependsOn: classes, type: JavaExec){ //TODO this is broken Log.info(OS.exec("fontforge", "-script", - Fi.get("core/assets-raw/fontgen/merge.pe").absolutePath(), - Fi.get("core/assets/fonts/font.woff").absolutePath(), - Fi.get("core/assets-raw/fontgen/out/font.woff").absolutePath()) + Fi.get("core/assets-raw/fontgen/merge.pe").absolutePath(), + Fi.get("core/assets/fonts/font.woff").absolutePath(), + Fi.get("core/assets-raw/fontgen/out/font.woff").absolutePath()) ) Log.info("Done.") } } -task icongen(dependsOn: classes, type: JavaExec){ +tasks.register('icongen', JavaExec){ + dependsOn classes mainClass = "mindustry.tools.IconConverter" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets-raw" } -task updateScripts(dependsOn: classes, type: JavaExec){ +tasks.register('updateScripts', JavaExec){ + dependsOn classes mainClass = "mindustry.tools.ScriptMainGenerator" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../" } -task updateBundles{ +tasks.register('updateBundles'){ doLast{ def uniEscape = { String string -> StringBuilder outBuffer = new StringBuilder() @@ -263,12 +269,12 @@ task updateBundles{ for(int i = 0; i < len; i++){ char ch = string.charAt(i) if((ch > 61) && (ch < 127)){ - outBuffer.append(ch == (char)'\\' ? "\\\\" : ch) + outBuffer.append(ch == (char) '\\' ? "\\\\" : ch) continue } if(ch >= 0xE000 && ch <= 0xF8FF){ - String hex = Integer.toHexString((int)ch) + String hex = Integer.toHexString((int) ch) outBuffer.append("\\u") for(int j = 0; j < 4 - hex.length(); j++){ outBuffer.append('0')