Merge branch 'master' of https://github.com/Anuken/Mindustry into v116
1
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -24,4 +24,5 @@ assignees: ''
|
|||||||
---
|
---
|
||||||
|
|
||||||
*Place an X (no spaces) between the brackets to confirm that you have read the line below.*
|
*Place an X (no spaces) between the brackets to confirm that you have read the line below.*
|
||||||
|
- [ ] **I have updated to the latest release (https://github.com/Anuken/Mindustry/releases) to make sure my issue has not been fixed.**
|
||||||
- [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.**
|
- [ ] **I have searched the closed and open issues to make sure that this problem has not already been reported.**
|
||||||
|
|||||||
9
.github/workflows/deployment.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
java-version: 14
|
java-version: 14
|
||||||
- name: Create artifacts
|
- name: Create artifacts
|
||||||
run: |
|
run: |
|
||||||
./gradlew desktop:dist server:dist core:javadoc -Pbuildversion=${GITHUB_REF:1}"
|
./gradlew desktop:dist server:dist core:javadoc -Pbuildversion=${GITHUB_REF:1}
|
||||||
- name: Update docs
|
- name: Update docs
|
||||||
run: |
|
run: |
|
||||||
cd ../
|
cd ../
|
||||||
@@ -28,6 +28,13 @@ jobs:
|
|||||||
git commit -m "Update ${GITHUB_REF:1}"
|
git commit -m "Update ${GITHUB_REF:1}"
|
||||||
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/MindustryGame/docs
|
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/MindustryGame/docs
|
||||||
cd ../Mindustry
|
cd ../Mindustry
|
||||||
|
- name: Add Arc release
|
||||||
|
run: |
|
||||||
|
git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
||||||
|
cd ../Arc
|
||||||
|
git tag ${GITHUB_REF}
|
||||||
|
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/Arc ${GITHUB_REF};
|
||||||
|
cd ../Mindustry
|
||||||
- name: Update F-Droid build string
|
- name: Update F-Droid build string
|
||||||
run: |
|
run: |
|
||||||
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
|
|||||||
5
.github/workflows/push.yml
vendored
@@ -18,6 +18,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
git clone --depth=1 --branch=master https://github.com/Anuken/MindustryBuilds ../MindustryBuilds
|
||||||
cd ../MindustryBuilds
|
cd ../MindustryBuilds
|
||||||
git tag ${GITHUB_RUN_NUMBER}
|
BNUM=$(($GITHUB_RUN_NUMBER + 20000))
|
||||||
|
git tag ${BNUM}
|
||||||
git config --global user.name "Build Uploader"
|
git config --global user.name "Build Uploader"
|
||||||
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${GITHUB_RUN_NUMBER}
|
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds ${BNUM}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ dependencies{
|
|||||||
natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
|
natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}"
|
||||||
|
|
||||||
//android dependencies magically disappear during compilation, thanks gradle!
|
//android dependencies magically disappear during compilation, thanks gradle!
|
||||||
def sdkFile = new File(System.getenv("ANDROID_HOME"), "/platforms/android-29/android.jar")
|
def sdkFile = new File((String)findSdkDir(), "/platforms/android-29/android.jar")
|
||||||
if(sdkFile.exists()) compileOnly files(sdkFile.absolutePath)
|
if(sdkFile.exists()) compileOnly files(sdkFile.absolutePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", "");
|
String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", "");
|
||||||
if(SourceVersion.isKeyword(name) || name.equals("char")) name += "i";
|
if(SourceVersion.isKeyword(name) || name.equals("char")) name += "i";
|
||||||
|
|
||||||
ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + key).build());
|
ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).addJavadoc(String.format("\\u%04x", Integer.parseInt(key))).initializer("'" + ((char)Integer.parseInt(key)) + "'").build());
|
||||||
});
|
});
|
||||||
|
|
||||||
ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class),
|
ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class),
|
||||||
@@ -64,7 +64,7 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
|
|
||||||
int code = val.getInt("code", 0);
|
int code = val.getInt("code", 0);
|
||||||
iconcAll.append((char)code);
|
iconcAll.append((char)code);
|
||||||
ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + code).build());
|
ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).addJavadoc(String.format("\\u%04x", code)).initializer("'" + ((char)code) + "'").build());
|
||||||
ichinit.addStatement("codes.put($S, $L)", name, code);
|
ichinit.addStatement("codes.put($S, $L)", name, code);
|
||||||
|
|
||||||
ictype.addField(TextureRegionDrawable.class, name + "Small", Modifier.PUBLIC, Modifier.STATIC);
|
ictype.addField(TextureRegionDrawable.class, name + "Small", Modifier.PUBLIC, Modifier.STATIC);
|
||||||
|
|||||||
11
build.gradle
@@ -99,6 +99,17 @@ allprojects{
|
|||||||
return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1)
|
return project.ext.mainClassName.substring(0, project.ext.mainClassName.indexOf("desktop") - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findSdkDir = {
|
||||||
|
//null because IntelliJ doesn't get env variables
|
||||||
|
def v = System.getenv("ANDROID_HOME")
|
||||||
|
if(v != null) return v
|
||||||
|
//rootDir is null here, amazing. brilliant.
|
||||||
|
def file = new File("local.properties")
|
||||||
|
if(!file.exists()) file = new File("../local.properties")
|
||||||
|
def props = new Properties().with{p -> p.load(file.newReader()); return p }
|
||||||
|
return props.get("sdk.dir")
|
||||||
|
}
|
||||||
|
|
||||||
generateLocales = {
|
generateLocales = {
|
||||||
def output = 'en\n'
|
def output = 'en\n'
|
||||||
def bundles = new File(project(':core').projectDir, 'assets/bundles/')
|
def bundles = new File(project(':core').projectDir, 'assets/bundles/')
|
||||||
|
|||||||
BIN
core/assets-raw/sprites/blocks/props/basalt-boulder1.png
Normal file
|
After Width: | Height: | Size: 682 B |
BIN
core/assets-raw/sprites/blocks/props/basalt-boulder2.png
Normal file
|
After Width: | Height: | Size: 683 B |
@@ -497,10 +497,10 @@ requirement.produce = Produce {0}
|
|||||||
requirement.capture = Capture {0}
|
requirement.capture = Capture {0}
|
||||||
launch.text = Launch
|
launch.text = Launch
|
||||||
research.multiplayer = Only the host can research items.
|
research.multiplayer = Only the host can research items.
|
||||||
|
map.multiplayer = Only the host can view sectors.
|
||||||
uncover = Uncover
|
uncover = Uncover
|
||||||
configure = Configure Loadout
|
configure = Configure Loadout
|
||||||
|
|
||||||
#TODO
|
|
||||||
loadout = Loadout
|
loadout = Loadout
|
||||||
resources = Resources
|
resources = Resources
|
||||||
bannedblocks = Banned Blocks
|
bannedblocks = Banned Blocks
|
||||||
@@ -508,12 +508,6 @@ addall = Add All
|
|||||||
launch.from = Launching From: [accent]{0}
|
launch.from = Launching From: [accent]{0}
|
||||||
launch.destination = Destination: {0}
|
launch.destination = Destination: {0}
|
||||||
configure.invalid = Amount must be a number between 0 and {0}.
|
configure.invalid = Amount must be a number between 0 and {0}.
|
||||||
zone.unlocked = [lightgray]{0} unlocked.
|
|
||||||
zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1}
|
|
||||||
zone.resources = [lightgray]Resources Detected:
|
|
||||||
zone.objective = [lightgray]Objective: [accent]{0}
|
|
||||||
zone.objective.survival = Survive
|
|
||||||
zone.objective.attack = Destroy Enemy Core
|
|
||||||
add = Add...
|
add = Add...
|
||||||
boss.health = Guardian Health
|
boss.health = Guardian Health
|
||||||
|
|
||||||
@@ -547,8 +541,13 @@ sectors.launch = Launch
|
|||||||
sectors.select = Select
|
sectors.select = Select
|
||||||
sectors.nonelaunch = [lightgray]none (sun)
|
sectors.nonelaunch = [lightgray]none (sun)
|
||||||
sectors.rename = Rename Sector
|
sectors.rename = Rename Sector
|
||||||
|
sectors.enemybase = [scarlet]Enemy Base
|
||||||
|
sectors.vulnerable = [scarlet]Vulnerable
|
||||||
|
sectors.underattack = [scarlet]Under attack! [accent]{0}% damaged
|
||||||
|
sectors.survives = [accent]Survives {0} waves
|
||||||
|
sectors.go = Go
|
||||||
sector.curcapture = Sector Captured
|
sector.curcapture = Sector Captured
|
||||||
|
sector.curlost = Sector Lost
|
||||||
sector.missingresources = [scarlet]Insufficient Core Resources
|
sector.missingresources = [scarlet]Insufficient Core Resources
|
||||||
sector.attacked = Sector [accent]{0}[white] under attack!
|
sector.attacked = Sector [accent]{0}[white] under attack!
|
||||||
sector.lost = Sector [accent]{0}[white] lost!
|
sector.lost = Sector [accent]{0}[white] lost!
|
||||||
@@ -589,7 +588,7 @@ sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats
|
|||||||
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.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.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.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.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.
|
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.
|
||||||
sector.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible.
|
sector.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible.
|
||||||
sector.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks.
|
sector.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks.
|
||||||
sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers.
|
sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers.
|
||||||
@@ -799,7 +798,6 @@ setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
|
|||||||
setting.sensitivity.name = Controller Sensitivity
|
setting.sensitivity.name = Controller Sensitivity
|
||||||
setting.saveinterval.name = Save Interval
|
setting.saveinterval.name = Save Interval
|
||||||
setting.seconds = {0} seconds
|
setting.seconds = {0} seconds
|
||||||
setting.blockselecttimeout.name = Block Select Timeout
|
|
||||||
setting.milliseconds = {0} milliseconds
|
setting.milliseconds = {0} milliseconds
|
||||||
setting.fullscreen.name = Fullscreen
|
setting.fullscreen.name = Fullscreen
|
||||||
setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required)
|
setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required)
|
||||||
@@ -808,7 +806,7 @@ setting.smoothcamera.name = Smooth Camera
|
|||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.pixelate.name = Pixelate
|
setting.pixelate.name = Pixelate
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
setting.coreitems.name = Display Core Items (WIP)
|
setting.coreitems.name = Display Core Items
|
||||||
setting.position.name = Show Player Position
|
setting.position.name = Show Player Position
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
setting.atmosphere.name = Show Planet Atmosphere
|
setting.atmosphere.name = Show Planet Atmosphere
|
||||||
@@ -888,6 +886,8 @@ keybind.menu.name = Menu
|
|||||||
keybind.pause.name = Pause
|
keybind.pause.name = Pause
|
||||||
keybind.pause_building.name = Pause/Resume Building
|
keybind.pause_building.name = Pause/Resume Building
|
||||||
keybind.minimap.name = Minimap
|
keybind.minimap.name = Minimap
|
||||||
|
keybind.planet_map.name = Planet Map
|
||||||
|
keybind.research.name = Research
|
||||||
keybind.chat.name = Chat
|
keybind.chat.name = Chat
|
||||||
keybind.player_list.name = Player List
|
keybind.player_list.name = Player List
|
||||||
keybind.console.name = Console
|
keybind.console.name = Console
|
||||||
@@ -1012,6 +1012,7 @@ block.resupply-point.name = Resupply Point
|
|||||||
block.parallax.name = Parallax
|
block.parallax.name = Parallax
|
||||||
block.cliff.name = Cliff
|
block.cliff.name = Cliff
|
||||||
block.sand-boulder.name = Sand Boulder
|
block.sand-boulder.name = Sand Boulder
|
||||||
|
block.basalt-boulder.name = Basalt Boulder
|
||||||
block.grass.name = Grass
|
block.grass.name = Grass
|
||||||
block.slag.name = Slag
|
block.slag.name = Slag
|
||||||
block.space.name = Space
|
block.space.name = Space
|
||||||
@@ -1234,27 +1235,40 @@ team.derelict.name = derelict
|
|||||||
team.green.name = green
|
team.green.name = green
|
||||||
team.purple.name = purple
|
team.purple.name = purple
|
||||||
|
|
||||||
tutorial.next = [lightgray]<Tap to continue>
|
hint.skip = Skip
|
||||||
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse[accent] [[WASD][] to move.\n[accent]Scroll[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
hint.desktopMove = Use [accent][[WASD][] to move.
|
||||||
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
|
hint.zoom = [accent]Scroll[] to zoom in or out.
|
||||||
tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\n[accent]Right-click[] to stop building.
|
hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
|
||||||
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.
|
hint.desktopShoot = [accent][[Left-click][] to shoot.
|
||||||
tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[]
|
hint.depositItems = To transfer items, drag from your ship to the core.
|
||||||
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\nUse the scrollwheel to rotate blocks before placing them.\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core.
|
hint.respawn = To respawn as a ship, press [accent][[V][].
|
||||||
tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core.
|
hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
|
||||||
tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base.
|
hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
|
||||||
tutorial.drillturret = Duo turrets require[accent] copper ammo[] to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1
|
hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it.
|
||||||
tutorial.pause = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press space to pause.
|
hint.placeDrill.mobile = Select the \ue85e[accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm.
|
||||||
tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause.
|
hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate.
|
||||||
tutorial.unpause = Now press space again to unpause.
|
hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors.
|
||||||
tutorial.unpause.mobile = Now press it again to unpause.
|
hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them.
|
||||||
tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
hint.breaking = [accent]Right-click[] and drag to break blocks.
|
||||||
tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection.
|
hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection.
|
||||||
tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[]
|
hint.research = Use the \ue875 [accent]Research[] button to research new technology.
|
||||||
tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[]
|
hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
|
||||||
tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper.
|
hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
|
||||||
tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper.
|
hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets.
|
||||||
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese obtained resources can then be used to research new technology.\n\n[accent]Press the launch button.
|
hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right.
|
||||||
|
hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[].
|
||||||
|
hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type.
|
||||||
|
hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path.
|
||||||
|
hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path.
|
||||||
|
hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters.
|
||||||
|
hint.command = Press [accent][[G][] to command nearby units into formation.
|
||||||
|
hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation.
|
||||||
|
hint.payloadPickup = Press [accent][[[] to pick up small blocks or units.
|
||||||
|
hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up.
|
||||||
|
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 = \uf879 [accent]Combustion Generators[] burn coal and transmit power to adjacent blocks.\n\nPower transmission range can be extended with \uf87f [accent]Power Nodes[].
|
||||||
|
|
||||||
item.copper.description = Used in all types of construction and ammunition.
|
item.copper.description = Used in all types of construction and ammunition.
|
||||||
item.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced.
|
item.copper.details = Copper. Abnormally abundant metal on Serpulo. Structurally weak unless reinforced.
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ gameover = Le base a été détruite.
|
|||||||
gameover.pvp = L'équipe[accent] {0}[] a gagnée !
|
gameover.pvp = L'équipe[accent] {0}[] a gagnée !
|
||||||
highscore = [accent]Nouveau meilleur score !
|
highscore = [accent]Nouveau meilleur score !
|
||||||
copied = Copié.
|
copied = Copié.
|
||||||
indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
|
indev.popup = [accent]La v6[] est actuellement en [accent]alpha[].\n[lightgray]Cela signifie :[]\n[scarlet]- La campagne est totalement incomplète[]\n- Il manque du contenu\n - La plupart des [scarlet]IA d'unités[] ne fonctionne pas correctement\n- De nombreuses unités ne sont pas terminées\n- Tout ce que vous voyez est susceptible d'être modifié ou supprimé.\n\nMerci de rapporter les bugs/crash sur [accent]Github[].
|
||||||
indev.notready = This part of the game isn't ready yet
|
indev.notready = Cette partie du jeu n'est pas encore prête
|
||||||
|
|
||||||
load.sound = Son
|
load.sound = Son
|
||||||
load.map = Maps
|
load.map = Maps
|
||||||
@@ -33,7 +33,7 @@ load.scripts = Scripts
|
|||||||
|
|
||||||
be.update = Une nouvelle version est disponible:
|
be.update = Une nouvelle version est disponible:
|
||||||
be.update.confirm = Voulez vous la télécharger et recommencer maintenant ?
|
be.update.confirm = Voulez vous la télécharger et recommencer maintenant ?
|
||||||
be.updating = Entrain de mettre à jour...
|
be.updating = En train de mettre à jour...
|
||||||
be.ignore = Ignorer
|
be.ignore = Ignorer
|
||||||
be.noupdates = Aucune mise à jour n'as été trouvée.
|
be.noupdates = Aucune mise à jour n'as été trouvée.
|
||||||
be.check = Chercher des mises à jour
|
be.check = Chercher des mises à jour
|
||||||
@@ -52,10 +52,10 @@ schematic.copy.import = Importer du presse-papier
|
|||||||
schematic.shareworkshop = Partager sur l'Atelier
|
schematic.shareworkshop = Partager sur l'Atelier
|
||||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner Schéma
|
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Retourner Schéma
|
||||||
schematic.saved = Schéma enregistré.
|
schematic.saved = Schéma enregistré.
|
||||||
schematic.delete.confirm = Ce Schéma sera totalement éradiqué.
|
schematic.delete.confirm = Ce Schéma sera définitivement supprimé.
|
||||||
schematic.rename = Renommer Schéma
|
schematic.rename = Renommer Schéma
|
||||||
schematic.info = {0}x{1}, {2} blocks
|
schematic.info = {0}x{1}, {2} blocks
|
||||||
schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server.
|
schematic.disabled = [scarlet] Schémas désactivés ![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]map[] ou ce [accent]serveur.
|
||||||
|
|
||||||
stat.wave = Vagues vaincues:[accent] {0}
|
stat.wave = Vagues vaincues:[accent] {0}
|
||||||
stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
|
stat.enemiesDestroyed = Ennemies détruits:[accent] {0}
|
||||||
@@ -508,13 +508,13 @@ error.io = Network I/O error.
|
|||||||
error.any = Erreur réseau inconnue.
|
error.any = Erreur réseau inconnue.
|
||||||
error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter.
|
error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter.
|
||||||
|
|
||||||
weather.rain.name = Rain
|
weather.rain.name = Pluie
|
||||||
weather.snow.name = Snow
|
weather.snow.name = Neige
|
||||||
weather.sandstorm.name = Sandstorm
|
weather.sandstorm.name = Tempête de sable
|
||||||
weather.sporestorm.name = Sporestorm
|
weather.sporestorm.name = Tempête de spores
|
||||||
weather.fog.name = Fog
|
weather.fog.name = Brouillard
|
||||||
|
|
||||||
sectors.unexplored = [lightgray]Unexplored
|
sectors.unexplored = [lightgray] Inexploré
|
||||||
sectors.resources = Resources:
|
sectors.resources = Resources:
|
||||||
sectors.production = Production:
|
sectors.production = Production:
|
||||||
sectors.stored = Stored:
|
sectors.stored = Stored:
|
||||||
@@ -523,10 +523,10 @@ sectors.launch = Launch
|
|||||||
sectors.select = Select
|
sectors.select = Select
|
||||||
sectors.nonelaunch = [lightgray]none (sun)
|
sectors.nonelaunch = [lightgray]none (sun)
|
||||||
sectors.rename = Rename Sector
|
sectors.rename = Rename Sector
|
||||||
sector.missingresources = [scarlet]Insufficient Core Resources
|
sector.missingresources = [scarlet]Ressources du noyau insuffisantes
|
||||||
|
|
||||||
planet.serpulo.name = Serpulo
|
planet.serpulo.name = Serpulo
|
||||||
planet.sun.name = Sun
|
planet.sun.name = Soleil
|
||||||
|
|
||||||
sector.groundZero.name = Ground Zero
|
sector.groundZero.name = Ground Zero
|
||||||
sector.craters.name = The Craters
|
sector.craters.name = The Craters
|
||||||
@@ -552,8 +552,8 @@ sector.desolateRift.description = An extremely dangerous zone. Plentiful resourc
|
|||||||
sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers.
|
sector.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers.
|
||||||
sector.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
sector.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores.
|
||||||
|
|
||||||
settings.language = Langage
|
settings.language = Langue
|
||||||
settings.data = Game Data
|
settings.data = Données du jeu
|
||||||
settings.reset = Valeur par défaut.
|
settings.reset = Valeur par défaut.
|
||||||
settings.rebind = Réatttribuer
|
settings.rebind = Réatttribuer
|
||||||
settings.resetKey = Reset
|
settings.resetKey = Reset
|
||||||
@@ -927,7 +927,7 @@ unit.fortress.name = Forteresse
|
|||||||
unit.nova.name = Nova
|
unit.nova.name = Nova
|
||||||
unit.pulsar.name = Pulsar
|
unit.pulsar.name = Pulsar
|
||||||
unit.quasar.name = Quasar
|
unit.quasar.name = Quasar
|
||||||
unit.crawler.name = Chenille
|
unit.crawler.name = Rampeur
|
||||||
unit.atrax.name = Atrax
|
unit.atrax.name = Atrax
|
||||||
unit.spiroct.name = Spiroct
|
unit.spiroct.name = Spiroct
|
||||||
unit.arkyid.name = Arkyid
|
unit.arkyid.name = Arkyid
|
||||||
@@ -955,18 +955,18 @@ unit.reign.name = Reign
|
|||||||
unit.vela.name = Vela
|
unit.vela.name = Vela
|
||||||
unit.corvus.name = Corvus
|
unit.corvus.name = Corvus
|
||||||
|
|
||||||
block.resupply-point.name = Resupply Point
|
block.resupply-point.name = Point de rechargement
|
||||||
block.parallax.name = Parallax
|
block.parallax.name = Parallax
|
||||||
block.cliff.name = Cliff
|
block.cliff.name = Falaise
|
||||||
block.sand-boulder.name = Sable rocheux
|
block.sand-boulder.name = Sable rocheux
|
||||||
block.grass.name = Herbe
|
block.grass.name = Herbe
|
||||||
block.slag.name = Slag
|
block.slag.name = Scories
|
||||||
block.space.name = Space
|
block.space.name = Space
|
||||||
block.salt.name = Sel
|
block.salt.name = Sel
|
||||||
block.salt-wall.name = Salt Wall
|
block.salt-wall.name = Mur de sel
|
||||||
block.pebbles.name = Cailloux
|
block.pebbles.name = Cailloux
|
||||||
block.tendrils.name = Vrilles
|
block.tendrils.name = Vrilles
|
||||||
block.sand-wall.name = Sand Wall
|
block.sand-wall.name = Mur de sable
|
||||||
block.spore-pine.name = Pin sporifère
|
block.spore-pine.name = Pin sporifère
|
||||||
block.spore-wall.name = Spore Wall
|
block.spore-wall.name = Spore Wall
|
||||||
block.boulder.name = Boulder
|
block.boulder.name = Boulder
|
||||||
@@ -983,11 +983,11 @@ block.scrap-wall-large.name = Grand mur de ferraille
|
|||||||
block.scrap-wall-huge.name = Enorme mur de ferraille
|
block.scrap-wall-huge.name = Enorme mur de ferraille
|
||||||
block.scrap-wall-gigantic.name = Gigantesque mur de ferraille
|
block.scrap-wall-gigantic.name = Gigantesque mur de ferraille
|
||||||
block.thruster.name = Propulseur
|
block.thruster.name = Propulseur
|
||||||
block.kiln.name = Four a métaverre
|
block.kiln.name = Four
|
||||||
block.graphite-press.name = Presse à graphite
|
block.graphite-press.name = Presse à graphite
|
||||||
block.multi-press.name = Multi-Presse
|
block.multi-press.name = Multi-Presse
|
||||||
block.constructing = {0}\n[lightgray](En construction)
|
block.constructing = {0}\n[lightgray](En construction)
|
||||||
block.spawn.name = Générateur d'ennemi
|
block.spawn.name = Générateur d'ennemis
|
||||||
block.core-shard.name = Core: Shard
|
block.core-shard.name = Core: Shard
|
||||||
block.core-foundation.name = Core: Fondation
|
block.core-foundation.name = Core: Fondation
|
||||||
block.core-nucleus.name = Core: Nucleus
|
block.core-nucleus.name = Core: Nucleus
|
||||||
@@ -1048,20 +1048,20 @@ block.thorium-wall-large.name = Grand mur en thorium
|
|||||||
block.door.name = Porte
|
block.door.name = Porte
|
||||||
block.door-large.name = Grande porte
|
block.door-large.name = Grande porte
|
||||||
block.duo.name = Duo
|
block.duo.name = Duo
|
||||||
block.scorch.name = Scorch
|
block.scorch.name = Brûleur
|
||||||
block.scatter.name = Scatter
|
block.scatter.name = Disperseur
|
||||||
block.hail.name = Hail
|
block.hail.name = Grêle
|
||||||
block.lancer.name = Lancer
|
block.lancer.name = Lancier
|
||||||
block.conveyor.name = Transporteur
|
block.conveyor.name = Convoyeur
|
||||||
block.titanium-conveyor.name = Transporteur en titane
|
block.titanium-conveyor.name = Convoyeur en titane
|
||||||
block.plastanium-conveyor.name = Plastanium Conveyor
|
block.plastanium-conveyor.name = Convoyeur en plastanium
|
||||||
block.armored-conveyor.name = Armored Conveyor
|
block.armored-conveyor.name = Convoyeur cuirassé
|
||||||
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
||||||
block.junction.name = Junction
|
block.junction.name = Jonction
|
||||||
block.router.name = Routeur
|
block.router.name = Routeur
|
||||||
block.distributor.name = [accent]Distributeur[]
|
block.distributor.name = [accent]Distributeur[]
|
||||||
block.sorter.name = Trieur
|
block.sorter.name = Trieur
|
||||||
block.inverted-sorter.name = Inverted Sorter
|
block.inverted-sorter.name = Trieur inversé
|
||||||
block.message.name = Message
|
block.message.name = Message
|
||||||
block.illuminator.name = Illuminator
|
block.illuminator.name = Illuminator
|
||||||
block.illuminator.description = A small, compact, configurable light source. Requires power to function.
|
block.illuminator.description = A small, compact, configurable light source. Requires power to function.
|
||||||
@@ -1073,30 +1073,30 @@ block.pulverizer.name = Pulvérisateur
|
|||||||
block.cryofluid-mixer.name = Refroidisseur
|
block.cryofluid-mixer.name = Refroidisseur
|
||||||
block.melter.name = Four à Fusion
|
block.melter.name = Four à Fusion
|
||||||
block.incinerator.name = Incinérateur
|
block.incinerator.name = Incinérateur
|
||||||
block.spore-press.name = Spore presse
|
block.spore-press.name = Presse à spores
|
||||||
block.separator.name = Séparateur
|
block.separator.name = Séparateur
|
||||||
block.coal-centrifuge.name = Centrifugeuse à charbon
|
block.coal-centrifuge.name = Centrifugeuse à charbon
|
||||||
block.power-node.name = Transmetteur énergétique
|
block.power-node.name = Transmetteur énergétique
|
||||||
block.power-node-large.name = Grand transmetteur énergétique
|
block.power-node-large.name = Grand transmetteur énergétique
|
||||||
block.surge-tower.name = Tour de surtension
|
block.surge-tower.name = Tour de surtension
|
||||||
block.diode.name = Battery Diode
|
block.diode.name = Diode de batterie
|
||||||
block.battery.name = Batterie
|
block.battery.name = Batterie
|
||||||
block.battery-large.name = Batterie large
|
block.battery-large.name = Grande batterie
|
||||||
block.combustion-generator.name = Générateur à combustion
|
block.combustion-generator.name = Générateur à combustion
|
||||||
block.steam-generator.name = Générateur à turbine
|
block.steam-generator.name = Générateur à turbine
|
||||||
block.differential-generator.name = Générateur différentiel
|
block.differential-generator.name = Générateur différentiel
|
||||||
block.impact-reactor.name = Réacteur à impact
|
block.impact-reactor.name = Réacteur à impact
|
||||||
block.mechanical-drill.name = Foreuse mécanique
|
block.mechanical-drill.name = Foreuse mécanique
|
||||||
block.pneumatic-drill.name = Foreuse à vérin
|
block.pneumatic-drill.name = Foreuse à vérins
|
||||||
block.laser-drill.name = Foreuse Laser
|
block.laser-drill.name = Foreuse Laser
|
||||||
block.water-extractor.name = Extracteur d'eau
|
block.water-extractor.name = Extracteur d'eau
|
||||||
block.cultivator.name = Cultivateur
|
block.cultivator.name = Cultivateur
|
||||||
block.conduit.name = Conduit
|
block.conduit.name = Conduit
|
||||||
block.mechanical-pump.name = Pompe Méchanique
|
block.mechanical-pump.name = Pompe Mécanique
|
||||||
block.item-source.name = Source d'objets
|
block.item-source.name = Source d'objets
|
||||||
block.item-void.name = Destructeur d'objets
|
block.item-void.name = Destructeur d'objets
|
||||||
block.liquid-source.name = Source de liquide
|
block.liquid-source.name = Source de liquide
|
||||||
block.liquid-void.name = Liquid Void
|
block.liquid-void.name = Vaporisateur
|
||||||
block.power-void.name = Absorbeur énergétique
|
block.power-void.name = Absorbeur énergétique
|
||||||
block.power-source.name = Puissance infinie
|
block.power-source.name = Puissance infinie
|
||||||
block.unloader.name = Déchargeur
|
block.unloader.name = Déchargeur
|
||||||
@@ -1105,15 +1105,15 @@ block.wave.name = Vague
|
|||||||
block.tsunami.name = Tsunami
|
block.tsunami.name = Tsunami
|
||||||
block.swarmer.name = Essaim
|
block.swarmer.name = Essaim
|
||||||
block.salvo.name = Salve
|
block.salvo.name = Salve
|
||||||
block.ripple.name = Ripple
|
block.ripple.name = Percussion
|
||||||
block.phase-conveyor.name = Transporteur phasé
|
block.phase-conveyor.name = Convoyeur phasé
|
||||||
block.bridge-conveyor.name = Pont transporteur
|
block.bridge-conveyor.name = Pont
|
||||||
block.plastanium-compressor.name = Compresseur de plastanium
|
block.plastanium-compressor.name = Compresseur de plastanium
|
||||||
block.pyratite-mixer.name = Mixeur à pyratite
|
block.pyratite-mixer.name = Mixeur à pyratite
|
||||||
block.blast-mixer.name = Mixeur à explosion
|
block.blast-mixer.name = Mixeur à explosion
|
||||||
block.solar-panel.name = Panneau solaire
|
block.solar-panel.name = Panneau solaire
|
||||||
block.solar-panel-large.name = Grand panneau solaire
|
block.solar-panel-large.name = Grand panneau solaire
|
||||||
block.oil-extractor.name = Extracteur de pétrol
|
block.oil-extractor.name = Extracteur de pétrole
|
||||||
block.repair-point.name = Point de Réparation
|
block.repair-point.name = Point de Réparation
|
||||||
block.pulse-conduit.name = Conduit à Impulsion
|
block.pulse-conduit.name = Conduit à Impulsion
|
||||||
block.plated-conduit.name = Plated Conduit
|
block.plated-conduit.name = Plated Conduit
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ link.dev-builds.description = Niestabilne wersje gry
|
|||||||
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
|
link.trello.description = Oficjalna tablica Trello z planowanym funkcjami
|
||||||
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania
|
||||||
link.google-play.description = Strona w sklepie Google Play
|
link.google-play.description = Strona w sklepie Google Play
|
||||||
link.f-droid.description = F-Droid catalogue listing
|
link.f-droid.description = Wykaz Katalogu F-Droid
|
||||||
link.wiki.description = Oficjana Wiki Mindustry
|
link.wiki.description = Oficjana Wiki Mindustry
|
||||||
link.suggestions.description = Zaproponuj nowe funkcje
|
link.suggestions.description = Zaproponuj nowe funkcje
|
||||||
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
|
linkfail = Nie udało się otworzyć linku!\nURL został skopiowany.
|
||||||
@@ -112,12 +112,12 @@ mod.display = [gray]Mod:[orange] {0}
|
|||||||
mod.enabled = [lightgray]Włączony
|
mod.enabled = [lightgray]Włączony
|
||||||
mod.disabled = [scarlet]Wyłączony
|
mod.disabled = [scarlet]Wyłączony
|
||||||
mod.disable = Wyłącz
|
mod.disable = Wyłącz
|
||||||
mod.content = Content:
|
mod.content = Zawartość:
|
||||||
mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu.
|
mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu.
|
||||||
mod.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0}
|
mod.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0}
|
||||||
mod.outdated = [scarlet]Niekompatybilne z wersją v6 (no minGameVersion: 105)
|
mod.outdated = [scarlet]Niekompatybilne z wersją v6 (no minGameVersion: 105)
|
||||||
mod.missingdependencies = [scarlet]Brakujące zależności: {0}
|
mod.missingdependencies = [scarlet]Brakujące zależności: {0}
|
||||||
mod.erroredcontent = [scarlet]Content Errors
|
mod.erroredcontent = [scarlet]Błędy Zawartości
|
||||||
mod.errors = Wystąpił błąd podczas ładowania treści.
|
mod.errors = Wystąpił błąd podczas ładowania treści.
|
||||||
mod.noerrorplay = [scarlet]Twoje mody zawierają błędy.[] Wyłącz je lub napraw błędy przed rozpoczęciem gry.
|
mod.noerrorplay = [scarlet]Twoje mody zawierają błędy.[] Wyłącz je lub napraw błędy przed rozpoczęciem gry.
|
||||||
mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony.
|
mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony.
|
||||||
@@ -139,8 +139,8 @@ mod.scripts.disable = Twoje urządzenie nie wspiera modów ze skryptami. Musisz
|
|||||||
about.button = O Grze
|
about.button = O Grze
|
||||||
name = Nazwa:
|
name = Nazwa:
|
||||||
noname = Najpierw wybierz[accent] nazwę gracza[].
|
noname = Najpierw wybierz[accent] nazwę gracza[].
|
||||||
planetmap = Planet Map
|
planetmap = Mapa Planety
|
||||||
launchcore = Launch Core
|
launchcore = Wystrzel Rdzeń
|
||||||
filename = Nazwa Pliku:
|
filename = Nazwa Pliku:
|
||||||
unlocked = Odblokowano nową zawartość!
|
unlocked = Odblokowano nową zawartość!
|
||||||
completed = [accent]Ukończony
|
completed = [accent]Ukończony
|
||||||
@@ -284,15 +284,15 @@ selectschematic = [accent][[{0}][] by wybrać+skopiować
|
|||||||
pausebuilding = [accent][[{0}][] by wstrzymać budowę
|
pausebuilding = [accent][[{0}][] by wstrzymać budowę
|
||||||
resumebuilding = [scarlet][[{0}][] by kontynuować budowę
|
resumebuilding = [scarlet][[{0}][] by kontynuować budowę
|
||||||
wave = [accent]Fala {0}
|
wave = [accent]Fala {0}
|
||||||
wave.cap = [accent]Wave {0}/{1}
|
wave.cap = [accent]Fala {0}/{1}
|
||||||
wave.waiting = [lightgray]Fala za {0}
|
wave.waiting = [lightgray]Fala za {0}
|
||||||
wave.waveInProgress = [lightgray]Fala w trakcie
|
wave.waveInProgress = [lightgray]Fala w trakcie
|
||||||
waiting = [lightgray]Oczekiwanie...
|
waiting = [lightgray]Oczekiwanie...
|
||||||
waiting.players = Oczekiwanie na graczy...
|
waiting.players = Oczekiwanie na graczy...
|
||||||
wave.enemies = Pozostało [lightgray]{0} wrogów
|
wave.enemies = Pozostało [lightgray]{0} wrogów
|
||||||
wave.enemy = Pozostał [lightgray]{0} wróg
|
wave.enemy = Pozostał [lightgray]{0} wróg
|
||||||
wave.guardianwarn = Guardian approaching in [accent]{0}[] waves.
|
wave.guardianwarn = Strażnik nadejdzie za [accent]{0}[] fale.
|
||||||
wave.guardianwarn.one = Guardian approaching in [accent]{0}[] wave.
|
wave.guardianwarn.one = Strażnik nadejdzie za [accent]{0}[] fale.
|
||||||
loadimage = Załaduj Obraz
|
loadimage = Załaduj Obraz
|
||||||
saveimage = Zapisz Obraz
|
saveimage = Zapisz Obraz
|
||||||
unknown = Nieznane
|
unknown = Nieznane
|
||||||
@@ -339,9 +339,9 @@ waves.never = <nigdy>
|
|||||||
waves.every = co
|
waves.every = co
|
||||||
waves.waves = fal(e)
|
waves.waves = fal(e)
|
||||||
waves.perspawn = co pojawienie
|
waves.perspawn = co pojawienie
|
||||||
waves.shields = shields/wave
|
waves.shields = tarcze/fala
|
||||||
waves.to = do
|
waves.to = do
|
||||||
waves.guardian = Guardian
|
waves.guardian = Strażnik
|
||||||
waves.preview = Podgląd
|
waves.preview = Podgląd
|
||||||
waves.edit = Edytuj...
|
waves.edit = Edytuj...
|
||||||
waves.copy = Kopiuj Do Schowka
|
waves.copy = Kopiuj Do Schowka
|
||||||
@@ -350,9 +350,9 @@ waves.invalid = Nieprawidłowe fale w schowku.
|
|||||||
waves.copied = Fale zostały skopiowane.
|
waves.copied = Fale zostały skopiowane.
|
||||||
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym.
|
||||||
|
|
||||||
wavemode.counts = counts
|
wavemode.counts = liczba
|
||||||
wavemode.totals = totals
|
wavemode.totals = sumy
|
||||||
wavemode.health = health
|
wavemode.health = życie
|
||||||
|
|
||||||
editor.default = [lightgray]<Domyślne>
|
editor.default = [lightgray]<Domyślne>
|
||||||
details = Detale...
|
details = Detale...
|
||||||
@@ -420,7 +420,7 @@ filters.empty = [lightgray]Brak filtrów! Dodaj jeden za pomocą przycisku poni
|
|||||||
filter.distort = Zniekształcanie
|
filter.distort = Zniekształcanie
|
||||||
filter.noise = Szum
|
filter.noise = Szum
|
||||||
filter.enemyspawn = Wybierz spawn przeciwnika
|
filter.enemyspawn = Wybierz spawn przeciwnika
|
||||||
filter.spawnpath = Path To Spawn
|
filter.spawnpath = Droga Do Spawnu
|
||||||
filter.corespawn = Wybierz rdzeń
|
filter.corespawn = Wybierz rdzeń
|
||||||
filter.median = Mediana
|
filter.median = Mediana
|
||||||
filter.oremedian = Mediana Rud
|
filter.oremedian = Mediana Rud
|
||||||
@@ -479,7 +479,7 @@ requirement.research = Zbadaj {0}
|
|||||||
requirement.capture = Zdobądź {0}
|
requirement.capture = Zdobądź {0}
|
||||||
bestwave = [lightgray]Najwyższa fala: {0}
|
bestwave = [lightgray]Najwyższa fala: {0}
|
||||||
launch.text = Wystrzel
|
launch.text = Wystrzel
|
||||||
research.multiplayer = Only the host can research items.
|
research.multiplayer = Tylko host może odkrywać przedmoty.
|
||||||
uncover = Odkryj
|
uncover = Odkryj
|
||||||
configure = Skonfiguruj Ładunek
|
configure = Skonfiguruj Ładunek
|
||||||
loadout = Loadout
|
loadout = Loadout
|
||||||
@@ -512,17 +512,17 @@ weather.rain.name = Deszcz
|
|||||||
weather.snow.name = Śnieg
|
weather.snow.name = Śnieg
|
||||||
weather.sandstorm.name = Burza piaskowa
|
weather.sandstorm.name = Burza piaskowa
|
||||||
weather.sporestorm.name = Burza zarodników
|
weather.sporestorm.name = Burza zarodników
|
||||||
weather.fog.name = Fog
|
weather.fog.name = Mgła
|
||||||
|
|
||||||
sectors.unexplored = [lightgray]Niezbadane
|
sectors.unexplored = [lightgray]Niezbadane
|
||||||
sectors.resources = Resources:
|
sectors.resources = Zasoby:
|
||||||
sectors.production = Production:
|
sectors.production = Produkcja:
|
||||||
sectors.stored = Stored:
|
sectors.stored = Zmagazynowane:
|
||||||
sectors.resume = Resume
|
sectors.resume = Kontynuuj
|
||||||
sectors.launch = Launch
|
sectors.launch = Wystrzel
|
||||||
sectors.select = Select
|
sectors.select = Wybierz
|
||||||
sectors.nonelaunch = [lightgray]none (sun)
|
sectors.nonelaunch = [lightgray]żaden (słońce)
|
||||||
sectors.rename = Rename Sector
|
sectors.rename = Zmień Nazwę Sektora
|
||||||
sector.missingresources = [scarlet]Insufficient Core Resources
|
sector.missingresources = [scarlet]Insufficient Core Resources
|
||||||
|
|
||||||
planet.serpulo.name = Serpulo
|
planet.serpulo.name = Serpulo
|
||||||
@@ -564,12 +564,12 @@ settings.graphics = Grafika
|
|||||||
settings.cleardata = Wyczyść Dane Gry...
|
settings.cleardata = Wyczyść Dane Gry...
|
||||||
settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu!
|
settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu!
|
||||||
settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się.
|
settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się.
|
||||||
settings.clearsaves.confirm = Are you sure you want to clear all your saves?
|
settings.clearsaves.confirm = Jesteś pewny że chcesz usunąć wszystkie zapisy?
|
||||||
settings.clearsaves = Clear Saves
|
settings.clearsaves = Usuń Zapisy
|
||||||
settings.clearresearch = Clear Research
|
settings.clearresearch = Usuń Postęp Drzewa Tech.
|
||||||
settings.clearresearch.confirm = Are you sure you want to clear all of your campaign research?
|
settings.clearresearch.confirm = Jesteś pewny że chcesz usunąć cały postęp drzewa technologicznego?
|
||||||
settings.clearcampaignsaves = Clear Campaign Saves
|
settings.clearcampaignsaves = Usuń Zapisy Kampanii
|
||||||
settings.clearcampaignsaves.confirm = Are you sure you want to clear all of your campaign saves?
|
settings.clearcampaignsaves.confirm = Jesteś pewny że chcesz usunąć wszystkie zapisy kampanii?
|
||||||
paused = [accent]< Wstrzymano >
|
paused = [accent]< Wstrzymano >
|
||||||
clear = Wyczyść
|
clear = Wyczyść
|
||||||
banned = [scarlet]Zbanowano
|
banned = [scarlet]Zbanowano
|
||||||
@@ -597,16 +597,16 @@ stat.itemsmoved = Prędkość poruszania się
|
|||||||
stat.launchtime = Czas pomiędzy wystrzeleniami
|
stat.launchtime = Czas pomiędzy wystrzeleniami
|
||||||
stat.shootrange = Zasięg
|
stat.shootrange = Zasięg
|
||||||
stat.size = Rozmiar
|
stat.size = Rozmiar
|
||||||
stat.displaysize = Display Size
|
stat.displaysize = Wielkość Wyświetlania
|
||||||
stat.liquidcapacity = Pojemność cieczy
|
stat.liquidcapacity = Pojemność cieczy
|
||||||
stat.powerrange = Zakres mocy
|
stat.powerrange = Zakres mocy
|
||||||
stat.linkrange = Link Range
|
stat.linkrange = Link Range
|
||||||
stat.instructions = Instructions
|
stat.instructions = Instrukcje
|
||||||
stat.powerconnections = Maksymalna ilość połączeń
|
stat.powerconnections = Maksymalna ilość połączeń
|
||||||
stat.poweruse = Zużycie prądu
|
stat.poweruse = Zużycie prądu
|
||||||
stat.powerdamage = Moc/Zniszczenia
|
stat.powerdamage = Moc/Zniszczenia
|
||||||
stat.itemcapacity = Pojemność przedmiotów
|
stat.itemcapacity = Pojemność przedmiotów
|
||||||
stat.memorycapacity = Memory Capacity
|
stat.memorycapacity = Pojemość Pamięci
|
||||||
stat.basepowergeneration = Podstawowa generacja mocy
|
stat.basepowergeneration = Podstawowa generacja mocy
|
||||||
stat.productiontime = Czas produkcji
|
stat.productiontime = Czas produkcji
|
||||||
stat.repairtime = Czas pełnej naprawy bloku
|
stat.repairtime = Czas pełnej naprawy bloku
|
||||||
@@ -618,36 +618,36 @@ stat.boosteffect = Efekt wzmocnienia
|
|||||||
stat.maxunits = Maksymalna ilość jednostek
|
stat.maxunits = Maksymalna ilość jednostek
|
||||||
stat.health = Zdrowie
|
stat.health = Zdrowie
|
||||||
stat.buildtime = Czas budowy
|
stat.buildtime = Czas budowy
|
||||||
stat.maxconsecutive = Max Consecutive
|
stat.maxconsecutive = Maksymalnie Kolejny
|
||||||
stat.buildcost = Koszt budowy
|
stat.buildcost = Koszt budowy
|
||||||
stat.inaccuracy = Niecelność
|
stat.inaccuracy = Niecelność
|
||||||
stat.shots = Strzały
|
stat.shots = Strzały
|
||||||
stat.reload = Strzałów/sekundę
|
stat.reload = Strzałów/Sekundę
|
||||||
stat.ammo = Amunicja
|
stat.ammo = Amunicja
|
||||||
stat.shieldhealth = Shield Health
|
stat.shieldhealth = Życie Tarczy
|
||||||
stat.cooldowntime = Cooldown Time
|
stat.cooldowntime = Czas Odnowienia
|
||||||
stat.explosiveness = Explosiveness
|
stat.explosiveness = Wybuchowość
|
||||||
stat.basedeflectchance = Base Deflect Chance
|
stat.basedeflectchance = Bazowa Szansa Na Odbicie
|
||||||
stat.lightningchance = Lightning Chance
|
stat.lightningchance = Szansa Na Błyskawicę
|
||||||
stat.lightningdamage = Lightning Damage
|
stat.lightningdamage = Obrażenia Błyskawic
|
||||||
stat.flammability = Flammability
|
stat.flammability = Palność
|
||||||
stat.radioactivity = Radioactivity
|
stat.radioactivity = Radioaktywność
|
||||||
stat.heatcapacity = HeatCapacity
|
stat.heatcapacity = Pojemność Cieplna
|
||||||
stat.viscosity = Viscosity
|
stat.viscosity = Lepkość
|
||||||
stat.temperature = Temperature
|
stat.temperature = Temperatura
|
||||||
stat.speed = Speed
|
stat.speed = Prędość
|
||||||
stat.buildspeed = Build Speed
|
stat.buildspeed = Prędkość Budowy
|
||||||
stat.minespeed = Mine Speed
|
stat.minespeed = Prędkość Wydobycia
|
||||||
stat.minetier = Mine Tier
|
stat.minetier = Stopień Wydobycia
|
||||||
stat.payloadcapacity = Payload Capacity
|
stat.payloadcapacity = Ładowność
|
||||||
stat.commandlimit = Command Limit
|
stat.commandlimit = Limit Jednostek Zarządanych
|
||||||
stat.abilities = Abilities
|
stat.abilities = Umiejętności
|
||||||
|
|
||||||
ability.forcefield = Force Field
|
ability.forcefield = Pole Mocy
|
||||||
ability.repairfield = Repair Field
|
ability.repairfield = Pole Naprawy
|
||||||
ability.statusfield = Status Field
|
ability.statusfield = Pole Statusu
|
||||||
ability.unitspawn = {0} Factory
|
ability.unitspawn = {0} Fabryka
|
||||||
ability.shieldregenfield = Shield Regen Field
|
ability.shieldregenfield = Strefa Tarczy Regenerującej
|
||||||
|
|
||||||
bar.drilltierreq = Wymagane Lepsze Wiertło
|
bar.drilltierreq = Wymagane Lepsze Wiertło
|
||||||
bar.noresources = Missing Resources
|
bar.noresources = Missing Resources
|
||||||
@@ -671,7 +671,7 @@ bar.progress = Postęp Budowy
|
|||||||
bar.input = Wejście
|
bar.input = Wejście
|
||||||
bar.output = Wyjście
|
bar.output = Wyjście
|
||||||
|
|
||||||
units.processorcontrol = [lightgray]Processor Controlled
|
units.processorcontrol = [lightgray]Procesor Kontrolowany
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
bullet.damage = [stat]{0}[lightgray] Obrażenia
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
bullet.splashdamage = [stat]{0}[lightgray] Obrażenia obszarowe ~[stat] {1}[lightgray] kratki
|
||||||
@@ -680,15 +680,15 @@ bullet.homing = [stat]naprowadzający
|
|||||||
bullet.shock = [stat]piorunowy
|
bullet.shock = [stat]piorunowy
|
||||||
bullet.frag = [stat]fragmentacyjny
|
bullet.frag = [stat]fragmentacyjny
|
||||||
bullet.knockback = [stat]{0}[lightgray] odrzut
|
bullet.knockback = [stat]{0}[lightgray] odrzut
|
||||||
bullet.pierce = [stat]{0}[lightgray]x pierce
|
bullet.pierce = [stat]{0}[lightgray]x przebicia
|
||||||
bullet.infinitepierce = [stat]pierce
|
bullet.infinitepierce = [stat]przebijający
|
||||||
bullet.freezing = [stat]zamrażający
|
bullet.freezing = [stat]zamrażający
|
||||||
bullet.tarred = [stat]smolny
|
bullet.tarred = [stat]smolny
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
bullet.multiplier = [stat]{0}[lightgray]x mnożnik amunicji
|
||||||
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
bullet.reload = [stat]{0}[lightgray]x szybkość ataku
|
||||||
|
|
||||||
unit.blocks = bloki
|
unit.blocks = bloki
|
||||||
unit.blockssquared = blocks²
|
unit.blockssquared = bloki²
|
||||||
unit.powersecond = jednostek prądu na sekundę
|
unit.powersecond = jednostek prądu na sekundę
|
||||||
unit.liquidsecond = jednostek płynu na sekundę
|
unit.liquidsecond = jednostek płynu na sekundę
|
||||||
unit.itemssecond = przedmiotów na sekundę
|
unit.itemssecond = przedmiotów na sekundę
|
||||||
@@ -701,7 +701,7 @@ unit.persecond = /sekundę
|
|||||||
unit.perminute = /min
|
unit.perminute = /min
|
||||||
unit.timesspeed = x prędkość
|
unit.timesspeed = x prędkość
|
||||||
unit.percent = %
|
unit.percent = %
|
||||||
unit.shieldhealth = shield health
|
unit.shieldhealth = życie tarczy
|
||||||
unit.items = przedmioty
|
unit.items = przedmioty
|
||||||
unit.thousands = tys.
|
unit.thousands = tys.
|
||||||
unit.millions = mln
|
unit.millions = mln
|
||||||
@@ -711,7 +711,7 @@ category.power = Prąd
|
|||||||
category.liquids = Płyny
|
category.liquids = Płyny
|
||||||
category.items = Przedmioty
|
category.items = Przedmioty
|
||||||
category.crafting = Przetwórstwo
|
category.crafting = Przetwórstwo
|
||||||
category.function = Function
|
category.function = Funkcja
|
||||||
category.optional = Dodatkowe ulepszenia
|
category.optional = Dodatkowe ulepszenia
|
||||||
setting.landscape.name = Zablokuj tryb panoramiczny
|
setting.landscape.name = Zablokuj tryb panoramiczny
|
||||||
setting.shadows.name = Cienie
|
setting.shadows.name = Cienie
|
||||||
@@ -747,19 +747,19 @@ setting.conveyorpathfinding.name = Ustalanie ścieżki przenośników
|
|||||||
setting.sensitivity.name = Czułość kontrolera
|
setting.sensitivity.name = Czułość kontrolera
|
||||||
setting.saveinterval.name = Interwał automatycznego zapisywania
|
setting.saveinterval.name = Interwał automatycznego zapisywania
|
||||||
setting.seconds = {0} sekund
|
setting.seconds = {0} sekund
|
||||||
setting.blockselecttimeout.name = Block Select Timeout
|
setting.blockselecttimeout.name = Czas Wyboru Klocka
|
||||||
setting.milliseconds = {0} milisekund
|
setting.milliseconds = {0} milisekund
|
||||||
setting.fullscreen.name = Pełny ekran
|
setting.fullscreen.name = Pełny ekran
|
||||||
setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu)
|
setting.borderlesswindow.name = Bezramkowe okno[lightgray] (może wymagać restartu)
|
||||||
setting.fps.name = Pokazuj FPS oraz ping
|
setting.fps.name = Pokazuj FPS oraz ping
|
||||||
setting.smoothcamera.name = Smooth Camera
|
setting.smoothcamera.name = Gładka Kamera
|
||||||
setting.vsync.name = Synchronizacja pionowa
|
setting.vsync.name = Synchronizacja pionowa
|
||||||
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
|
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
|
||||||
setting.minimap.name = Pokaż Minimapę
|
setting.minimap.name = Pokaż Minimapę
|
||||||
setting.coreitems.name = Display Core Items (WIP)
|
setting.coreitems.name = Poazuj Przedmoty W Rdzeniu (WIP)
|
||||||
setting.position.name = Pokazuj położenie gracza
|
setting.position.name = Pokazuj położenie gracza
|
||||||
setting.musicvol.name = Głośność muzyki
|
setting.musicvol.name = Głośność muzyki
|
||||||
setting.atmosphere.name = Show Planet Atmosphere
|
setting.atmosphere.name = Pokazuj atmosferę planety
|
||||||
setting.ambientvol.name = Głośność otoczenia
|
setting.ambientvol.name = Głośność otoczenia
|
||||||
setting.mutemusic.name = Wycisz muzykę
|
setting.mutemusic.name = Wycisz muzykę
|
||||||
setting.sfxvol.name = Głośność dźwięków
|
setting.sfxvol.name = Głośność dźwięków
|
||||||
@@ -782,11 +782,11 @@ keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w
|
|||||||
category.general.name = Ogólne
|
category.general.name = Ogólne
|
||||||
category.view.name = Wyświetl
|
category.view.name = Wyświetl
|
||||||
category.multiplayer.name = Wielu graczy
|
category.multiplayer.name = Wielu graczy
|
||||||
category.blocks.name = Block Select
|
category.blocks.name = Wybierz Blok
|
||||||
command.attack = Atakuj
|
command.attack = Atakuj
|
||||||
command.rally = Zbierz
|
command.rally = Zbierz
|
||||||
command.retreat = Wycofaj
|
command.retreat = Wycofaj
|
||||||
command.idle = Idle
|
command.idle = Nieaktywny
|
||||||
placement.blockselectkeys = \n[lightgray]Klawisz: [{0},
|
placement.blockselectkeys = \n[lightgray]Klawisz: [{0},
|
||||||
keybind.respawn.name = Respawn
|
keybind.respawn.name = Respawn
|
||||||
keybind.control.name = Control Unit
|
keybind.control.name = Control Unit
|
||||||
@@ -795,12 +795,12 @@ keybind.press = Naciśnij wybrany klawisz...
|
|||||||
keybind.press.axis = Naciśnij oś lub klawisz...
|
keybind.press.axis = Naciśnij oś lub klawisz...
|
||||||
keybind.screenshot.name = Zrzut ekranu mapy
|
keybind.screenshot.name = Zrzut ekranu mapy
|
||||||
keybind.toggle_power_lines.name = Zmień widoczność linii energetycznych
|
keybind.toggle_power_lines.name = Zmień widoczność linii energetycznych
|
||||||
keybind.toggle_block_status.name = Toggle Block Statuses
|
keybind.toggle_block_status.name = Przełączanie Między Statusami Bloków
|
||||||
keybind.move_x.name = Poruszanie w poziomie
|
keybind.move_x.name = Poruszanie w poziomie
|
||||||
keybind.move_y.name = Poruszanie w pionie
|
keybind.move_y.name = Poruszanie w pionie
|
||||||
keybind.mouse_move.name = Podążaj Za Myszą
|
keybind.mouse_move.name = Podążaj Za Myszą
|
||||||
keybind.pan.name = Pan View
|
keybind.pan.name = Widok Panoramiczny
|
||||||
keybind.boost.name = Boost
|
keybind.boost.name = Przyspiesz
|
||||||
keybind.schematic_select.name = Wybierz region
|
keybind.schematic_select.name = Wybierz region
|
||||||
keybind.schematic_menu.name = Menu schematów
|
keybind.schematic_menu.name = Menu schematów
|
||||||
keybind.schematic_flip_x.name = Obróć schemat horyzontalnie
|
keybind.schematic_flip_x.name = Obróć schemat horyzontalnie
|
||||||
@@ -827,8 +827,8 @@ keybind.diagonal_placement.name = Budowa po skosie
|
|||||||
keybind.pick.name = Wybierz Blok
|
keybind.pick.name = Wybierz Blok
|
||||||
keybind.break_block.name = Zniszcz Blok
|
keybind.break_block.name = Zniszcz Blok
|
||||||
keybind.deselect.name = Odznacz
|
keybind.deselect.name = Odznacz
|
||||||
keybind.pickupCargo.name = Pickup Cargo
|
keybind.pickupCargo.name = Podnieś Ładunek
|
||||||
keybind.dropCargo.name = Drop Cargo
|
keybind.dropCargo.name = Opuść Ładunek
|
||||||
keybind.command.name = Command
|
keybind.command.name = Command
|
||||||
keybind.shoot.name = Strzelanie
|
keybind.shoot.name = Strzelanie
|
||||||
keybind.zoom.name = Przybliżanie
|
keybind.zoom.name = Przybliżanie
|
||||||
@@ -857,29 +857,29 @@ mode.pvp.name = PvP
|
|||||||
mode.pvp.description = Walcz przeciwko innym graczom.\n[gray]Wymaga co najmniej dwóch rdzeni o róźnych kolorach na mapie, aby móc grać w tym trybie
|
mode.pvp.description = Walcz przeciwko innym graczom.\n[gray]Wymaga co najmniej dwóch rdzeni o róźnych kolorach na mapie, aby móc grać w tym trybie
|
||||||
mode.attack.name = Atak
|
mode.attack.name = Atak
|
||||||
mode.attack.description = Brak fal. Celem jest zniszczenie bazy przeciwnika.\n[gray]Wymaga czerwonego rdzenia na mapie, aby móc grać w tym trybie.
|
mode.attack.description = Brak fal. Celem jest zniszczenie bazy przeciwnika.\n[gray]Wymaga czerwonego rdzenia na mapie, aby móc grać w tym trybie.
|
||||||
mode.custom = Własny tryb
|
mode.custom = Własny Tryb
|
||||||
|
|
||||||
rules.infiniteresources = Nieskończone zasoby
|
rules.infiniteresources = Nieskończone Zasoby
|
||||||
rules.reactorexplosions = Eksplozje reaktorów
|
rules.reactorexplosions = Eksplozje Reaktorów
|
||||||
rules.schematic = Schematics Allowed
|
rules.schematic = Schematy Są Dozwolone
|
||||||
rules.wavetimer = Zegar fal
|
rules.wavetimer = Zegar Fal
|
||||||
rules.waves = Fale
|
rules.waves = Fale
|
||||||
rules.attack = Tryb ataku
|
rules.attack = Tryb Ataku
|
||||||
rules.buildai = AI Building
|
rules.buildai = SI Może Budować
|
||||||
rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu)
|
rules.enemyCheat = Nieskończone Zasoby SI (czerwonego zespołu)
|
||||||
rules.blockhealthmultiplier = Mnożnik życia bloków
|
rules.blockhealthmultiplier = Mnożnik Życia Bloków
|
||||||
rules.blockdamagemultiplier = Block Damage Multiplier
|
rules.blockdamagemultiplier = Mnożnik Uszkodzeń Bloków
|
||||||
rules.unitbuildspeedmultiplier = Mnożnik prędkości tworzenia jednostek
|
rules.unitbuildspeedmultiplier = Mnożnik Prędkości Tworzenia Jednostek
|
||||||
rules.unithealthmultiplier = Mnożnik życia jednostek
|
rules.unithealthmultiplier = Mnożnik Życia Jednostek
|
||||||
rules.unitdamagemultiplier = Mnożnik obrażeń jednostek
|
rules.unitdamagemultiplier = Mnożnik Obrażeń jednostek
|
||||||
rules.enemycorebuildradius = Zasięg blokady budowy przy rdzeniu wroga:[lightgray] (kratki)
|
rules.enemycorebuildradius = Zasięg Blokady Budowy Przy Rdzeniu Wroga:[lightgray] (kratki)
|
||||||
rules.wavespacing = Odstępy między falami:[lightgray] (sek)
|
rules.wavespacing = Odstępy Między Falami:[lightgray] (sek)
|
||||||
rules.buildcostmultiplier = Mnożnik kosztów budowania
|
rules.buildcostmultiplier = Mnożnik Kosztów Budowania
|
||||||
rules.buildspeedmultiplier = Mnożnik prędkości budowania
|
rules.buildspeedmultiplier = Mnożnik Prędkości Budowania
|
||||||
rules.deconstructrefundmultiplier = Mnożnik Zwrotu Dekonstrukcji
|
rules.deconstructrefundmultiplier = Mnożnik Zwrotu Dekonstrukcji
|
||||||
rules.waitForWaveToEnd = Fale czekają na przeciwników
|
rules.waitForWaveToEnd = Fale Czekają Na Przeciwników
|
||||||
rules.dropzoneradius = Zasięg strefy zrzutu:[lightgray] (kratki)
|
rules.dropzoneradius = Zasięg Strefy Zrzutu:[lightgray] (kratki)
|
||||||
rules.unitammo = Units Require Ammo
|
rules.unitammo = Jednostki Potrzebują Amunicji
|
||||||
rules.title.waves = Fale
|
rules.title.waves = Fale
|
||||||
rules.title.resourcesbuilding = Zasoby i Budowanie
|
rules.title.resourcesbuilding = Zasoby i Budowanie
|
||||||
rules.title.enemy = Przeciwnicy
|
rules.title.enemy = Przeciwnicy
|
||||||
@@ -887,13 +887,13 @@ rules.title.unit = Jednostki
|
|||||||
rules.title.experimental = Eksperymentalne
|
rules.title.experimental = Eksperymentalne
|
||||||
rules.title.environment = Environment
|
rules.title.environment = Environment
|
||||||
rules.lighting = Oświetlenie
|
rules.lighting = Oświetlenie
|
||||||
rules.enemyLights = Enemy Lights
|
rules.enemyLights = Wrogowie Emitują Światło
|
||||||
rules.fire = Fire
|
rules.fire = Ogień
|
||||||
rules.explosions = Block/Unit Explosion Damage
|
rules.explosions = Uszkodzenia Wybuchu Klocka/Jednostki
|
||||||
rules.ambientlight = Otaczające Światło
|
rules.ambientlight = Otaczające Światło
|
||||||
rules.weather = Weather
|
rules.weather = Pogoda
|
||||||
rules.weather.frequency = Frequency:
|
rules.weather.frequency = Częstotliwość:
|
||||||
rules.weather.duration = Duration:
|
rules.weather.duration = Czas trwania:
|
||||||
|
|
||||||
content.item.name = Przedmioty
|
content.item.name = Przedmioty
|
||||||
content.liquid.name = Płyny
|
content.liquid.name = Płyny
|
||||||
@@ -955,7 +955,7 @@ unit.reign.name = Reign
|
|||||||
unit.vela.name = Vela
|
unit.vela.name = Vela
|
||||||
unit.corvus.name = Corvus
|
unit.corvus.name = Corvus
|
||||||
|
|
||||||
block.resupply-point.name = Resupply Point
|
block.resupply-point.name = Punkt Uzupełnienia
|
||||||
block.parallax.name = Parallax
|
block.parallax.name = Parallax
|
||||||
block.cliff.name = Klif
|
block.cliff.name = Klif
|
||||||
block.sand-boulder.name = Piaskowy Głaz
|
block.sand-boulder.name = Piaskowy Głaz
|
||||||
@@ -1147,28 +1147,28 @@ block.container.name = Kontener
|
|||||||
block.launch-pad.name = Wyrzutnia
|
block.launch-pad.name = Wyrzutnia
|
||||||
block.launch-pad-large.name = Duża Wyrzutnia
|
block.launch-pad-large.name = Duża Wyrzutnia
|
||||||
block.segment.name = Segment
|
block.segment.name = Segment
|
||||||
block.command-center.name = Command Center
|
block.command-center.name = Centrum Dowodzenia
|
||||||
block.ground-factory.name = Fabryka Naziemna
|
block.ground-factory.name = Fabryka Naziemna
|
||||||
block.air-factory.name = Fabryka Powietrzna
|
block.air-factory.name = Fabryka Powietrzna
|
||||||
block.naval-factory.name = Fabryka Morska
|
block.naval-factory.name = Fabryka Morska
|
||||||
block.additive-reconstructor.name = Rekonstruktor Addytywny
|
block.additive-reconstructor.name = Rekonstruktor Addytywny
|
||||||
block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatywny
|
block.multiplicative-reconstructor.name = Rekonstruktor Multiplikatywny
|
||||||
block.exponential-reconstructor.name = Rekonstruktor Wykładniczy
|
block.exponential-reconstructor.name = Rekonstruktor Wykładniczy
|
||||||
block.tetrative-reconstructor.name = Tetrative Reconstructor
|
block.tetrative-reconstructor.name = Rekonstruktor Tetratywny
|
||||||
block.payload-conveyor.name = Przenośnik Masowy
|
block.payload-conveyor.name = Przenośnik Masowy
|
||||||
block.payload-router.name = Rozdzielacz Ładunku
|
block.payload-router.name = Rozdzielacz Ładunku
|
||||||
block.disassembler.name = Dezasembler
|
block.disassembler.name = Rozkładacz
|
||||||
block.silicon-crucible.name = Silicon Crucible
|
block.silicon-crucible.name = Tygiel Krzemu
|
||||||
block.overdrive-dome.name = Kopuła Pola Overdrive
|
block.overdrive-dome.name = Kopuła Pola Overdrive
|
||||||
|
|
||||||
block.switch.name = Switch
|
block.switch.name = Przełącznik
|
||||||
block.micro-processor.name = Micro Processor
|
block.micro-processor.name = Micro Procesor
|
||||||
block.logic-processor.name = Logic Processor
|
block.logic-processor.name = Logiczny Procesor
|
||||||
block.hyper-processor.name = Hyper Processor
|
block.hyper-processor.name = Hyper Procesor
|
||||||
block.logic-display.name = Logic Display
|
block.logic-display.name = Wyświetlacz Logiczny
|
||||||
block.large-logic-display.name = Large Logic Display
|
block.large-logic-display.name = Duży Wyświetlacz Logiczny
|
||||||
block.memory-cell.name = Memory Cell
|
block.memory-cell.name = Komórka Pamięci
|
||||||
block.memory-bank.name = Memory Bank
|
block.memory-bank.name = Bank Pamięci
|
||||||
|
|
||||||
team.blue.name = niebieski
|
team.blue.name = niebieski
|
||||||
team.crux.name = czerwony
|
team.crux.name = czerwony
|
||||||
@@ -1219,7 +1219,7 @@ item.pyratite.description = Niesamowicie palny związek używany w zbrojeniu. Ni
|
|||||||
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
liquid.water.description = Powszechnie używana do schładzania budowli i przetwarzania odpadów.
|
||||||
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń.
|
liquid.slag.description = Wiele różnych metali stopionych i zmieszanych razem. Może zostać rozdzielony na jego metale składowe, albo wystrzelony w wrogie jednostki i użyty jako broń.
|
||||||
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke.
|
liquid.oil.description = Używany w do produkcji złożonych materiałów. Może zostać przetworzony na węgiel, lub wystrzelony w wrogów przez wieżyczke.
|
||||||
liquid.cryofluid.description = Obojętna, niekorozyjna ciecz utworzona z wody i tytanu
|
liquid.cryofluid.description = Obojętna, niekorozyjna ciecz utworzona z wody i tytanu.
|
||||||
|
|
||||||
block.message.description = Przechowuje wiadomość. Wykorzystywane do komunikacji pomiędzy sojusznikami.
|
block.message.description = Przechowuje wiadomość. Wykorzystywane do komunikacji pomiędzy sojusznikami.
|
||||||
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
block.graphite-press.description = Kompresuje kawałki węgla w czyste blaszki grafitu.
|
||||||
@@ -1278,7 +1278,7 @@ block.underflow-gate.description = Odwrotność bramy przepełnieniowej, który
|
|||||||
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
|
block.mass-driver.description = Najlepszy blok do transportu przedmiotów. Zbiera wiele przedmiotów naraz a potem wystrzeliwuje je do kolejnej katapulty masy na bardzo duże odległości.
|
||||||
block.mechanical-pump.description = Tania pompa o niskiej wydajności. Nie wymaga prądu.
|
block.mechanical-pump.description = Tania pompa o niskiej wydajności. Nie wymaga prądu.
|
||||||
block.rotary-pump.description = Zaawansowana pompa. Pompuje więcej cieczy, ale wymaga zasilania.
|
block.rotary-pump.description = Zaawansowana pompa. Pompuje więcej cieczy, ale wymaga zasilania.
|
||||||
block.thermal-pump.description = Najlepsza pompa.
|
block.thermal-pump.description = Najlepsza pompa. Pompuje ogromne ilości cieczy, ale wymaga zasilaina.
|
||||||
block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami.
|
block.conduit.description = Podstawowy blok do transportowania cieczy. Używany w połączeniu z pompami i innymi rurami.
|
||||||
block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury.
|
block.pulse-conduit.description = Zaawansowany blok do transportowania cieczy. Transportuje je szybciej i magazynuje więcej niż standardowe rury.
|
||||||
block.plated-conduit.description = Przesyła ciecze z taką samą szybkością co rura tytanowa, ale jest bardziej odporna. Wejściami bocznymi mogą być tylko inne rury.\nWycieka z niej mniej cieczy.
|
block.plated-conduit.description = Przesyła ciecze z taką samą szybkością co rura tytanowa, ale jest bardziej odporna. Wejściami bocznymi mogą być tylko inne rury.\nWycieka z niej mniej cieczy.
|
||||||
@@ -1332,4 +1332,63 @@ block.cyclone.description = Duża szybkostrzelna wieża.
|
|||||||
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
block.spectre.description = Duże działo dwulufowe, które strzela potężnymi pociskami przebijającymi pancerz w jednostki naziemne i powietrzne.
|
||||||
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
block.meltdown.description = Duże działo laserowe, które strzela potężnymi wiązkami dalekiego zasięgu. Wymaga chłodzenia.
|
||||||
block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu.
|
block.repair-point.description = Bez przerw naprawia najbliższą uszkodzoną jednostkę w jego zasięgu.
|
||||||
block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted.
|
block.segment.description = Uszkadza i niszczy wrogie pociskiski poza laserami.
|
||||||
|
block.parallax.description = Wykorzystuje laser, który przyciąga do siebie wrogów, zadając im obrażenia.
|
||||||
|
block.tsunami.description = Strzela wielkim strumieniem cieczy we wrogów. Automatycznie gasi ogień, gdy jest podłączony do wody.
|
||||||
|
block.silicon-crucible.description = Oczyszcza krzem z węgla i piasku wykorzystując piratian. Bardziej efektywny w gorących miejscach.
|
||||||
|
block.disassembler.description = Oddziela egzotyczne materiały z mieszaniny jaką jest żużel z małą efektywnością. Może wyprodukować tor.
|
||||||
|
block.overdrive-dome.description = Zwiększa szybkość budynków w zasięgu. Wymaga włókna fazowego oraz krzemu by działać.
|
||||||
|
block.payload-conveyor.description = Przenosi duże ładunki, takie jak jednostki z fabryk.
|
||||||
|
block.payload-router.description = Dzieli wejście z przewoźnika masowego i dzieli je w 3 różne strony.
|
||||||
|
block.command-center.description = Kontroluje zachowanie jednostek paroma różnymi komendami.
|
||||||
|
block.ground-factory.description = Produkuje jednostki naziemne. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć.
|
||||||
|
block.air-factory.description = Produkuje jednostki powietrzne. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć.
|
||||||
|
block.naval-factory.description = Produkuje jednostki morskie. Jednostki mogą być do razu wykorzystane lub przeniesone do rekonstrukota by je ulepszyć.
|
||||||
|
block.additive-reconstructor.description = Ulepsza wsadzone jednostki do stopnia drugiego.
|
||||||
|
block.multiplicative-reconstructor.description = Ulepsza wsadzone jednostki do stopnia trzeciego.
|
||||||
|
block.exponential-reconstructor.description = Ulepsza wsadzone jednostki do stopnia czwartego.
|
||||||
|
block.tetrative-reconstructor.description = Ulepsza wsadzone jednostki do stopnia piątego i ostatniego.
|
||||||
|
block.switch.description = Jest Przełączalny. Stan jego może być odczytywany lub kontrolowany przez procesory.
|
||||||
|
block.micro-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek.
|
||||||
|
block.logic-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż mikro procesor.
|
||||||
|
block.hyper-processor.description = Uruchamia sekwencję instrukcji logicznych w pętli. Może być wykorzystany do kontroli bloków lub jednostek. Szybszy niż logiczny procesor.
|
||||||
|
block.memory-cell.description = Przechowuje informacje dla procesora.
|
||||||
|
block.memory-bank.description = Przechowuje informacje dla procesora. Duża pojemność.
|
||||||
|
block.logic-display.description = Wyświetla obraz z procesora.
|
||||||
|
block.large-logic-display.description = Wyświetla obraz z procesora.
|
||||||
|
block.interplanetary-accelerator.description = Masywna elektromagnetyczna wierza. Przyspiesza rdzeń do prędkości ucieczki by wylądować na innych planetach.
|
||||||
|
|
||||||
|
|
||||||
|
unit.dagger.description = Strzela standardowymi pociskami w najbliższych wrogów.
|
||||||
|
unit.mace.description = Strzela strumieniami ognia w najbliższych wrogów.
|
||||||
|
unit.fortress.description = Strzela artylerią dalekiego zasięgu we wrogie jednostki na ziemi.
|
||||||
|
unit.scepter.description = Strzela salwą naładowanych pocisków we wszystkich przeciwników.
|
||||||
|
unit.reign.description = Strzela salwą masywnych przebijających pocisków we wszystkich przeciwników.
|
||||||
|
unit.nova.description = Wystrzeliwuje pioruny, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać.
|
||||||
|
unit.pulsar.description = Wystrzeliwuje elektryczne pioruny, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać.
|
||||||
|
unit.quasar.description = Wystrzeliwuje wiązki laserowe, które uszkadzają przeciwników i leczą sojusznicze struktury. Może latać. Posiada tarcze.
|
||||||
|
unit.vela.description = Wystrzeliwuje masywny ciągły laser, który uszkadza przeciwników i leczy sojusznicze struktury. Może latać.
|
||||||
|
unit.corvus.description = Wystrzeliwuje masywny laserowy błysk, który uszkadza przeciwników i leczy sojusznicze struktury. Może przejść po większości terenu.
|
||||||
|
unit.crawler.description = Wbiega w przeciwników i dokonuje samozniszczenia powodując dużą eksplozje.
|
||||||
|
unit.atrax.description = Wystrzeliwuje wyniszczające kule żużlu w cele na ziemi. Może przejść po większości terenu.
|
||||||
|
unit.spiroct.description = Strzela wyczerpującymi życie laserami we wrogów, naprawiając siebie. Może przejść po większości terenu.
|
||||||
|
unit.arkyid.description = Strzela dużymi wyczerpującymi życie laserami we wrogów, naprawiając siebie. Może przejść po większości terenu.
|
||||||
|
unit.toxopid.description = Strzela wielkimi elektrycznymi skupionymi kulami i przebijającymi laserami we wrogów. Może przejść po większości terenu.
|
||||||
|
unit.flare.description = Strzela standardowymi pociskami we jednostki naziemne.
|
||||||
|
unit.horizon.description = Upuszcza stos bomb na jednostki naziemne.
|
||||||
|
unit.zenith.description = Strzela salwą rakiet w każdego pobliskiego wroga.
|
||||||
|
unit.antumbra.description = Strzela zaporą rakiet w każdego pobliskiego wroga.
|
||||||
|
unit.eclipse.description = Strzela dwoma przebijającymi laserami i pociskami przeciwlotniczymi we wrogów.
|
||||||
|
unit.mono.description = Automatycznie wykopuje miedź i ołów i odkłada je do rdzenia.
|
||||||
|
unit.poly.description = Automatycznie naprawia zniszczone struktury i asystuje w budowie.
|
||||||
|
unit.mega.description = Automatycznie naprawia zniszczone struktury. Może podnosić małe jednostki i bloki.
|
||||||
|
unit.quad.description = Upuszcza wielkie bomby na cele na ziemi, które uszkadzają przeciwników i leczą sojusznicze struktury. Może podnosić jednostki naziemne średniej wielkości.
|
||||||
|
unit.oct.description = Broni wszystkie jednostki tarczą regeneracyjną. Może podnosić większość jednostek naziemnych.
|
||||||
|
unit.risso.description = Strzela sporą ilością pocisków i rakiet w najbliższych przeciwników.
|
||||||
|
unit.minke.description = Strzela granatami i standardowymi pociskami w najbliższych przeciwników.
|
||||||
|
unit.bryde.description = Strzela granatami i rakietami na dużą odległość we wrogów.
|
||||||
|
unit.sei.description = Strzela dużą ilością rakiet oraz przebijających zbroje pocisków we wrogów
|
||||||
|
unit.omura.description = Strzela przebijającym superszybkim pociskiem we wrogów ze sporej odległości. Produkuje Błyski (jednostki)
|
||||||
|
unit.alpha.description = Chroni Rdzeń: Odłamek przed wrogami. Buduje struktury.
|
||||||
|
unit.beta.description = Chroni Rdzeń: Podstawa przed wrogami. Buduje struktury.
|
||||||
|
unit.gamma.description = Chroni Rdzeń: Jądro przed wrogami. Buduje struktury.
|
||||||
|
|||||||
@@ -17,11 +17,14 @@ linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată.
|
|||||||
screenshot = Captură de ecran salvată la {0}
|
screenshot = Captură de ecran salvată la {0}
|
||||||
screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran.
|
screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran.
|
||||||
gameover = Jocul s-a încheiat
|
gameover = Jocul s-a încheiat
|
||||||
|
gameover.disconnect = Deconectare
|
||||||
gameover.pvp = Echipa [accent] {0}[] este câștigătoare!
|
gameover.pvp = Echipa [accent] {0}[] este câștigătoare!
|
||||||
|
gameover.waiting = [accent]Se așteaptă următoarea hartă...
|
||||||
highscore = [accent]Scor maxim nou!
|
highscore = [accent]Scor maxim nou!
|
||||||
copied = Copiat.
|
copied = Copiat.
|
||||||
indev.popup = [accent]v6[] este momentan în [accent]beta[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este neterminată[]\n- Efectele sonore și muzica sunt neterminate/lipsesc\n- Tot ce vedeți se poate schimba sau poate fi eliminat.\n\nPentru a raporta buguri și crashuri intrați pe [accent]Github[].
|
indev.popup = [accent]v6[] este momentan în [accent]beta[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este neterminată[]\n- Tot ce vedeți se poate schimba sau poate fi eliminat.\n\nPentru a raporta buguri și crashuri intrați pe [accent]Github[].
|
||||||
indev.notready = Această secțiune a jocului nu este gata încă.
|
indev.notready = Această secțiune a jocului nu este gata încă.
|
||||||
|
indev.campaign = [accent]Ai ajuns la finalul campaniei![]\n\nAi mers cât de departe se poate momentan. Călătoria interplanetară va fi adăugată într-un update viitor.
|
||||||
|
|
||||||
load.sound = Sunete
|
load.sound = Sunete
|
||||||
load.map = Hărți
|
load.map = Hărți
|
||||||
@@ -57,6 +60,7 @@ schematic.rename = Redenumește Schema
|
|||||||
schematic.info = {0}x{1}, {2} blocuri
|
schematic.info = {0}x{1}, {2} blocuri
|
||||||
schematic.disabled = [scarlet]Schemele sunt dezactivate[]\nNu ai voie să folosești scheme pe această [accent]hartă[] sau [accent]server.
|
schematic.disabled = [scarlet]Schemele sunt dezactivate[]\nNu ai voie să folosești scheme pe această [accent]hartă[] sau [accent]server.
|
||||||
|
|
||||||
|
stats = Informații
|
||||||
stat.wave = Valuri Învinse:[accent] {0}
|
stat.wave = Valuri Învinse:[accent] {0}
|
||||||
stat.enemiesDestroyed = Inamici Distruși:[accent] {0}
|
stat.enemiesDestroyed = Inamici Distruși:[accent] {0}
|
||||||
stat.built = Structuri Construite:[accent] {0}
|
stat.built = Structuri Construite:[accent] {0}
|
||||||
@@ -290,6 +294,7 @@ cancelbuilding = [accent][[{0}][] pt a curăța planul
|
|||||||
selectschematic = [accent][[{0}][] pt selectare+copiere
|
selectschematic = [accent][[{0}][] pt selectare+copiere
|
||||||
pausebuilding = [accent][[{0}][] pt a face o pauză de la construit
|
pausebuilding = [accent][[{0}][] pt a face o pauză de la construit
|
||||||
resumebuilding = [scarlet][[{0}][] pt a continua construitul
|
resumebuilding = [scarlet][[{0}][] pt a continua construitul
|
||||||
|
showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața.
|
||||||
wave = [accent]Valul {0}
|
wave = [accent]Valul {0}
|
||||||
wave.cap = [accent]Valul {0}/{1}
|
wave.cap = [accent]Valul {0}/{1}
|
||||||
wave.waiting = [lightgray]Val în {0}
|
wave.waiting = [lightgray]Val în {0}
|
||||||
@@ -297,6 +302,8 @@ wave.waveInProgress = [lightgray]Val în desfășurare
|
|||||||
waiting = [lightgray]În așteptare...
|
waiting = [lightgray]În așteptare...
|
||||||
waiting.players = Se așteaptă jucătorii...
|
waiting.players = Se așteaptă jucătorii...
|
||||||
wave.enemies = [lightgray]Mai sunt {0} inamici
|
wave.enemies = [lightgray]Mai sunt {0} inamici
|
||||||
|
wave.enemycores = [accent]{0}[lightgray] Nuclee Inamice
|
||||||
|
wave.enemycore = [accent]{0}[lightgray] Nucleu Inamic
|
||||||
wave.enemy = [lightgray]Mai e {0} inamic
|
wave.enemy = [lightgray]Mai e {0} inamic
|
||||||
wave.guardianwarn = Gardianul va veni în [accent]{0}[] valuri.
|
wave.guardianwarn = Gardianul va veni în [accent]{0}[] valuri.
|
||||||
wave.guardianwarn.one = Gardianul va veni într-[accent]un[] val.
|
wave.guardianwarn.one = Gardianul va veni într-[accent]un[] val.
|
||||||
@@ -483,13 +490,14 @@ abandon = Abandonează
|
|||||||
abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului.
|
abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului.
|
||||||
locked = Blocat
|
locked = Blocat
|
||||||
complete = [lightgray]Finalizat:
|
complete = [lightgray]Finalizat:
|
||||||
requirement.wave = Ajungi la valul {0} în {1}
|
requirement.wave = Treci de valul {0} în {1}
|
||||||
requirement.core = Distruge Nucleu Inamic în{0}
|
requirement.core = Distruge Nucleul Inamic din {0}
|
||||||
requirement.research = Cercetează {0}
|
requirement.research = Cercetează {0}
|
||||||
|
requirement.produce = Produ {0}
|
||||||
requirement.capture = Capturează {0}
|
requirement.capture = Capturează {0}
|
||||||
bestwave = [lightgray]Cel Mai Bun Val: {0}
|
|
||||||
launch.text = Lansează
|
launch.text = Lansează
|
||||||
research.multiplayer = Doar gazda poate cerceta noi tehnologii.
|
research.multiplayer = Doar gazda poate cerceta noi tehnologii.
|
||||||
|
map.multiplayer = Doar gazda poate vedea harta sectoarelor.
|
||||||
uncover = Descoperă
|
uncover = Descoperă
|
||||||
configure = Configurează Încărcarea
|
configure = Configurează Încărcarea
|
||||||
|
|
||||||
@@ -498,6 +506,7 @@ loadout = Încărcare
|
|||||||
resources = Resurse
|
resources = Resurse
|
||||||
bannedblocks = Blocuri Interzise
|
bannedblocks = Blocuri Interzise
|
||||||
addall = Adaugă-le pe toate
|
addall = Adaugă-le pe toate
|
||||||
|
launch.from = Lansează Din: [accent]{0}
|
||||||
launch.destination = Destinație: {0}
|
launch.destination = Destinație: {0}
|
||||||
configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}.
|
configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}.
|
||||||
zone.unlocked = [lightgray]{0} deblocat(ă).
|
zone.unlocked = [lightgray]{0} deblocat(ă).
|
||||||
@@ -529,45 +538,67 @@ weather.fog.name = Ceață
|
|||||||
sectors.unexplored = [lightgray]Neexplorat
|
sectors.unexplored = [lightgray]Neexplorat
|
||||||
sectors.resources = Resurse:
|
sectors.resources = Resurse:
|
||||||
sectors.production = Producție:
|
sectors.production = Producție:
|
||||||
|
sectors.export = Export:
|
||||||
|
sectors.time = Timp:
|
||||||
|
sectors.threat = Amenințare:
|
||||||
|
sectors.wave = Valul:
|
||||||
sectors.stored = Stocat:
|
sectors.stored = Stocat:
|
||||||
sectors.resume = Revino
|
sectors.resume = Revino
|
||||||
sectors.launch = Lansare
|
sectors.launch = Lansare
|
||||||
sectors.select = Selectează
|
sectors.select = Selectează
|
||||||
sectors.nonelaunch = [lightgray]nimic (soarele)
|
sectors.nonelaunch = [lightgray]nimic (soarele)
|
||||||
sectors.rename = Redenumește Sectorul
|
sectors.rename = Redenumește Sectorul
|
||||||
|
sectors.enemybase = [scarlet]Bază Inamică
|
||||||
|
sectors.vulnerable = [scarlet]Vulnerabil
|
||||||
|
sectors.underattack = [scarlet]Sectorul e atacat! [accent]{0}% deteriorat
|
||||||
|
sectors.survives = [accent]Supraviețuiește {0} valuri
|
||||||
|
|
||||||
|
sector.curcapture = Sector Capturat
|
||||||
|
sector.curlost = Sector Pierdut
|
||||||
sector.missingresources = [scarlet]Resurse din Nucleu Insuficiente
|
sector.missingresources = [scarlet]Resurse din Nucleu Insuficiente
|
||||||
|
sector.attacked = Sectorul [accent]{0}[white] este atacat!
|
||||||
|
sector.lost = Ai pierdut sectorul [accent]{0}[white]!
|
||||||
|
#spațiul lipsă de mai jos e intenționat
|
||||||
|
sector.captured = Ai capturat sectorul [accent]{0}[white]!
|
||||||
|
|
||||||
|
threat.low = Scăzută
|
||||||
|
threat.medium = Medie
|
||||||
|
threat.high = Mare
|
||||||
|
threat.extreme = Extremă
|
||||||
|
threat.eradication = Eradicare
|
||||||
|
|
||||||
|
planets = Planete
|
||||||
|
|
||||||
planet.serpulo.name = Serpulo
|
planet.serpulo.name = Serpulo
|
||||||
#Spațiu Necesar
|
|
||||||
planet.sun.name = Soare
|
planet.sun.name = Soare
|
||||||
|
|
||||||
#Spațiu Necesar
|
sector.impact0078.name = Impact 0078
|
||||||
sector.groundZero.name = Ground Zero
|
sector.groundZero.name = Punctul Zero
|
||||||
sector.craters.name = The Craters
|
sector.craters.name = Craterele
|
||||||
sector.frozenForest.name = Frozen Forest
|
sector.frozenForest.name = Pădurea Glacială
|
||||||
sector.ruinousShores.name = Ruinous Shores
|
sector.ruinousShores.name = Țărmurile Părăsite
|
||||||
sector.stainedMountains.name = Stained Mountains
|
sector.stainedMountains.name = Munții Pătați
|
||||||
sector.desolateRift.name = Desolate Rift
|
sector.desolateRift.name = Riftul Dezolat
|
||||||
sector.nuclearComplex.name = Nuclear Production Complex
|
sector.nuclearComplex.name = Complexul de Producție Nucleară
|
||||||
sector.overgrowth.name = Overgrowth
|
sector.overgrowth.name = Supracreșterea
|
||||||
sector.tarFields.name = Tar Fields
|
sector.tarFields.name = Câmpurile cu Păcură
|
||||||
sector.saltFlats.name = Salt Flats
|
sector.saltFlats.name = Podișurile Saline
|
||||||
sector.fungalPass.name = Fungal Pass
|
sector.fungalPass.name = Pasul Fungic
|
||||||
|
sector.biomassFacility.name = Facilitatea de Sinteză a Biomasei
|
||||||
#Spațiu
|
sector.windsweptIslands.name = Insulele Măturate de Vânt
|
||||||
#Absolut
|
sector.extractionOutpost.name = Avanpostul de Extracție
|
||||||
#Necesar
|
sector.planetaryTerminal.name = Terminalul de Lansare Planetară
|
||||||
|
|
||||||
sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe.
|
sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe.
|
||||||
sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare.
|
sector.frozenForest.description = Chiar și aici, aproape de munți, sporii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare.
|
||||||
sector.saltFlats.description = La periferia deșertului stau Salt Flats. Puține resurse pot fi găsite în această locație.\n\nInamicul a ridicat un complex-depozit aici. Distruge-le nucleul. Nu lăsa nimic în urmă.
|
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-depozit 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.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.ruinousShores.description = După deșerturi vine țărmul. Odată, locația aceasta a avut un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai de bază rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea în afară. Redescoperă tehnologia.
|
sector.ruinousShores.description = După deșerturi vine țărmul. Odată, locația aceasta a avut un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai de bază rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea în afară. Redescoperă tehnologia.
|
||||||
sector.stainedMountains.description = Mai înspre continent 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ă-și trimită cele mai puternice unități.
|
sector.stainedMountains.description = Mai înspre continent 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ă-și trimită cele mai puternice unități.
|
||||||
sector.overgrowth.description = Zona asta e plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un adăpost aici. Construiește unități Titan. Distruge-o. Cucerește din nou ce s-a pierdut.
|
sector.overgrowth.description = Această zonă este plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un adăpost aici. Construiește unități Mace. Distruge-o. Cucerește din nou ce s-a pierdut.
|
||||||
sector.tarFields.description = O zonă aflată la periferia unei zone de producție petrolieră, între munți și deșert. Una din puținele zone cu resurse utilizabile de țiței.\nDeși abandonată, zona aceasta are niște forțe inamice periculoase înapropiere. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului dacă se poate.
|
sector.tarFields.description = O zonă aflată la periferia unei zone de producție petrolieră, între munți și deșert. Una din puținele zone cu resurse utilizabile de țiței.\nDeși abandonată, zona aceasta are niște forțe inamice periculoase înapropiere. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului dacă se poate.
|
||||||
sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puțin spațiu. Mare risc de distrugere. Pleacă cât mai curând. Nu te lăsa păcălit de timpul mare dintre atacurile inamice.
|
sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puțin spațiu. Mare risc de distrugere. Pleacă cât mai curând. Nu te lăsa păcălit de timpul mare dintre atacurile inamice.
|
||||||
sector.nuclearComplex.description = O fostă facilitate pt producerea și procesarea de torium, redusă la ruine.\n[lightgray]Cercetează toriul și multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constând atacatori.
|
sector.nuclearComplex.description = O fostă facilitate pt producerea și procesarea de toriu, redusă la ruine.\n[lightgray]Cercetează toriul și multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constând atacatori.
|
||||||
sector.fungalPass.description = O zonă de tranziție dintre munții înalți și zonele joase, pline cu spori. O mică bază de recunoaștere a inamicului este localizată aici.\nDistruge-o.\nFolosește unități Dagger și Crawler. Distruge cele 2 nuclee.
|
sector.fungalPass.description = O zonă de tranziție dintre munții înalți și zonele joase, pline cu spori. O mică bază de recunoaștere a inamicului este localizată aici.\nDistruge-o.\nFolosește unități Dagger și Crawler. Distruge cele 2 nuclee.
|
||||||
|
|
||||||
settings.language = Limbă
|
settings.language = Limbă
|
||||||
@@ -628,6 +659,8 @@ stat.memorycapacity = Capacitate Memorie
|
|||||||
stat.basepowergeneration = Generare Electricitate (Bază)
|
stat.basepowergeneration = Generare Electricitate (Bază)
|
||||||
stat.productiontime = Timp Producție
|
stat.productiontime = Timp Producție
|
||||||
stat.repairtime = Durată Reparare Bloc
|
stat.repairtime = Durată Reparare Bloc
|
||||||
|
stat.weapons = Arme
|
||||||
|
stat.bullet = Glonț
|
||||||
stat.speedincrease = Creștere Viteză
|
stat.speedincrease = Creștere Viteză
|
||||||
stat.range = Rază
|
stat.range = Rază
|
||||||
stat.drilltier = Minabile
|
stat.drilltier = Minabile
|
||||||
@@ -697,12 +730,14 @@ units.processorcontrol = [lightgray]Controlat de Procesor
|
|||||||
bullet.damage = [stat]{0}[lightgray] forță
|
bullet.damage = [stat]{0}[lightgray] forță
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate
|
bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate
|
||||||
bullet.incendiary = [stat]incendiar
|
bullet.incendiary = [stat]incendiar
|
||||||
|
bullet.sapping = [stat]atragere inamici
|
||||||
bullet.homing = [stat]cu radar
|
bullet.homing = [stat]cu radar
|
||||||
bullet.shock = [stat]șoc
|
bullet.shock = [stat]șoc
|
||||||
bullet.frag = [stat]fragil
|
bullet.frag = [stat]fragil
|
||||||
bullet.knockback = [stat]{0} [lightgray]împingere
|
bullet.knockback = [stat]{0} [lightgray]împingere
|
||||||
bullet.pierce = [stat]{0}[lightgray]x penetrare
|
bullet.pierce = [stat]{0}[lightgray]x penetrare
|
||||||
bullet.infinitepierce = [stat]penetrare
|
bullet.infinitepierce = [stat]penetrare
|
||||||
|
bullet.healpercent = [stat]{0}[lightgray]% reparare
|
||||||
bullet.freezing = [stat]înghețat
|
bullet.freezing = [stat]înghețat
|
||||||
bullet.tarred = [stat]lipicios
|
bullet.tarred = [stat]lipicios
|
||||||
bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție
|
bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție
|
||||||
@@ -770,7 +805,6 @@ setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii
|
|||||||
setting.sensitivity.name = Sensibilitatea Controlului
|
setting.sensitivity.name = Sensibilitatea Controlului
|
||||||
setting.saveinterval.name = Interval de Salvare
|
setting.saveinterval.name = Interval de Salvare
|
||||||
setting.seconds = {0} secunde
|
setting.seconds = {0} secunde
|
||||||
setting.blockselecttimeout.name = Selectarea Blocului a Întârziat
|
|
||||||
setting.milliseconds = {0} millisecunde
|
setting.milliseconds = {0} millisecunde
|
||||||
setting.fullscreen.name = Ecran Complet
|
setting.fullscreen.name = Ecran Complet
|
||||||
setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară)
|
setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară)
|
||||||
@@ -859,6 +893,7 @@ keybind.menu.name = Meniu
|
|||||||
keybind.pause.name = Pauză
|
keybind.pause.name = Pauză
|
||||||
keybind.pause_building.name = Pauză/Reia Construit
|
keybind.pause_building.name = Pauză/Reia Construit
|
||||||
keybind.minimap.name = Minihartă
|
keybind.minimap.name = Minihartă
|
||||||
|
keybind.planet_map.name = Harta Planetei
|
||||||
keybind.chat.name = Chat
|
keybind.chat.name = Chat
|
||||||
keybind.player_list.name = Listă Jucători
|
keybind.player_list.name = Listă Jucători
|
||||||
keybind.console.name = Consolă
|
keybind.console.name = Consolă
|
||||||
@@ -922,6 +957,7 @@ content.item.name = Materiale
|
|||||||
content.liquid.name = Lichide
|
content.liquid.name = Lichide
|
||||||
content.unit.name = Unități
|
content.unit.name = Unități
|
||||||
content.block.name = Blocuri
|
content.block.name = Blocuri
|
||||||
|
content.sector.name = Sectoare
|
||||||
|
|
||||||
item.copper.name = Cupru
|
item.copper.name = Cupru
|
||||||
item.lead.name = Plumb
|
item.lead.name = Plumb
|
||||||
@@ -1086,7 +1122,6 @@ block.distributor.name = Distributor
|
|||||||
block.block-forge.name = Forjă de Blocuri
|
block.block-forge.name = Forjă de Blocuri
|
||||||
block.block-loader.name = Încărcător de Blocuri
|
block.block-loader.name = Încărcător de Blocuri
|
||||||
block.block-unloader.name = Descărcător de Blocuri
|
block.block-unloader.name = Descărcător de Blocuri
|
||||||
|
|
||||||
block.sorter.name = Sortator
|
block.sorter.name = Sortator
|
||||||
block.inverted-sorter.name = Sortator Invers
|
block.inverted-sorter.name = Sortator Invers
|
||||||
block.message.name = Mesaj
|
block.message.name = Mesaj
|
||||||
@@ -1186,6 +1221,7 @@ block.payload-router.name = Router în Masă
|
|||||||
block.disassembler.name = Dezasamblator
|
block.disassembler.name = Dezasamblator
|
||||||
block.silicon-crucible.name = Creuzet de Silicon
|
block.silicon-crucible.name = Creuzet de Silicon
|
||||||
block.overdrive-dome.name = Dom de Suprasolicitare
|
block.overdrive-dome.name = Dom de Suprasolicitare
|
||||||
|
block.interplanetary-accelerator.name = Accelerator Interplanetar
|
||||||
|
|
||||||
block.switch.name = Întrerupător
|
block.switch.name = Întrerupător
|
||||||
block.micro-processor.name = Microprocesor
|
block.micro-processor.name = Microprocesor
|
||||||
@@ -1204,27 +1240,40 @@ team.derelict.name = abandonată
|
|||||||
team.green.name = verde
|
team.green.name = verde
|
||||||
team.purple.name = mov
|
team.purple.name = mov
|
||||||
|
|
||||||
tutorial.next = [lightgray]<Click pt a continua>
|
# A NU SE TRADUCE! NU SUNT GATA!
|
||||||
tutorial.intro = Bun venit în[scarlet] Tutorialul Mindustry.[]\nFolosește[accent] [[WASD][] ca să te miști.\n[accent]Cu rotița[] poți face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru
|
hint.skip = Skip
|
||||||
tutorial.intro.mobile = Bun venit în[scarlet] Tutorialul Mindustry.[]\nGlisează pe ecran pt a te mișca.\n[accent]Trage cu 2 degete[] pt face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru
|
hint.desktopMove = Use [accent][[WASD][] to move.
|
||||||
tutorial.drill = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click.\nPoți selecta burghiul și apăsând [accent][[2][] apoi rapid [accent][[1][], indiferent de ce tab este deschis.\n[accent]Click-dreapta[] ca să te oprești din a construi.
|
hint.zoom = [accent]Scroll[] to zoom in or out.
|
||||||
tutorial.drill.mobile = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click, apoi apasă pe[accent] bifa[] de mai jos pt a-ți confirma selecția.\nApasă pe[accent] butonul X[] pt a anula plasarea.
|
hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
|
||||||
tutorial.blockinfo = Fiecare bloc are statistici diferite. Fiecare burghiu poate mina minereuri diferite.\nPt a verifica informațiile despre un bloc,[accent] dă click pe butonul "?" care apare când blocul este selectat din meniu.[]\n\n[accent]Accesează informații despre Burghiul Mecanic.[]
|
hint.desktopShoot = [accent][[Left-click][] to shoot.
|
||||||
tutorial.conveyor = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent]Ține apăsat pe mouse pt a desena o linie.[]\nȚine[accent] CTRL[] în timp se plasezi o line pt a o plasa diagonal.\nFolosește rotița pt a roti blocurile înainte să le plasezi.\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu.
|
hint.depositItems = To transfer items, drag from your ship to the core.
|
||||||
tutorial.conveyor.mobile = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent] Construiește o linie ținând degetul pe ecran câteva secunde și apoi[] trage într-o direcție.\n\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu.
|
hint.respawn = To respawn as a ship, press [accent][[V][].
|
||||||
tutorial.turret = Odată ce un material intră în nucleu, poate fi folosit pt a construi.\nDe reținut că nu toate materialele pot fi folosite pt construit.\nMaterialele care nu sunt folosite pt construit, cum ar fi[accent] cărbunele[] sau[accent] fierul vechi[], nu pot fi puse în nucleu.\nTrebuie să construiești structuri defensive ca să te aperi de[lightgray] inamici[].\nConstruiește [accent]o armă duo[] lângă baza ta.
|
hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
|
||||||
tutorial.drillturret = Armele Duo au nevoie de[accent] muniție de cupru[] pt a trage.\nPlasează un burghiu lângă armă.\nConstruiește o bandă către armă pt a o alimenta cu muniție de cupru.\n\n[accent]Muniție livrată: 0/1
|
hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
|
||||||
tutorial.pause = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă pe space pt a da pauză.
|
hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it.
|
||||||
tutorial.pause.mobile = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă butonul din colțul din stânga sus pt a da pauză.
|
hint.placeDrill.mobile = Select the \ue85e[accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm.
|
||||||
tutorial.unpause = Acum apasă space din nou pt a continua.
|
hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate.
|
||||||
tutorial.unpause.mobile = Acum apasă-l din nou pt a continua.
|
hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors.
|
||||||
tutorial.breaking = Uneori, blocurile trebuie distruse.\n[accent]Ține apăsat pe click dreapta[] pt a distruge toate blocurile dintr-o selecție.[]\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului.
|
hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them.
|
||||||
tutorial.breaking.mobile = Uneori, blocurile trebuie distruse.\n[accent]Selectează modul deconstrucție[], aopi dă click pe un bloc pt a-l distruge.\nDistruge o zonă ținând apăsat cu degetul pt câteva secunde[] și apoi trăgând într-o direcție.\nApasă bifa de mai jos pt a confirma distrugerea.\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului.
|
hint.breaking = [accent]Right-click[] and drag to break blocks.
|
||||||
tutorial.withdraw = Câteodată a lua materiale direct din blocuri este necesar.\nPt a face asta, [accent]dă click pe un bloc[] cu materiale în el, apoi [accent]dă click pe materialul[] din inventar.\nMai multe materiale pot fi luate [accent]făcând click și ținând apăsat[].\n\n[accent]Ia niște cupru din nucleu.[]
|
hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection.
|
||||||
tutorial.deposit = Depozitează materiale înapoi în blocuri trăgând din nava ta către blocul de destinație.\n\n[accent]Depozitează cuprul înapoi în nucleu.[]
|
hint.research = Use the \ue875 [accent]Research[] button to research new technology.
|
||||||
tutorial.waves = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri.[accent] Click[] pt a trage cu arma.\nConstruiește mai multe arme și burghie. Minează mai mult cupru.
|
hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
|
||||||
tutorial.waves.mobile = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri. Nava ta va trage automat către inamici.\nConstruiește mai multe arme și burghie. Minează mai mult cupru.
|
hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
|
||||||
tutorial.launch = Odată ce ajungi la un anumit val, poți [accent]lansa nucleul[], lăsându-ți apărările în urmă și[accent] obținând toate resursele din nucleu.[]\nResursele obținute pot fi apoi folosite pt a cerceta noi tehnologii.\n\n[accent]Apasă butonul de lansare.
|
hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets.
|
||||||
|
hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right.
|
||||||
|
hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[].
|
||||||
|
hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type.
|
||||||
|
hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path.
|
||||||
|
hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path.
|
||||||
|
hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters.
|
||||||
|
hint.command = Press [accent][[G][] to command nearby units into formation.
|
||||||
|
hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation.
|
||||||
|
hint.payloadPickup = Press [accent][[[] to pick up small blocks or units.
|
||||||
|
hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up.
|
||||||
|
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.
|
||||||
|
|
||||||
item.copper.description = Folosit în tot felul de construcții și muniție.
|
item.copper.description = Folosit în tot felul de construcții și muniție.
|
||||||
item.copper.details = Cupru. Metal anormal de abundent pe Serpulo. Structural slab dacă nu este consolidat.
|
item.copper.details = Cupru. Metal anormal de abundent pe Serpulo. Structural slab dacă nu este consolidat.
|
||||||
@@ -1237,7 +1286,7 @@ item.coal.description = Folosit extensiv ca combustibil și pt producerea de mat
|
|||||||
item.coal.details = Pare să fie materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării.
|
item.coal.details = Pare să fie materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării.
|
||||||
item.titanium.description = Folosit pt structuri transportatoare de lichid, burghie și aeronautică.
|
item.titanium.description = Folosit pt structuri transportatoare de lichid, burghie și aeronautică.
|
||||||
item.thorium.description = Folosit în structuri durabile și combustibil nuclear.
|
item.thorium.description = Folosit în structuri durabile și combustibil nuclear.
|
||||||
item.scrap.description = Topit și rafinat în alte materiale.
|
item.scrap.description = Folosit in topitoare și pulverizatoare pt a fi rafinat în alte materiale.
|
||||||
item.scrap.details = Rămășițe ale structurilor și unităților vechi..
|
item.scrap.details = Rămășițe ale structurilor și unităților vechi..
|
||||||
item.silicon.description = Folosit în producerea energiei solare, electronice complexe și muniție cu radar pt armament.
|
item.silicon.description = Folosit în producerea energiei solare, electronice complexe și muniție cu radar pt armament.
|
||||||
item.plastanium.description = Folosit pt unitățile militare avansate, ca izolator electric și muniție fragilă.
|
item.plastanium.description = Folosit pt unitățile militare avansate, ca izolator electric și muniție fragilă.
|
||||||
@@ -1247,11 +1296,13 @@ item.spore-pod.description = Folosită pt a fi convertită în petrol, explozibi
|
|||||||
item.spore-pod.details = Spori. Probabil o formă de viață sintetică. Emite gaze toxice altor forme de viață biologică. Nu că ar mai fi rămas prea multe aici.
|
item.spore-pod.details = Spori. Probabil o formă de viață sintetică. Emite gaze toxice altor forme de viață biologică. Nu că ar mai fi rămas prea multe aici.
|
||||||
item.blast-compound.description = Folosit în bombe și muniție explozibilă.
|
item.blast-compound.description = Folosit în bombe și muniție explozibilă.
|
||||||
item.pyratite.description = Folosită în armele incendiare și generatoare pe bază de procese de combustie.
|
item.pyratite.description = Folosită în armele incendiare și generatoare pe bază de procese de combustie.
|
||||||
|
|
||||||
liquid.water.description = Folosită pt răcirea mașinăriilor și procesarea deșeurilor.
|
liquid.water.description = Folosită pt răcirea mașinăriilor și procesarea deșeurilor.
|
||||||
liquid.slag.description = Rafinată în separatoare înapoi în materialele constituente, sau pulverizată înspre unitățile inamice ca armă.
|
liquid.slag.description = Rafinată în separatoare înapoi în materialele constituente, sau pulverizată înspre unitățile inamice ca armă.
|
||||||
liquid.oil.description = Folosit în producerea avansată de materialet și ca muniție incendiară.
|
liquid.oil.description = Folosit în producerea avansată de materialet și ca muniție incendiară.
|
||||||
liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici.
|
liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici.
|
||||||
|
|
||||||
|
block.resupply-point.description = Realimentează unitățile din apropiere cu muniție de cupru. Nu este compatibil cu unitățile care se încarcă din baterii.
|
||||||
block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi.
|
block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi.
|
||||||
block.illuminator.description = Emite lumină.
|
block.illuminator.description = Emite lumină.
|
||||||
block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați.
|
block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați.
|
||||||
@@ -1393,6 +1444,7 @@ block.memory-cell.description = Stochează informație pt un procesor.
|
|||||||
block.memory-bank.description = Stochează informație pt un procesor. Capacitate mare.
|
block.memory-bank.description = Stochează informație pt un procesor. Capacitate mare.
|
||||||
block.logic-display.description = Afișează grafica transmisă de un procesor logic.
|
block.logic-display.description = Afișează grafica transmisă de un procesor logic.
|
||||||
block.large-logic-display.description = Afișează grafica transmisă de un procesor logic.
|
block.large-logic-display.description = Afișează grafica transmisă de un procesor logic.
|
||||||
|
block.interplanetary-accelerator.description = Un turn masiv cu o armă railgun electromagnetică. Accelerează nucleele la viteză cosmică pt lansare interplanetară.
|
||||||
|
|
||||||
unit.dagger.description = Trage cu gloanțe standard către toți inamicii din apropiere.
|
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.
|
unit.mace.description = Trage cu jeturi de flacără aprinsă către toți inamicii din apropiere.
|
||||||
@@ -1420,7 +1472,7 @@ unit.mega.description = Repară automat structurile deteriorate. Capabilă să c
|
|||||||
unit.quad.description = Aruncă bombe mari peste artileria inamică, reparând structurile aliate și deteriorând inamicii. Capabilă să care unități de artilerie de dimensiuni medii.
|
unit.quad.description = Aruncă bombe mari peste artileria inamică, reparând structurile aliate și deteriorând inamicii. Capabilă să care unități de artilerie de dimensiuni medii.
|
||||||
unit.oct.description = Protejează aliații din apropiere cu scutul său care se regenerează. Capabilă să care majoritatea unităților de artilerie.
|
unit.oct.description = Protejează aliații din apropiere cu scutul său care se regenerează. Capabilă să care majoritatea unităților de artilerie.
|
||||||
unit.risso.description = Trage un baraj de rachete și gloanțe către toți inamicii din apropiere.
|
unit.risso.description = Trage un baraj de rachete și gloanțe către toți inamicii din apropiere.
|
||||||
unit.minke.description = Trage cu capsule incendiare și gloanțe standard către artileria inamică din apropiere.
|
unit.minke.description = Trage cu capsule și gloanțe standard către artileria inamică din apropiere.
|
||||||
unit.bryde.description = Trage cu capsule de artilerie și rachete către inamici pe distanțe lungi.
|
unit.bryde.description = Trage cu capsule de artilerie și rachete către inamici pe distanțe lungi.
|
||||||
unit.sei.description = Trage cu un baraj de rachete și gloanțe care penetrează scuturile inamicilor.
|
unit.sei.description = Trage cu un baraj de rachete și gloanțe care penetrează scuturile inamicilor.
|
||||||
unit.omura.description = Trage cu un railgun cu gloanțe care penetrează scuturile inamice pe distanțe lungi. Construiește unități Flare.
|
unit.omura.description = Trage cu un railgun cu gloanțe care penetrează scuturile inamice pe distanțe lungi. Construiește unități Flare.
|
||||||
|
|||||||
@@ -497,6 +497,7 @@ requirement.produce = Произведите {0}
|
|||||||
requirement.capture = Захватите {0}
|
requirement.capture = Захватите {0}
|
||||||
launch.text = Высадка
|
launch.text = Высадка
|
||||||
research.multiplayer = Только хост может исследовать предметы.
|
research.multiplayer = Только хост может исследовать предметы.
|
||||||
|
map.multiplayer = Только хост может просматривать секторы.
|
||||||
uncover = Раскрыть
|
uncover = Раскрыть
|
||||||
configure = Конфигурация выгрузки
|
configure = Конфигурация выгрузки
|
||||||
|
|
||||||
@@ -547,8 +548,13 @@ sectors.launch = Высадка
|
|||||||
sectors.select = Выбор
|
sectors.select = Выбор
|
||||||
sectors.nonelaunch = [lightgray]нет (солнце)
|
sectors.nonelaunch = [lightgray]нет (солнце)
|
||||||
sectors.rename = Переименовать сектор
|
sectors.rename = Переименовать сектор
|
||||||
|
sectors.enemybase = [scarlet]Вражеская база
|
||||||
|
sectors.vulnerable = [scarlet]Уязвим
|
||||||
|
sectors.underattack = [scarlet]Атакован! [accent]{0}% повреждений
|
||||||
|
sectors.survives = [accent]Продержиться {0} волн(ы)
|
||||||
|
|
||||||
sector.curcapture = Сектор захвачен
|
sector.curcapture = Сектор захвачен
|
||||||
|
sector.curlost = Сектор потерян
|
||||||
sector.missingresources = [scarlet]Недостаточно ресурсов для высадки
|
sector.missingresources = [scarlet]Недостаточно ресурсов для высадки
|
||||||
sector.attacked = Сектор [accent]{0}[white] атакован!
|
sector.attacked = Сектор [accent]{0}[white] атакован!
|
||||||
sector.lost = Сектор [accent]{0}[white] потерян!
|
sector.lost = Сектор [accent]{0}[white] потерян!
|
||||||
@@ -589,8 +595,8 @@ sector.saltFlats.description = На окраине пустыни лежат с
|
|||||||
sector.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров.
|
sector.craters.description = Вода скопилась в этом кратере, реликвии времён старых войн. Восстановите область. Соберите песок. Выплавьте метастекло. Качайте воду для охлаждения турелей и буров.
|
||||||
sector.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии.
|
sector.ruinousShores.description = Мимо пустошей проходит береговая линия. Когда-то здесь располагался массив береговой обороны. Не так много от него осталось. Только самые базовые оборонительные сооружения остались невредимыми, всё остальное превратилось в металлолом.\nПродолжайте экспансию вовне. Переоткройте для себя технологии.
|
||||||
sector.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Научитесь им пользоваться.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц.
|
sector.stainedMountains.description = Дальше, вглубь местности, лежат горы, еще не запятнанные спорами.\nИзвлеките изобилие титана в этой области. Научитесь им пользоваться.\n\nВражеское присутствие здесь сильнее. Не дайте им времени для отправки своих сильнейших боевых единиц.
|
||||||
sector.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Титан». Уничтожьте его. Верните то, что было потеряно.
|
sector.overgrowth.description = Эта заросшая область находится ближе к источнику спор.\nВраг организовал здесь форпост. Постройте боевые единицы «Булава». Уничтожьте его. Верните то, что было потеряно.
|
||||||
sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя эта область заброшенна, в ней поблизости присутствуют некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно.
|
sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя эта область заброшена, в ней поблизости присутствуют некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно.
|
||||||
sector.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками.
|
sector.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками.
|
||||||
sector.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и варианты его многочисленного применения.\n\nВраг присутствует здесь в большом числе, постоянно разведывая нападающих.
|
sector.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и варианты его многочисленного применения.\n\nВраг присутствует здесь в большом числе, постоянно разведывая нападающих.
|
||||||
sector.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Ползун». Достаньте до обоих ядер.
|
sector.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Ползун». Достаньте до обоих ядер.
|
||||||
@@ -888,6 +894,7 @@ keybind.menu.name = Меню
|
|||||||
keybind.pause.name = Пауза
|
keybind.pause.name = Пауза
|
||||||
keybind.pause_building.name = Приостановить/возобновить строительство
|
keybind.pause_building.name = Приостановить/возобновить строительство
|
||||||
keybind.minimap.name = Мини-карта
|
keybind.minimap.name = Мини-карта
|
||||||
|
keybind.planet_map.name = Карта планеты
|
||||||
keybind.chat.name = Чат
|
keybind.chat.name = Чат
|
||||||
keybind.player_list.name = Список игроков
|
keybind.player_list.name = Список игроков
|
||||||
keybind.console.name = Консоль
|
keybind.console.name = Консоль
|
||||||
@@ -1234,27 +1241,40 @@ team.derelict.name = Покинутая
|
|||||||
team.green.name = Зелёная
|
team.green.name = Зелёная
|
||||||
team.purple.name = Фиолетовая
|
team.purple.name = Фиолетовая
|
||||||
|
|
||||||
tutorial.next = [lightgray]<Нажмите для продолжения>
|
# DO NOT TRANSLATE ANY OF THESE YET! THEY ARE UNFINISHED!
|
||||||
tutorial.intro = Вы начали[scarlet] обучение по Mindustry.[]\nИспользуйте кнопки [accent][[WASD][] для передвижения.\n[accent]Покрутите колесо мыши[] для приближения или отдаления камеры.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле вашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди
|
# hint.skip = Skip
|
||||||
tutorial.intro.mobile = Вы начали[scarlet] обучение по Mindustry.[]\nПроведите по экрану, чтобы двигаться.\n[accent]Сведите или разведите 2 пальца[] для изменения масштаба.\nНачните с [accent]добычи меди[]. Приблизьтесь к ней, затем нажмите на медную жилу возле Ввашего ядра, чтобы сделать это.\n\n[accent]{0}/{1} меди
|
# hint.desktopMove = Use [accent][[WASD][] to move.
|
||||||
tutorial.drill = Ручная добыча не является эффективной.\n[accent]Буры[] могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[]. Разместите его на медной жиле нажатием.\n[accent]Нажатие по правой кнопке[] прервёт строительство.
|
# hint.zoom = [accent]Scroll[] to zoom in or out.
|
||||||
tutorial.drill.mobile = Ручная добыча не является эффективной.\n[accent]Буры []могут добывать автоматически.\nНажмите на вкладку с изображением сверла снизу справа.\nВыберите[accent] механический бур[].\nРазместите его на медной жиле нажатием, затем нажмите [accent] белую галку[] ниже, чтобы подтвердить построение выделенного.\nНажмите [accent] кнопку X[], чтобы отменить размещение.
|
# hint.mine = Move near the \uf8c4 copper ore and [accent]tap[] it to mine manually.
|
||||||
tutorial.blockinfo = Каждый блок имеет разные характеристики. Каждая дрель может добывать определенные руды.\nЧтобы узнать информацию о блоке и о его характеристиках,[accent] нажмите на «?», когда он выбран в меню строительства.[]\n\n[accent]Сейчас, узнайте характеристики механического бура.[]
|
# hint.desktopShoot = [accent][[Left-click][] to shoot.
|
||||||
tutorial.conveyor = [accent]Конвейеры[] используются для транспортировки ресуров в ядро.\nСделайте линию конвейеров от бура к ядру\n[accent]Удерживайте левую кнопку мыши, чтобы разместить в линию.[]\nУдерживайте[accent] CTRL[] при постройке линии блоков, чтобы сделать её диагональной\n\n[accent]Разместите 2 конвейера в линию и доставьте предметы в ядро.
|
# hint.depositItems = To transfer items, drag from your ship to the core.
|
||||||
tutorial.conveyor.mobile = [accent]Конвейеры[] используются для транспортировки ресурсов в ядро\nСделайте линию конвейеров от бура к ядру\n[accent]Сделайте линию, удерживая палец несколько секунд в том месте, в котором вы хотите начать линию,[] и перетяните его в нужном направлении. [accent]Разместите 2 конвейера в линию и доставьте предметы в ядро.
|
# hint.respawn = To respawn as a ship, press [accent][[V][].
|
||||||
tutorial.turret = Как только предмет попадает в ядро, его можно использовать в строительстве.\nИмейте в виду, что не все предметы могут быть использованы в строительстве.\nПредметы, которые нельзя использовать для стоительства, такие как[accent] уголь[] или[accent] металлолом[], не могут быть транспортированы в ядро.\nЗащитные структуры нужно строить для отражения[lightgray] противников[].\nПостройте[accent] двойную турель[] возле вашей базы.
|
# hint.respawn.mobile = You have switched control a unit/structure. To respawn as a ship, [accent]tap the avatar in the top left.[]
|
||||||
tutorial.drillturret = Двойным турелям нужна [accent]медные боеприпасы[] для стрельбы.\nРазместите бур рядом с турелью.\nПроведите конвейеры к турели, чтобы снабдить её медью.\n\n[accent]Боеприпасов доставлено: 0/1
|
# hint.desktopPause = Press [accent][[Space][] to pause and unpause the game.
|
||||||
tutorial.pause = Во время битвы, вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите ПРОБЕЛ для приостановки игры.
|
# hint.placeDrill = Select the \ue85e [accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and click on a copper patch to place it.
|
||||||
tutorial.pause.mobile = Во время битвы, вы можете[accent] приостановить игру.[]\nВы можете планировать строительство, когда игра стоит на паузе.\n\n[accent]Нажмите кнопку вверху слева, чтобы поставить игру на паузу.
|
# hint.placeDrill.mobile = Select the \ue85e[accent]Drill[] tab in the menu at the bottom right, then select a \uf870 [accent]Drill[] and tap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm.
|
||||||
tutorial.unpause = Снова нажмите пробел для снятия паузы.
|
# hint.placeConveyor = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate.
|
||||||
tutorial.unpause.mobile = Снова нажмите туда для снятия паузы.
|
# hint.placeConveyor.mobile = Conveyors move items from drills into other blocks. Select a \uf896 [accent]Conveyor[] from the \ue814 [accent]Distribution[] tab.\n\nHold down your finger for a second and drag to place multiple conveyors.
|
||||||
tutorial.breaking = Зачастую, блоки приходится разрушать\n[accent]Зажмите ПКМ[], чтобы разрушить блоки в выбранной зоне.[]\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра.
|
# hint.placeTurret = Place \uf861 [accent]Turrets[] to defend your base from enemies.\n\nTurrets require ammo - in this case, \uf838copper.\nUse conveyors and drills to supply them.
|
||||||
tutorial.breaking.mobile = Зачастую, блоки приходится разрушать.\n[accent]Выберите режим деконструкции[], после чего нажмите на нужный блок, чтобы разрушить его.\nРазрушьте блоки в выбранной зоне, зажав палец на несколько секунд[], и проведя его в нужном направлении.\nНажмите на галочку, чтобы подтвердить разрушение.\n\n[accent]Разрушьте все стены из металлолома слева от вашего ядра.
|
# hint.breaking = [accent]Right-click[] and drag to break blocks.
|
||||||
tutorial.withdraw = В некоторых ситуациях, необходимо забрать предметы из блоков вручную.\nЧтобы сделать это, [accent]нажмите на блок[], в котором находятся предметы, затем [accent]нажмите на предмет[] в инвентаре.\nМожно забрать несколько предметов [accent]нажатием с зажимом[].\n\n[accent]Заберите немного меди из ядра[]
|
# hint.breaking.mobile = Activate the \ue817 [accent]hammer[] in the bottom right and tap to break blocks.\n\nHold down your finger for a second and drag to break in a selection.
|
||||||
tutorial.deposit = Положите предметы в блок, перетащив их от своего корабля в нужный блок.\n\n[accent]Перенесите медь обратно в ядро[]
|
# hint.research = Use the \ue875 [accent]Research[] button to research new technology.
|
||||||
tutorial.waves = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Используйте[accent] левую кнопку мыши[] для стрельбы.\nПостройте больше турелей и буров. Добудьте больше меди.
|
# hint.research.mobile = Use the \ue875 [accent]Research[] button in the \ue88c [accent]Menu[] to research new technology.
|
||||||
tutorial.waves.mobile = [lightgray]Противники[] приближаются.\n\nЗащитите ядро от двух волн. Ваш корабль будет автоматически атаковать противника.\nПостройте больше турелей и буров. Добудьте больше меди.
|
# hint.unitControl = Hold [accent][[L-ctrl][] and [accent]click[] to control friendly units or turrets.
|
||||||
tutorial.launch = Когда вы достигаете определенной волны, вы можете осуществить[accent] запуск ядра[], оставив базу и[accent] перенести ресурсы из ядра.[]\nЭти ресурсы могут быть использованы для изучения новых технологий.\n\n[accent]Нажмите кнопку запуска.
|
# hint.unitControl.mobile = [accent][Double-tap[] to control friendly units or turrets.
|
||||||
|
# hint.launch = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the bottom right.
|
||||||
|
# hint.launch.mobile = Once enough resources are collected, you can [accent]Launch[] by selecting nearby sectors from the \ue827 [accent]Map[] in the \ue88c [accent]Menu[].
|
||||||
|
# hint.schematicSelect = Hold [accent][[F][] and drag to select blocks to copy and paste.\n\n[accent][[Middle Click][] to copy a single block type.
|
||||||
|
# hint.conveyorPathfind = Hold [accent][[L-Ctrl][] while dragging conveyors to automatically generate a path.
|
||||||
|
# hint.conveyorPathfind.mobile = Enable \ue844 [accent]diagonal mode[] and drag conveyors to automatically generate a path.
|
||||||
|
# hint.boost = Hold [accent][[L-Shift][] to fly over obstacles with your current unit.\n\nOnly a few ground units have boosters.
|
||||||
|
# hint.command = Press [accent][[G][] to command nearby units into formation.
|
||||||
|
# hint.command.mobile = [accent][[Double-tap][] your unit to command nearby units into formation.
|
||||||
|
# hint.payloadPickup = Press [accent][[[] to pick up small blocks or units.
|
||||||
|
# hint.payloadPickup.mobile = [accent]Tap and hold[] a small block or unit to pick it up.
|
||||||
|
# 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.
|
||||||
|
|
||||||
item.copper.description = Используется во всех типах построек и боеприпасов.
|
item.copper.description = Используется во всех типах построек и боеприпасов.
|
||||||
item.copper.details = Медь. Аномально широко распространённый металл на Серпуло. Структурно слабый, если не укреплён.
|
item.copper.details = Медь. Аномально широко распространённый металл на Серпуло. Структурно слабый, если не укреплён.
|
||||||
@@ -1268,7 +1288,7 @@ item.coal.details = Похоже, что это окаменевшее раст
|
|||||||
item.titanium.description = Широко используется в транспортировке жидкостей, бурах и авиации.
|
item.titanium.description = Широко используется в транспортировке жидкостей, бурах и авиации.
|
||||||
item.thorium.description = Используется в прочных постройках и как ядерного топлива.
|
item.thorium.description = Используется в прочных постройках и как ядерного топлива.
|
||||||
item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов.
|
item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов.
|
||||||
item.scrap.details = Остататки старых построек и единиц.
|
item.scrap.details = Остатки старых построек и единиц.
|
||||||
item.silicon.description = Используется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах для турелей.
|
item.silicon.description = Используется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах для турелей.
|
||||||
item.plastanium.description = Используется в продвинутой авиации, изоляции и осколочных боеприпасах.
|
item.plastanium.description = Используется в продвинутой авиации, изоляции и осколочных боеприпасах.
|
||||||
item.phase-fabric.description = Используется в продвинутой электронике и самовосстанавливающихся постройках.
|
item.phase-fabric.description = Используется в продвинутой электронике и самовосстанавливающихся постройках.
|
||||||
@@ -1283,7 +1303,7 @@ liquid.slag.description = Может быть переработан в разд
|
|||||||
liquid.oil.description = Используется в производстве продвинутых материалов и как зажигательный боеприпас.
|
liquid.oil.description = Используется в производстве продвинутых материалов и как зажигательный боеприпас.
|
||||||
liquid.cryofluid.description = Используется в качестве охлаждающей жидкости для реакторов, турелей и фабрик.
|
liquid.cryofluid.description = Используется в качестве охлаждающей жидкости для реакторов, турелей и фабрик.
|
||||||
|
|
||||||
block.resupply-point.description = Снаряжает медными боеприпасами ближайщие боевые единицы. Не совместим с единицами, требующими питания от батареи.
|
block.resupply-point.description = Снаряжает медными боеприпасами ближайшие боевые единицы. Не совместим с единицами, требующими питания от батареи.
|
||||||
block.armored-conveyor.description = Перемещает предметы вперёд. Не принимает вход по бокам.
|
block.armored-conveyor.description = Перемещает предметы вперёд. Не принимает вход по бокам.
|
||||||
block.illuminator.description = Излучает свет.
|
block.illuminator.description = Излучает свет.
|
||||||
block.message.description = Сохраняет сообщение для связи между союзниками.
|
block.message.description = Сохраняет сообщение для связи между союзниками.
|
||||||
@@ -1341,7 +1361,7 @@ block.router.details = Необходимое зло. Не рекомендуе
|
|||||||
block.distributor.description = Равномерно распределяет входящие предметы по 7 выходящим направлениям.
|
block.distributor.description = Равномерно распределяет входящие предметы по 7 выходящим направлениям.
|
||||||
block.overflow-gate.description = Выводит предметы по бокам, только если передний путь заблокирован. Нельзя использовать вплотную к другим затворам или шлюзам.
|
block.overflow-gate.description = Выводит предметы по бокам, только если передний путь заблокирован. Нельзя использовать вплотную к другим затворам или шлюзам.
|
||||||
block.underflow-gate.description = Противоположность избыточного затвора. Выводит предметы вперёд только в том случае, если боковые пути заблокированы. Нельзя использовать вплотную к другим шлюзам или затворам.
|
block.underflow-gate.description = Противоположность избыточного затвора. Выводит предметы вперёд только в том случае, если боковые пути заблокированы. Нельзя использовать вплотную к другим шлюзам или затворам.
|
||||||
block.mass-driver.description = Постройка для дальней транспортировки предметов. Собирает несколько предметов и затем стреляет ими в другуе катапульты.
|
block.mass-driver.description = Постройка для дальней транспортировки предметов. Собирает несколько предметов и затем стреляет ими в другие катапульты.
|
||||||
block.mechanical-pump.description = Перекачивает и выводит жидкости. Не требует энергию.
|
block.mechanical-pump.description = Перекачивает и выводит жидкости. Не требует энергию.
|
||||||
block.rotary-pump.description = Перекачивает и выводит жидкости. Требует энергию.
|
block.rotary-pump.description = Перекачивает и выводит жидкости. Требует энергию.
|
||||||
block.thermal-pump.description = Перекачивает и выводит жидкости.
|
block.thermal-pump.description = Перекачивает и выводит жидкости.
|
||||||
@@ -1368,7 +1388,7 @@ block.solar-panel.description = Обеспечивает небольшое ко
|
|||||||
block.solar-panel-large.description = Обеспечивает небольшое количество энергии от солнца. Более эффективный вариант стандартной солнечной панели.
|
block.solar-panel-large.description = Обеспечивает небольшое количество энергии от солнца. Более эффективный вариант стандартной солнечной панели.
|
||||||
block.thorium-reactor.description = Вырабатывает значительное количество энергии из тория. Требует постоянного охлаждения. Взорвётся с большой силой при недостаточном количестве охлаждающей жидкости.
|
block.thorium-reactor.description = Вырабатывает значительное количество энергии из тория. Требует постоянного охлаждения. Взорвётся с большой силой при недостаточном количестве охлаждающей жидкости.
|
||||||
block.impact-reactor.description = Создаёт огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса.
|
block.impact-reactor.description = Создаёт огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса.
|
||||||
block.mechanical-drill.description = При размещении на соответствующей руде, остоянно выводит предметы в медленном темпе. Способен добывать только базовые ресурсы.
|
block.mechanical-drill.description = При размещении на соответствующей руде, постоянно выводит предметы в медленном темпе. Способен добывать только базовые ресурсы.
|
||||||
block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур.
|
block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур.
|
||||||
block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий.
|
block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий.
|
||||||
block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии.
|
block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии.
|
||||||
@@ -1426,7 +1446,7 @@ block.memory-cell.description = Хранит информацию для лог
|
|||||||
block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость.
|
block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость.
|
||||||
block.logic-display.description = Отображает произвольную графику из логического процессора.
|
block.logic-display.description = Отображает произвольную графику из логического процессора.
|
||||||
block.large-logic-display.description = Отображает произвольную графику из логического процессора.
|
block.large-logic-display.description = Отображает произвольную графику из логического процессора.
|
||||||
block.interplanetary-accelerator.description = Массивный рельсотронный ускоритель. Разгоняет ядро до второй космической скорости для межпланетных размещений.
|
block.interplanetary-accelerator.description = Массивный рельсотронный ускоритель. Ускоряет ядро позволяя преодолеть гравитацию для межпланетного развёртывания
|
||||||
|
|
||||||
unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости.
|
unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости.
|
||||||
unit.mace.description = Стреляет потоками огня по всем врагам поблизости.
|
unit.mace.description = Стреляет потоками огня по всем врагам поблизости.
|
||||||
|
|||||||
@@ -317,3 +317,4 @@
|
|||||||
63419=legacy-unit-factory-air|block-legacy-unit-factory-air-medium
|
63419=legacy-unit-factory-air|block-legacy-unit-factory-air-medium
|
||||||
63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium
|
63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium
|
||||||
63417=interplanetary-accelerator|block-interplanetary-accelerator-medium
|
63417=interplanetary-accelerator|block-interplanetary-accelerator-medium
|
||||||
|
63416=basalt-boulder|block-basalt-boulder-medium
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const log = function(context, obj){
|
function log(context, obj){
|
||||||
Vars.mods.scripts.log(context, String(obj))
|
Vars.mods.scripts.log(context, String(obj))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,15 +19,28 @@ let modName = "none"
|
|||||||
|
|
||||||
const print = text => log(modName + "/" + scriptName, text);
|
const print = text => log(modName + "/" + scriptName, text);
|
||||||
|
|
||||||
const extendContent = function(classType, name, params){
|
//js 'extend(Base, ..., {})' = java 'new Base(...) {}'
|
||||||
return new JavaAdapter(classType, params, name)
|
function extend(/*Base, ..., def*/){
|
||||||
|
const Base = arguments[0]
|
||||||
|
const def = arguments[arguments.length - 1]
|
||||||
|
//swap order from Base, def, ... to Base, ..., def
|
||||||
|
const args = [Base, def].concat(Array.from(arguments).splice(1, arguments.length - 2))
|
||||||
|
|
||||||
|
//forward constructor arguments to new JavaAdapter
|
||||||
|
const instance = JavaAdapter.apply(null, args)
|
||||||
|
//JavaAdapter only overrides functions; set fields too
|
||||||
|
for(var i in def){
|
||||||
|
if(typeof(def[i]) != "function"){
|
||||||
|
instance[i] = def[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance
|
||||||
}
|
}
|
||||||
|
|
||||||
const extend = function(classType, params){
|
//For backwards compatibility, use extend instead
|
||||||
return new JavaAdapter(classType, params)
|
const extendContent = extend;
|
||||||
}
|
|
||||||
|
|
||||||
//these are not sctrictly necessary, but are kept for edge cases
|
//these are not strictly necessary, but are kept for edge cases
|
||||||
const run = method => new java.lang.Runnable(){run: method}
|
const run = method => new java.lang.Runnable(){run: method}
|
||||||
const boolf = method => new Boolf(){get: method}
|
const boolf = method => new Boolf(){get: method}
|
||||||
const boolp = method => new Boolp(){get: method}
|
const boolp = method => new Boolp(){get: method}
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const log = function(context, obj){
|
function log(context, obj){
|
||||||
Vars.mods.getScripts().log(context, String(obj))
|
Vars.mods.scripts.log(context, String(obj))
|
||||||
}
|
}
|
||||||
|
|
||||||
const readString = path => Vars.mods.getScripts().readString(path)
|
const readString = path => Vars.mods.scripts.readString(path)
|
||||||
const readBytes = path => Vars.mods.getScripts().readBytes(path)
|
const readBytes = path => Vars.mods.scripts.readBytes(path)
|
||||||
const loadMusic = path => Vars.mods.getScripts().loadMusic(path)
|
const loadMusic = path => Vars.mods.scripts.loadMusic(path)
|
||||||
const loadSound = path => Vars.mods.getScripts().loadSound(path)
|
const loadSound = path => Vars.mods.scripts.loadSound(path)
|
||||||
|
|
||||||
const readFile = (purpose, ext, cons) => Vars.mods.scripts.readFile(purpose, ext, cons);
|
const readFile = (purpose, ext, cons) => Vars.mods.scripts.readFile(purpose, ext, cons);
|
||||||
const readBinFile = (purpose, ext, cons) => Vars.mods.scripts.readBinFile(purpose, ext, cons);
|
const readBinFile = (purpose, ext, cons) => Vars.mods.scripts.readBinFile(purpose, ext, cons);
|
||||||
@@ -21,15 +21,28 @@ let modName = "none"
|
|||||||
|
|
||||||
const print = text => log(modName + "/" + scriptName, text);
|
const print = text => log(modName + "/" + scriptName, text);
|
||||||
|
|
||||||
const extendContent = function(classType, name, params){
|
//js 'extend(Base, ..., {})' = java 'new Base(...) {}'
|
||||||
return new JavaAdapter(classType, params, name)
|
function extend(/*Base, ..., def*/){
|
||||||
|
const Base = arguments[0]
|
||||||
|
const def = arguments[arguments.length - 1]
|
||||||
|
//swap order from Base, def, ... to Base, ..., def
|
||||||
|
const args = [Base, def].concat(Array.from(arguments).splice(1, arguments.length - 2))
|
||||||
|
|
||||||
|
//forward constructor arguments to new JavaAdapter
|
||||||
|
const instance = JavaAdapter.apply(null, args)
|
||||||
|
//JavaAdapter only overrides functions; set fields too
|
||||||
|
for(var i in def){
|
||||||
|
if(typeof(def[i]) != "function"){
|
||||||
|
instance[i] = def[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instance
|
||||||
}
|
}
|
||||||
|
|
||||||
const extend = function(classType, params){
|
//For backwards compatibility, use extend instead
|
||||||
return new JavaAdapter(classType, params)
|
const extendContent = extend;
|
||||||
}
|
|
||||||
|
|
||||||
//these are not sctrictly necessary, but are kept for edge cases
|
//these are not strictly necessary, but are kept for edge cases
|
||||||
const run = method => new java.lang.Runnable(){run: method}
|
const run = method => new java.lang.Runnable(){run: method}
|
||||||
const boolf = method => new Boolf(){get: method}
|
const boolf = method => new Boolf(){get: method}
|
||||||
const boolp = method => new Boolp(){get: method}
|
const boolp = method => new Boolp(){get: method}
|
||||||
@@ -73,6 +86,7 @@ importPackage(Packages.mindustry.entities)
|
|||||||
importPackage(Packages.mindustry.entities.abilities)
|
importPackage(Packages.mindustry.entities.abilities)
|
||||||
importPackage(Packages.mindustry.entities.bullet)
|
importPackage(Packages.mindustry.entities.bullet)
|
||||||
importPackage(Packages.mindustry.entities.comp)
|
importPackage(Packages.mindustry.entities.comp)
|
||||||
|
importPackage(Packages.mindustry.entities.effect)
|
||||||
importPackage(Packages.mindustry.entities.units)
|
importPackage(Packages.mindustry.entities.units)
|
||||||
importPackage(Packages.mindustry.game)
|
importPackage(Packages.mindustry.game)
|
||||||
importPackage(Packages.mindustry.gen)
|
importPackage(Packages.mindustry.gen)
|
||||||
@@ -134,6 +148,8 @@ const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent
|
|||||||
const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent
|
const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent
|
||||||
const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent
|
const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent
|
||||||
const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent
|
const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent
|
||||||
|
const UnitControlEvent = Packages.mindustry.game.EventType.UnitControlEvent
|
||||||
|
const PickupEvent = Packages.mindustry.game.EventType.PickupEvent
|
||||||
const TapEvent = Packages.mindustry.game.EventType.TapEvent
|
const TapEvent = Packages.mindustry.game.EventType.TapEvent
|
||||||
const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent
|
const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent
|
||||||
const DepositEvent = Packages.mindustry.game.EventType.DepositEvent
|
const DepositEvent = Packages.mindustry.game.EventType.DepositEvent
|
||||||
@@ -142,6 +158,8 @@ const SectorCaptureEvent = Packages.mindustry.game.EventType.SectorCaptureEvent
|
|||||||
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
|
const PlayerChatEvent = Packages.mindustry.game.EventType.PlayerChatEvent
|
||||||
const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent
|
const ClientPreConnectEvent = Packages.mindustry.game.EventType.ClientPreConnectEvent
|
||||||
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
|
const CommandIssueEvent = Packages.mindustry.game.EventType.CommandIssueEvent
|
||||||
|
const SchematicCreateEvent = Packages.mindustry.game.EventType.SchematicCreateEvent
|
||||||
|
const SectorLaunchEvent = Packages.mindustry.game.EventType.SectorLaunchEvent
|
||||||
const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
|
const LaunchItemEvent = Packages.mindustry.game.EventType.LaunchItemEvent
|
||||||
const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent
|
const SectorInvasionEvent = Packages.mindustry.game.EventType.SectorInvasionEvent
|
||||||
const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent
|
const SectorLoseEvent = Packages.mindustry.game.EventType.SectorLoseEvent
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 828 B After Width: | Height: | Size: 831 B |
|
Before Width: | Height: | Size: 675 KiB After Width: | Height: | Size: 667 KiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 440 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 3.0 MiB After Width: | Height: | Size: 3.0 MiB |
|
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 438 KiB After Width: | Height: | Size: 438 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
@@ -88,7 +88,7 @@ public class Vars implements Loadable{
|
|||||||
/** duration of time between turns in ticks */
|
/** duration of time between turns in ticks */
|
||||||
public static final float turnDuration = 2 * Time.toMinutes;
|
public static final float turnDuration = 2 * Time.toMinutes;
|
||||||
/** chance of an invasion per turn, 1 = 100% */
|
/** chance of an invasion per turn, 1 = 100% */
|
||||||
public static final float baseInvasionChance = 1f / 30f;
|
public static final float baseInvasionChance = 1f / 50f;
|
||||||
/** how many turns have to pass before invasions start */
|
/** how many turns have to pass before invasions start */
|
||||||
public static final int invasionGracePeriod = 20;
|
public static final int invasionGracePeriod = 20;
|
||||||
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */
|
/** min armor fraction damage; e.g. 0.05 = at least 5% damage */
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package mindustry.ai;
|
package mindustry.ai;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
|
import arc.input.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
@@ -17,16 +19,18 @@ import mindustry.world.*;
|
|||||||
import mindustry.world.blocks.defense.*;
|
import mindustry.world.blocks.defense.*;
|
||||||
import mindustry.world.blocks.production.*;
|
import mindustry.world.blocks.production.*;
|
||||||
import mindustry.world.blocks.storage.*;
|
import mindustry.world.blocks.storage.*;
|
||||||
|
import mindustry.world.blocks.storage.CoreBlock.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class BaseAI{
|
public class BaseAI{
|
||||||
private static final Vec2 axis = new Vec2(), rotator = new Vec2();
|
private static final Vec2 axis = new Vec2(), rotator = new Vec2();
|
||||||
private static final float correctPercent = 0.5f;
|
private static final float correctPercent = 0.5f;
|
||||||
private static final float step = 5;
|
|
||||||
private static final int attempts = 4;
|
private static final int attempts = 4;
|
||||||
private static final float emptyChance = 0.01f;
|
private static final float emptyChance = 0.01f;
|
||||||
private static final int timerStep = 0, timerSpawn = 1;
|
private static final int timerStep = 0, timerSpawn = 1, timerRefreshPath = 2;
|
||||||
|
private static final int pathStep = 50;
|
||||||
|
private static final Seq<Tile> tmpTiles = new Seq<>();
|
||||||
|
|
||||||
private static int correct = 0, incorrect = 0;
|
private static int correct = 0, incorrect = 0;
|
||||||
|
|
||||||
@@ -36,6 +40,13 @@ public class BaseAI{
|
|||||||
TeamData data;
|
TeamData data;
|
||||||
Interval timer = new Interval(4);
|
Interval timer = new Interval(4);
|
||||||
|
|
||||||
|
IntSet path = new IntSet();
|
||||||
|
IntSet calcPath = new IntSet();
|
||||||
|
@Nullable Tile calcTile;
|
||||||
|
boolean calculating, startedCalculating;
|
||||||
|
int calcCount = 0;
|
||||||
|
int totalCalcs = 0;
|
||||||
|
|
||||||
public BaseAI(TeamData data){
|
public BaseAI(TeamData data){
|
||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
@@ -53,8 +64,76 @@ public class BaseAI{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//refresh path
|
||||||
|
if(!calculating && (timer.get(timerRefreshPath, 3f * Time.toMinutes) || !startedCalculating) && data.hasCore()){
|
||||||
|
calculating = true;
|
||||||
|
startedCalculating = true;
|
||||||
|
calcPath.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//didn't find tile in time
|
||||||
|
if(calculating && calcCount >= world.width() * world.height()){
|
||||||
|
calculating = false;
|
||||||
|
calcCount = 0;
|
||||||
|
calcPath.clear();
|
||||||
|
totalCalcs ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//calculate path for units so schematics are not placed on it
|
||||||
|
if(calculating){
|
||||||
|
if(calcTile == null){
|
||||||
|
Vars.spawner.eachGroundSpawn((x, y) -> calcTile = world.tile(x, y));
|
||||||
|
if(calcTile == null){
|
||||||
|
calculating = false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore);
|
||||||
|
|
||||||
|
int[][] weights = field.weights;
|
||||||
|
for(int i = 0; i < pathStep; i++){
|
||||||
|
int minCost = Integer.MAX_VALUE;
|
||||||
|
int cx = calcTile.x, cy = calcTile.y;
|
||||||
|
boolean foundAny = false;
|
||||||
|
for(Point2 p : Geometry.d4){
|
||||||
|
int nx = cx + p.x, ny = cy + p.y;
|
||||||
|
|
||||||
|
Tile other = world.tile(nx, ny);
|
||||||
|
if(other != null && weights[nx][ny] < minCost && weights[nx][ny] != -1){
|
||||||
|
minCost = weights[nx][ny];
|
||||||
|
calcTile = other;
|
||||||
|
foundAny = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//didn't find anything, break out of loop, this will trigger a clear later
|
||||||
|
if(!foundAny){
|
||||||
|
calcCount = Integer.MAX_VALUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
calcPath.add(calcTile.pos());
|
||||||
|
|
||||||
|
//found the end.
|
||||||
|
if(calcTile.build instanceof CoreBuild b && b.team == state.rules.defaultTeam){
|
||||||
|
//clean up calculations and flush results
|
||||||
|
calculating = false;
|
||||||
|
calcCount = 0;
|
||||||
|
path.clear();
|
||||||
|
path.addAll(calcPath);
|
||||||
|
calcPath.clear();
|
||||||
|
calcTile = null;
|
||||||
|
totalCalcs ++;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
calcCount ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//only schedule when there's something to build.
|
//only schedule when there's something to build.
|
||||||
if(data.blocks.isEmpty() && timer.get(timerStep, Mathf.lerp(20f, 4f, data.team.rules().aiTier))){
|
if(totalCalcs > 0 && data.blocks.isEmpty() && timer.get(timerStep, Mathf.lerp(20f, 4f, data.team.rules().aiTier))){
|
||||||
if(!triedWalls){
|
if(!triedWalls){
|
||||||
tryWalls();
|
tryWalls();
|
||||||
triedWalls = true;
|
triedWalls = true;
|
||||||
@@ -123,6 +202,13 @@ public class BaseAI{
|
|||||||
if(!Build.validPlace(tile.block, data.team, realX, realY, tile.rotation)){
|
if(!Build.validPlace(tile.block, data.team, realX, realY, tile.rotation)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Tile wtile = world.tile(realX, realY);
|
||||||
|
|
||||||
|
//may intersect AI path
|
||||||
|
tmpTiles.clear();
|
||||||
|
if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//make sure at least X% of resource requirements are met
|
//make sure at least X% of resource requirements are met
|
||||||
@@ -191,7 +277,8 @@ public class BaseAI{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(any && Build.validPlace(wall, data.team, tile.x, tile.y, 0)){
|
tmpTiles.clear();
|
||||||
|
if(any && Build.validPlace(wall, data.team, tile.x, tile.y, 0) && !tile.getLinkedTilesAs(wall, tmpTiles).contains(t -> path.contains(t.pos()))){
|
||||||
data.blocks.add(new BlockPlan(tile.x, tile.y, (short)0, wall.id, null));
|
data.blocks.add(new BlockPlan(tile.x, tile.y, (short)0, wall.id, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,6 @@ public class BuilderAI extends AIController{
|
|||||||
@Override
|
@Override
|
||||||
public void updateMovement(){
|
public void updateMovement(){
|
||||||
|
|
||||||
if(unit.moving()){
|
|
||||||
unit.lookAt(unit.vel.angle());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(target != null && shouldShoot()){
|
if(target != null && shouldShoot()){
|
||||||
unit.lookAt(target);
|
unit.lookAt(target);
|
||||||
}
|
}
|
||||||
@@ -49,7 +45,7 @@ public class BuilderAI extends AIController{
|
|||||||
BuildPlan req = unit.buildPlan();
|
BuildPlan req = unit.buildPlan();
|
||||||
|
|
||||||
boolean valid =
|
boolean valid =
|
||||||
(req.tile().build instanceof ConstructBuild && req.tile().<ConstructBuild>bc().cblock == req.block) ||
|
(req.tile() != null && req.tile().build instanceof ConstructBuild && req.tile().<ConstructBuild>bc().cblock == req.block) ||
|
||||||
(req.breaking ?
|
(req.breaking ?
|
||||||
Build.validBreak(unit.team(), req.x, req.y) :
|
Build.validBreak(unit.team(), req.x, req.y) :
|
||||||
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation));
|
Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation));
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ public class Blocks implements ContentList{
|
|||||||
//environment
|
//environment
|
||||||
air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space,
|
air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, mud, ice, snow, darksandTaintedWater, space,
|
||||||
dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster,
|
dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster,
|
||||||
iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, grass, salt,
|
iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, boulder, snowBoulder, basaltBoulder, grass, salt,
|
||||||
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall,
|
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, saltWall,
|
||||||
darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal,
|
darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal,
|
||||||
pebbles, tendrils,
|
pebbles, tendrils,
|
||||||
@@ -415,6 +415,10 @@ public class Blocks implements ContentList{
|
|||||||
variants = 2;
|
variants = 2;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
basaltBoulder = new Boulder("basalt-boulder"){{
|
||||||
|
variants = 2;
|
||||||
|
}};
|
||||||
|
|
||||||
moss = new Floor("moss"){{
|
moss = new Floor("moss"){{
|
||||||
variants = 3;
|
variants = 3;
|
||||||
attributes.set(Attribute.spores, 0.15f);
|
attributes.set(Attribute.spores, 0.15f);
|
||||||
@@ -1153,7 +1157,7 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
battery = new Battery("battery"){{
|
battery = new Battery("battery"){{
|
||||||
requirements(Category.power, with(Items.copper, 4, Items.lead, 20));
|
requirements(Category.power, with(Items.copper, 5, Items.lead, 20));
|
||||||
consumes.powerBuffered(4000f);
|
consumes.powerBuffered(4000f);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -1354,7 +1358,7 @@ public class Blocks implements ContentList{
|
|||||||
//region storage
|
//region storage
|
||||||
|
|
||||||
coreShard = new CoreBlock("core-shard"){{
|
coreShard = new CoreBlock("core-shard"){{
|
||||||
requirements(Category.effect, BuildVisibility.editorOnly, with(Items.copper, 1000, Items.lead, 1000));
|
requirements(Category.effect, BuildVisibility.editorOnly, with(Items.copper, 1000, Items.lead, 800));
|
||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
|
|
||||||
unitType = UnitTypes.alpha;
|
unitType = UnitTypes.alpha;
|
||||||
@@ -1508,6 +1512,7 @@ public class Blocks implements ContentList{
|
|||||||
shootEffect = Fx.shootLiquid;
|
shootEffect = Fx.shootLiquid;
|
||||||
range = 110f;
|
range = 110f;
|
||||||
health = 250 * size * size;
|
health = 250 * size * size;
|
||||||
|
flags = EnumSet.of(BlockFlag.turret, BlockFlag.extinguisher);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
lancer = new ChargeTurret("lancer"){{
|
lancer = new ChargeTurret("lancer"){{
|
||||||
@@ -2054,11 +2059,12 @@ public class Blocks implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{
|
interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{
|
||||||
requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 9000, Items.silicon, 9000, Items.thorium, 9000, Items.titanium, 9000, Items.surgeAlloy, 5000, Items.phaseFabric, 4000));
|
requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 16000, Items.silicon, 11000, Items.thorium, 13000, Items.titanium, 12000, Items.surgeAlloy, 6000, Items.phaseFabric, 5000));
|
||||||
researchCostMultiplier = 0.1f;
|
researchCostMultiplier = 0.1f;
|
||||||
size = 7;
|
size = 7;
|
||||||
hasPower = true;
|
hasPower = true;
|
||||||
consumes.power(10f);
|
consumes.power(10f);
|
||||||
|
buildCostMultiplier = 0.5f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
//endregion campaign
|
//endregion campaign
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ public class TechTree implements ContentList{
|
|||||||
node(impact0078, Seq.with(
|
node(impact0078, Seq.with(
|
||||||
new SectorComplete(tarFields),
|
new SectorComplete(tarFields),
|
||||||
new Research(Items.thorium),
|
new Research(Items.thorium),
|
||||||
new Research(overdriveProjector)
|
new Research(coreFoundation)
|
||||||
), () -> {
|
), () -> {
|
||||||
node(desolateRift, Seq.with(
|
node(desolateRift, Seq.with(
|
||||||
new SectorComplete(impact0078),
|
new SectorComplete(impact0078),
|
||||||
|
|||||||
@@ -995,6 +995,7 @@ public class UnitTypes implements ContentList{
|
|||||||
shots = 2;
|
shots = 2;
|
||||||
inaccuracy = 5f;
|
inaccuracy = 5f;
|
||||||
velocityRnd = 0.2f;
|
velocityRnd = 0.2f;
|
||||||
|
shootSound = Sounds.missile;
|
||||||
|
|
||||||
bullet = new MissileBulletType(3f, 12){{
|
bullet = new MissileBulletType(3f, 12){{
|
||||||
width = 8f;
|
width = 8f;
|
||||||
@@ -1055,7 +1056,7 @@ public class UnitTypes implements ContentList{
|
|||||||
ejectEffect = Fx.casing1;
|
ejectEffect = Fx.casing1;
|
||||||
rotateSpeed = 8f;
|
rotateSpeed = 8f;
|
||||||
bullet = missiles;
|
bullet = missiles;
|
||||||
shootSound = Sounds.shoot;
|
shootSound = Sounds.missile;
|
||||||
rotate = true;
|
rotate = true;
|
||||||
occlusion = 6f;
|
occlusion = 6f;
|
||||||
}},
|
}},
|
||||||
@@ -1066,7 +1067,7 @@ public class UnitTypes implements ContentList{
|
|||||||
rotateSpeed = 8f;
|
rotateSpeed = 8f;
|
||||||
ejectEffect = Fx.casing1;
|
ejectEffect = Fx.casing1;
|
||||||
bullet = missiles;
|
bullet = missiles;
|
||||||
shootSound = Sounds.shoot;
|
shootSound = Sounds.missile;
|
||||||
rotate = true;
|
rotate = true;
|
||||||
occlusion = 6f;
|
occlusion = 6f;
|
||||||
}},
|
}},
|
||||||
@@ -1147,7 +1148,7 @@ public class UnitTypes implements ContentList{
|
|||||||
y = 27f;
|
y = 27f;
|
||||||
rotateSpeed = 2f;
|
rotateSpeed = 2f;
|
||||||
reload = 9f;
|
reload = 9f;
|
||||||
shootSound = Sounds.flame;
|
shootSound = Sounds.shoot;
|
||||||
occlusion = 7f;
|
occlusion = 7f;
|
||||||
rotate = true;
|
rotate = true;
|
||||||
recoil = 0.5f;
|
recoil = 0.5f;
|
||||||
@@ -1249,6 +1250,7 @@ public class UnitTypes implements ContentList{
|
|||||||
defaultController = RepairAI::new;
|
defaultController = RepairAI::new;
|
||||||
|
|
||||||
mineTier = 3;
|
mineTier = 3;
|
||||||
|
mineSpeed = 4f;
|
||||||
health = 500;
|
health = 500;
|
||||||
armor = 5f;
|
armor = 5f;
|
||||||
speed = 2.5f;
|
speed = 2.5f;
|
||||||
@@ -1692,8 +1694,8 @@ public class UnitTypes implements ContentList{
|
|||||||
|
|
||||||
bullet = new RailBulletType(){{
|
bullet = new RailBulletType(){{
|
||||||
shootEffect = Fx.railShoot;
|
shootEffect = Fx.railShoot;
|
||||||
speed = 67f;
|
length = 500;
|
||||||
lifetime = 8f;
|
updateEffectSeg = 60f;
|
||||||
pierceEffect = Fx.railHit;
|
pierceEffect = Fx.railHit;
|
||||||
updateEffect = Fx.railTrail;
|
updateEffect = Fx.railTrail;
|
||||||
hitEffect = Fx.massiveExplosion;
|
hitEffect = Fx.massiveExplosion;
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ import static mindustry.Vars.*;
|
|||||||
public class Control implements ApplicationListener, Loadable{
|
public class Control implements ApplicationListener, Loadable{
|
||||||
public Saves saves;
|
public Saves saves;
|
||||||
public SoundControl sound;
|
public SoundControl sound;
|
||||||
public Tutorial tutorial;
|
|
||||||
public InputHandler input;
|
public InputHandler input;
|
||||||
|
|
||||||
private Interval timer = new Interval(2);
|
private Interval timer = new Interval(2);
|
||||||
@@ -53,7 +52,6 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
public Control(){
|
public Control(){
|
||||||
saves = new Saves();
|
saves = new Saves();
|
||||||
tutorial = new Tutorial();
|
|
||||||
sound = new SoundControl();
|
sound = new SoundControl();
|
||||||
|
|
||||||
Events.on(StateChangeEvent.class, event -> {
|
Events.on(StateChangeEvent.class, event -> {
|
||||||
@@ -87,7 +85,6 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
Events.on(ResetEvent.class, event -> {
|
Events.on(ResetEvent.class, event -> {
|
||||||
player.reset();
|
player.reset();
|
||||||
tutorial.reset();
|
|
||||||
|
|
||||||
hiscore = false;
|
hiscore = false;
|
||||||
saves.resetSave();
|
saves.resetSave();
|
||||||
@@ -164,7 +161,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
if(state.isCampaign() && !net.client() && !headless){
|
if(state.isCampaign() && !net.client() && !headless){
|
||||||
|
|
||||||
//save gameover sate immediately
|
//save gameover sate immediately
|
||||||
if(saves.getCurrent() != null && !state.rules.tutorial){
|
if(saves.getCurrent() != null){
|
||||||
saves.getCurrent().save();
|
saves.getCurrent().save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -226,7 +223,7 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
for(TechNode node : TechTree.all){
|
for(TechNode node : TechTree.all){
|
||||||
if(!node.content.unlocked() && node.requirements.length == 0 && !node.objectives.contains(o -> !o.complete())){
|
if(!node.content.unlocked() && node.requirements.length == 0 && !node.objectives.contains(o -> !o.complete())){
|
||||||
node.content.unlocked();
|
node.content.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -408,13 +405,6 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
public void init(){
|
public void init(){
|
||||||
platform.updateRPC();
|
platform.updateRPC();
|
||||||
|
|
||||||
//just a regular reminder
|
|
||||||
if(!OS.prop("user.name").equals("anuke") && !OS.hasEnv("iknowwhatimdoing")){
|
|
||||||
app.post(() -> app.post(() -> {
|
|
||||||
ui.showStartupInfo("@indev.popup");
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
//display UI scale changed dialog
|
//display UI scale changed dialog
|
||||||
if(Core.settings.getBool("uiscalechanged", false)){
|
if(Core.settings.getBool("uiscalechanged", false)){
|
||||||
Core.app.post(() -> Core.app.post(() -> {
|
Core.app.post(() -> Core.app.post(() -> {
|
||||||
@@ -479,10 +469,6 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
if(state.isGame()){
|
if(state.isGame()){
|
||||||
input.update();
|
input.update();
|
||||||
|
|
||||||
if(state.rules.tutorial){
|
|
||||||
tutorial.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
//auto-update rpc every 5 seconds
|
//auto-update rpc every 5 seconds
|
||||||
if(timer.get(0, 60 * 5)){
|
if(timer.get(0, 60 * 5)){
|
||||||
platform.updateRPC();
|
platform.updateRPC();
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class GameState{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPaused(){
|
public boolean isPaused(){
|
||||||
return (is(State.paused) && !net.active()) || (gameOver && !net.active()) || (serverPaused && !isMenu());
|
return (is(State.paused) && !net.active()) || (gameOver && (!net.active() || isCampaign())) || (serverPaused && !isMenu());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlaying(){
|
public boolean isPlaying(){
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ public class Logic implements ApplicationListener{
|
|||||||
Events.fire(new SectorCaptureEvent(state.rules.sector));
|
Events.fire(new SectorCaptureEvent(state.rules.sector));
|
||||||
|
|
||||||
//save, just in case
|
//save, just in case
|
||||||
if(!headless){
|
if(!headless && !net.client()){
|
||||||
control.saves.saveSector(state.rules.sector);
|
control.saves.saveSector(state.rules.sector);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
private static final Vec2 vector = new Vec2();
|
private static final Vec2 vector = new Vec2();
|
||||||
private static final Rect viewport = new Rect();
|
private static final Rect viewport = new Rect();
|
||||||
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
|
/** If a player goes away of their server-side coordinates by this distance, they get teleported back. */
|
||||||
private static final float correctDist = 16f;
|
private static final float correctDist = tilesize * 8f;
|
||||||
|
|
||||||
public final Administration admins = new Administration();
|
public final Administration admins = new Administration();
|
||||||
public final CommandHandler clientCommands = new CommandHandler("/");
|
public final CommandHandler clientCommands = new CommandHandler("/");
|
||||||
@@ -638,12 +638,12 @@ public class NetServer implements ApplicationListener{
|
|||||||
Unit unit = player.unit();
|
Unit unit = player.unit();
|
||||||
|
|
||||||
long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime);
|
long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime);
|
||||||
float maxSpeed = ((player.unit().type.canBoost && player.unit().isFlying()) ? player.unit().type.boostMultiplier : 1f) * player.unit().speed();
|
float maxSpeed = unit.realSpeed();
|
||||||
if(unit.isGrounded()){
|
if(unit.isGrounded()){
|
||||||
maxSpeed *= unit.floorSpeedMultiplier();
|
maxSpeed *= unit.floorSpeedMultiplier();
|
||||||
}
|
}
|
||||||
|
|
||||||
float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.1f;
|
float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.2f;
|
||||||
|
|
||||||
//ignore the position if the player thinks they're dead, or the unit is wrong
|
//ignore the position if the player thinks they're dead, or the unit is wrong
|
||||||
boolean ignorePosition = dead || unit.id != unitID;
|
boolean ignorePosition = dead || unit.id != unitID;
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
public MinimapFragment minimapfrag;
|
public MinimapFragment minimapfrag;
|
||||||
public PlayerListFragment listfrag;
|
public PlayerListFragment listfrag;
|
||||||
public LoadingFragment loadfrag;
|
public LoadingFragment loadfrag;
|
||||||
|
public HintsFragment hints;
|
||||||
|
|
||||||
public WidgetGroup menuGroup, hudGroup;
|
public WidgetGroup menuGroup, hudGroup;
|
||||||
|
|
||||||
@@ -140,12 +141,6 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//draw overlay for buttons
|
|
||||||
if(state.rules.tutorial){
|
|
||||||
control.tutorial.draw();
|
|
||||||
Draw.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
Events.fire(Trigger.uiDrawEnd);
|
Events.fire(Trigger.uiDrawEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,6 +151,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
menufrag = new MenuFragment();
|
menufrag = new MenuFragment();
|
||||||
hudfrag = new HudFragment();
|
hudfrag = new HudFragment();
|
||||||
|
hints = new HintsFragment();
|
||||||
chatfrag = new ChatFragment();
|
chatfrag = new ChatFragment();
|
||||||
minimapfrag = new MinimapFragment();
|
minimapfrag = new MinimapFragment();
|
||||||
listfrag = new PlayerListFragment();
|
listfrag = new PlayerListFragment();
|
||||||
@@ -526,7 +522,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
|
|
||||||
//TODO move?
|
//TODO move?
|
||||||
|
|
||||||
public static String formatAmount(long number){
|
public static String formatAmount(int number){
|
||||||
if(number >= 1_000_000_000){
|
if(number >= 1_000_000_000){
|
||||||
return Strings.fixed(number / 1_000_000_000f, 1) + "[gray]" + Core.bundle.get("unit.billions") + "[]";
|
return Strings.fixed(number / 1_000_000_000f, 1) + "[gray]" + Core.bundle.get("unit.billions") + "[]";
|
||||||
}else if(number >= 1_000_000){
|
}else if(number >= 1_000_000){
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public class Damage{
|
|||||||
private static Rect rect = new Rect();
|
private static Rect rect = new Rect();
|
||||||
private static Rect hitrect = new Rect();
|
private static Rect hitrect = new Rect();
|
||||||
private static Vec2 tr = new Vec2();
|
private static Vec2 tr = new Vec2();
|
||||||
|
private static Seq<Unit> units = new Seq<>();
|
||||||
private static GridBits bits = new GridBits(30, 30);
|
private static GridBits bits = new GridBits(30, 30);
|
||||||
private static IntQueue propagation = new IntQueue();
|
private static IntQueue propagation = new IntQueue();
|
||||||
private static IntSet collidedBlocks = new IntSet();
|
private static IntSet collidedBlocks = new IntSet();
|
||||||
@@ -117,14 +118,16 @@ public class Damage{
|
|||||||
Building tile = world.build(cx, cy);
|
Building tile = world.build(cx, cy);
|
||||||
boolean collide = tile != null && collidedBlocks.add(tile.pos());
|
boolean collide = tile != null && collidedBlocks.add(tile.pos());
|
||||||
|
|
||||||
if(collide && tile.team != team && tile.collide(hitter)){
|
if(hitter.damage > 0){
|
||||||
tile.collision(hitter);
|
if(collide && tile.team != team && tile.collide(hitter)){
|
||||||
hitter.type.hit(hitter, tile.x, tile.y);
|
tile.collision(hitter);
|
||||||
}
|
hitter.type.hit(hitter, tile.x, tile.y);
|
||||||
|
}
|
||||||
|
|
||||||
//try to heal the tile
|
//try to heal the tile
|
||||||
if(collide && hitter.type.collides(hitter, tile)){
|
if(collide && hitter.type.collides(hitter, tile)){
|
||||||
hitter.type.hitTile(hitter, tile, 0f, false);
|
hitter.type.hitTile(hitter, tile, tile.health, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -161,20 +164,27 @@ public class Damage{
|
|||||||
rect.height += expand * 2;
|
rect.height += expand * 2;
|
||||||
|
|
||||||
Cons<Unit> cons = e -> {
|
Cons<Unit> cons = e -> {
|
||||||
if(!e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return;
|
|
||||||
|
|
||||||
e.hitbox(hitrect);
|
e.hitbox(hitrect);
|
||||||
|
|
||||||
Vec2 vec = Geometry.raycastRect(x, y, x2, y2, hitrect.grow(expand * 2));
|
Vec2 vec = Geometry.raycastRect(x, y, x2, y2, hitrect.grow(expand * 2));
|
||||||
|
|
||||||
if(vec != null){
|
if(vec != null && hitter.damage > 0){
|
||||||
effect.at(vec.x, vec.y);
|
effect.at(vec.x, vec.y);
|
||||||
e.collision(hitter, vec.x, vec.y);
|
e.collision(hitter, vec.x, vec.y);
|
||||||
hitter.collision(e, vec.x, vec.y);
|
hitter.collision(e, vec.x, vec.y);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Units.nearbyEnemies(team, rect, cons);
|
units.clear();
|
||||||
|
|
||||||
|
Units.nearbyEnemies(team, rect, u -> {
|
||||||
|
if(u.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)){
|
||||||
|
units.add(u);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
units.sort(u -> u.dst2(hitter));
|
||||||
|
units.each(cons);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ import mindustry.graphics.*;
|
|||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class UnitSpawnAbility extends Ability{
|
public class UnitSpawnAbility extends Ability{
|
||||||
public UnitType type;
|
public UnitType type;
|
||||||
public float spawnTime = 60f, spawnX, spawnY;
|
public float spawnTime = 60f, spawnX, spawnY;
|
||||||
@@ -31,7 +33,7 @@ public class UnitSpawnAbility extends Ability{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Unit unit){
|
public void update(Unit unit){
|
||||||
timer += Time.delta;
|
timer += Time.delta * state.rules.unitBuildSpeedMultiplier;
|
||||||
|
|
||||||
if(timer >= spawnTime && Units.canCreate(unit.team, type)){
|
if(timer >= spawnTime && Units.canCreate(unit.team, type)){
|
||||||
float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX);
|
float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX);
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package mindustry.entities.bullet;
|
package mindustry.entities.bullet;
|
||||||
|
|
||||||
|
import arc.math.geom.*;
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -15,36 +17,54 @@ public class RailBulletType extends BulletType{
|
|||||||
/** Multiplier of damage decreased per health pierced. */
|
/** Multiplier of damage decreased per health pierced. */
|
||||||
public float pierceDamageFactor = 1f;
|
public float pierceDamageFactor = 1f;
|
||||||
|
|
||||||
|
public float length = 100f;
|
||||||
|
|
||||||
|
public float updateEffectSeg = 20f;
|
||||||
|
|
||||||
public RailBulletType(){
|
public RailBulletType(){
|
||||||
pierceBuilding = true;
|
pierceBuilding = true;
|
||||||
pierce = true;
|
pierce = true;
|
||||||
reflectable = false;
|
reflectable = false;
|
||||||
hitEffect = Fx.none;
|
hitEffect = Fx.none;
|
||||||
despawnEffect = Fx.none;
|
despawnEffect = Fx.none;
|
||||||
|
collides = false;
|
||||||
|
lifetime = 1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float range(){
|
||||||
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
void handle(Bullet b, Posc pos, float initialHealth){
|
void handle(Bullet b, Posc pos, float initialHealth){
|
||||||
float sub = initialHealth*pierceDamageFactor;
|
float sub = initialHealth*pierceDamageFactor;
|
||||||
|
|
||||||
if(sub >= b.damage){
|
if(b.damage <= 0){
|
||||||
//cause a despawn
|
b.fdata = Math.min(b.fdata, b.dst(pos));
|
||||||
b.remove();
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(b.damage > 0){
|
||||||
|
pierceEffect.at(pos.getX(), pos.getY(), b.rotation());
|
||||||
|
|
||||||
|
hitEffect.at(pos.getX(), pos.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
//subtract health from each consecutive pierce
|
//subtract health from each consecutive pierce
|
||||||
b.damage -= Math.min(b.damage, sub);
|
b.damage -= Math.min(b.damage, sub);
|
||||||
|
|
||||||
if(b.damage > 0){
|
|
||||||
pierceEffect.at(pos.getX(), pos.getY(), b.rotation());
|
|
||||||
}
|
|
||||||
|
|
||||||
hitEffect.at(pos.getX(), pos.getY());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Bullet b){
|
public void init(Bullet b){
|
||||||
if(b.timer(1, 0.9f)){
|
super.init(b);
|
||||||
updateEffect.at(b.x, b.y, b.rotation());
|
|
||||||
|
b.fdata = length;
|
||||||
|
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false);
|
||||||
|
float resultLen = b.fdata;
|
||||||
|
|
||||||
|
Vec2 nor = Tmp.v1.set(b.vel).nor();
|
||||||
|
for(float i = 0; i <= resultLen; i += updateEffectSeg){
|
||||||
|
updateEffect.at(b.x + nor.x * i, b.y + nor.y * i, b.rotation());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -519,7 +519,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
public void dumpLiquid(Liquid liquid){
|
public void dumpLiquid(Liquid liquid){
|
||||||
int dump = this.cdump;
|
int dump = this.cdump;
|
||||||
|
|
||||||
if(!net.client() && state.isCampaign()) liquid.unlock();
|
if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) liquid.unlock();
|
||||||
|
|
||||||
for(int i = 0; i < proximity.size; i++){
|
for(int i = 0; i < proximity.size; i++){
|
||||||
incrementDump(proximity.size);
|
incrementDump(proximity.size);
|
||||||
@@ -620,7 +620,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
*/
|
*/
|
||||||
public void offload(Item item){
|
public void offload(Item item){
|
||||||
int dump = this.cdump;
|
int dump = this.cdump;
|
||||||
if(!net.client() && state.isCampaign()) item.unlock();
|
if(!net.client() && state.isCampaign() && team == state.rules.defaultTeam) item.unlock();
|
||||||
|
|
||||||
for(int i = 0; i < proximity.size; i++){
|
for(int i = 0; i < proximity.size; i++){
|
||||||
incrementDump(proximity.size);
|
incrementDump(proximity.size);
|
||||||
|
|||||||
@@ -29,9 +29,14 @@ abstract class CommanderComp implements Entityc, Posc{
|
|||||||
transient float minFormationSpeed;
|
transient float minFormationSpeed;
|
||||||
|
|
||||||
public void update(){
|
public void update(){
|
||||||
|
if(controlling.isEmpty()){
|
||||||
|
formation = null;
|
||||||
|
}
|
||||||
|
|
||||||
if(formation != null){
|
if(formation != null){
|
||||||
formation.anchor.set(x, y, 0);
|
formation.anchor.set(x, y, 0);
|
||||||
formation.updateSlots();
|
formation.updateSlots();
|
||||||
|
controlling.removeAll(u -> u.dead || !(u.controller() instanceof FormationAI ai && ai.leader == self()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,6 +69,8 @@ abstract class CommanderComp implements Entityc, Posc{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(units.isEmpty()) return;
|
||||||
|
|
||||||
//sort by hitbox size, then by distance
|
//sort by hitbox size, then by distance
|
||||||
units.sort(Structs.comps(Structs.comparingFloat(u -> -u.hitSize), Structs.comparingFloat(u -> u.dst2(this))));
|
units.sort(Structs.comps(Structs.comparingFloat(u -> -u.hitSize), Structs.comparingFloat(u -> u.dst2(this))));
|
||||||
units.truncate(type.commandLimit);
|
units.truncate(type.commandLimit);
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean canMine(){
|
public boolean canMine(){
|
||||||
return type.mineSpeed > 0;
|
return type.mineSpeed > 0 && type.mineTier >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ public class Rules{
|
|||||||
public boolean attackMode = false;
|
public boolean attackMode = false;
|
||||||
/** Whether this is the editor gamemode. */
|
/** Whether this is the editor gamemode. */
|
||||||
public boolean editor = false;
|
public boolean editor = false;
|
||||||
/** Whether the tutorial is enabled. False by default. */
|
|
||||||
public boolean tutorial = false;
|
|
||||||
/** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */
|
/** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */
|
||||||
public boolean canGameOver = true;
|
public boolean canGameOver = true;
|
||||||
/** Whether reactors can explode and damage other blocks. */
|
/** Whether reactors can explode and damage other blocks. */
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public class Saves{
|
|||||||
lastTimestamp = Time.millis();
|
lastTimestamp = Time.millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.isGame() && !state.gameOver && current != null && current.isAutosave() && !state.rules.tutorial){
|
if(state.isGame() && !state.gameOver && current != null && current.isAutosave()){
|
||||||
time += Time.delta;
|
time += Time.delta;
|
||||||
if(time > Core.settings.getInt("saveinterval") * 60){
|
if(time > Core.settings.getInt("saveinterval") * 60){
|
||||||
saving = true;
|
saving = true;
|
||||||
|
|||||||
@@ -1,308 +0,0 @@
|
|||||||
package mindustry.game;
|
|
||||||
|
|
||||||
import arc.*;
|
|
||||||
import arc.func.*;
|
|
||||||
import arc.graphics.g2d.*;
|
|
||||||
import arc.math.*;
|
|
||||||
import arc.scene.*;
|
|
||||||
import arc.scene.ui.*;
|
|
||||||
import arc.scene.ui.layout.*;
|
|
||||||
import arc.struct.*;
|
|
||||||
import arc.util.*;
|
|
||||||
import mindustry.content.*;
|
|
||||||
import mindustry.game.EventType.*;
|
|
||||||
import mindustry.gen.*;
|
|
||||||
import mindustry.graphics.*;
|
|
||||||
import mindustry.type.*;
|
|
||||||
import mindustry.world.*;
|
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
|
||||||
|
|
||||||
/** Handles tutorial state. */
|
|
||||||
public class Tutorial{
|
|
||||||
private static final int mineCopper = 18;
|
|
||||||
private static final int blocksToBreak = 3, blockOffset = -6;
|
|
||||||
|
|
||||||
ObjectSet<String> events = new ObjectSet<>();
|
|
||||||
ObjectIntMap<Block> blocksPlaced = new ObjectIntMap<>();
|
|
||||||
int sentence;
|
|
||||||
public TutorialStage stage = TutorialStage.values()[0];
|
|
||||||
|
|
||||||
public Tutorial(){
|
|
||||||
Events.on(BlockBuildEndEvent.class, event -> {
|
|
||||||
if(!event.breaking){
|
|
||||||
blocksPlaced.increment(event.tile.block(), 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Events.on(LineConfirmEvent.class, event -> events.add("lineconfirm"));
|
|
||||||
Events.on(TurretAmmoDeliverEvent.class, event -> events.add("ammo"));
|
|
||||||
Events.on(CoreItemDeliverEvent.class, event -> events.add("coreitem"));
|
|
||||||
Events.on(BlockInfoEvent.class, event -> events.add("blockinfo"));
|
|
||||||
Events.on(DepositEvent.class, event -> events.add("deposit"));
|
|
||||||
Events.on(WithdrawEvent.class, event -> events.add("withdraw"));
|
|
||||||
|
|
||||||
Events.on(ClientLoadEvent.class, e -> {
|
|
||||||
for(TutorialStage stage : TutorialStage.values()){
|
|
||||||
stage.load();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/** update tutorial state, transition if needed */
|
|
||||||
public void update(){
|
|
||||||
if(stage.done.get() && !canNext()){
|
|
||||||
next();
|
|
||||||
}else{
|
|
||||||
stage.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** draw UI overlay */
|
|
||||||
public void draw(){
|
|
||||||
if(!Core.scene.hasDialog()){
|
|
||||||
stage.draw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Resets tutorial state. */
|
|
||||||
public void reset(){
|
|
||||||
stage = TutorialStage.values()[0];
|
|
||||||
stage.begin();
|
|
||||||
blocksPlaced.clear();
|
|
||||||
events.clear();
|
|
||||||
sentence = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Goes on to the next tutorial step. */
|
|
||||||
public void next(){
|
|
||||||
stage = TutorialStage.values()[Mathf.clamp(stage.ordinal() + 1, 0, TutorialStage.values().length)];
|
|
||||||
stage.begin();
|
|
||||||
blocksPlaced.clear();
|
|
||||||
events.clear();
|
|
||||||
sentence = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canNext(){
|
|
||||||
return sentence + 1 < stage.sentences.size;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void nextSentence(){
|
|
||||||
if(canNext()){
|
|
||||||
sentence ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canPrev(){
|
|
||||||
return sentence > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void prevSentence(){
|
|
||||||
if(canPrev()){
|
|
||||||
sentence --;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum TutorialStage{
|
|
||||||
intro(
|
|
||||||
line -> Core.bundle.format(line, item(Items.copper), mineCopper),
|
|
||||||
() -> item(Items.copper) >= mineCopper
|
|
||||||
),
|
|
||||||
drill(() -> placed(Blocks.mechanicalDrill, 1)){
|
|
||||||
void draw(){
|
|
||||||
outline("category-production");
|
|
||||||
outline("block-mechanical-drill");
|
|
||||||
outline("confirmplace");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
blockinfo(() -> event("blockinfo")){
|
|
||||||
void draw(){
|
|
||||||
outline("category-production");
|
|
||||||
outline("block-mechanical-drill");
|
|
||||||
outline("blockinfo");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
conveyor(() -> placed(Blocks.conveyor, 2) && event("lineconfirm") && event("coreitem")){
|
|
||||||
void draw(){
|
|
||||||
outline("category-distribution");
|
|
||||||
outline("block-conveyor");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
turret(() -> placed(Blocks.duo, 1)){
|
|
||||||
void draw(){
|
|
||||||
outline("category-turret");
|
|
||||||
outline("block-duo");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
drillturret(() -> event("ammo")),
|
|
||||||
pause(() -> state.isPaused()){
|
|
||||||
void draw(){
|
|
||||||
if(mobile){
|
|
||||||
outline("pause");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
unpause(() -> !state.isPaused()){
|
|
||||||
void draw(){
|
|
||||||
if(mobile){
|
|
||||||
outline("pause");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
breaking(TutorialStage::blocksBroken){
|
|
||||||
void begin(){
|
|
||||||
placeBlocks();
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw(){
|
|
||||||
if(mobile){
|
|
||||||
outline("breakmode");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
withdraw(() -> event("withdraw")){
|
|
||||||
void begin(){
|
|
||||||
state.teams.playerCores().first().items.add(Items.copper, 10);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
deposit(() -> event("deposit")),
|
|
||||||
waves(() -> state.wave > 2 && state.enemies <= 0 && !spawner.isSpawning()){
|
|
||||||
void begin(){
|
|
||||||
state.rules.waveTimer = true;
|
|
||||||
logic.runWave();
|
|
||||||
}
|
|
||||||
|
|
||||||
void update(){
|
|
||||||
if(state.wave > 2){
|
|
||||||
state.rules.waveTimer = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
launch(() -> false){
|
|
||||||
void begin(){
|
|
||||||
state.rules.waveTimer = false;
|
|
||||||
state.wave = 5;
|
|
||||||
|
|
||||||
//end tutorial, never show it again
|
|
||||||
Events.fire(Trigger.tutorialComplete);
|
|
||||||
Core.settings.put("playedtutorial", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw(){
|
|
||||||
outline("waves");
|
|
||||||
}
|
|
||||||
},;
|
|
||||||
|
|
||||||
protected String line = "";
|
|
||||||
protected final Func<String, String> text;
|
|
||||||
protected Seq<String> sentences;
|
|
||||||
protected final Boolp done;
|
|
||||||
|
|
||||||
TutorialStage(Func<String, String> text, Boolp done){
|
|
||||||
this.text = text;
|
|
||||||
this.done = done;
|
|
||||||
}
|
|
||||||
|
|
||||||
TutorialStage(Boolp done){
|
|
||||||
this(line -> line, done);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** displayed tutorial stage text.*/
|
|
||||||
public String text(){
|
|
||||||
if(sentences == null){
|
|
||||||
load();
|
|
||||||
}
|
|
||||||
String line = sentences.get(control.tutorial.sentence);
|
|
||||||
return line.contains("{") ? text.get(line) : line;
|
|
||||||
}
|
|
||||||
|
|
||||||
void load(){
|
|
||||||
this.line = Core.bundle.has("tutorial." + name() + ".mobile") && mobile ? "tutorial." + name() + ".mobile" : "tutorial." + name();
|
|
||||||
this.sentences = Seq.select(Core.bundle.get(line).split("\n"), s -> !s.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** called every frame when this stage is active.*/
|
|
||||||
void update(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/** called when a stage begins.*/
|
|
||||||
void begin(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/** called when a stage needs to draw itself, usually over highlighted UI elements. */
|
|
||||||
void draw(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//utility
|
|
||||||
|
|
||||||
static void placeBlocks(){
|
|
||||||
Building core = state.teams.playerCores().first();
|
|
||||||
for(int i = 0; i < blocksToBreak; i++){
|
|
||||||
world.tile(core.tile().x + blockOffset, core.tile().y + i).remove();
|
|
||||||
world.tile(core.tile().x + blockOffset, core.tile().y + i).setBlock(Blocks.scrapWall, state.rules.defaultTeam);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean blocksBroken(){
|
|
||||||
Building core = state.teams.playerCores().first();
|
|
||||||
|
|
||||||
for(int i = 0; i < blocksToBreak; i++){
|
|
||||||
if(world.tile(core.tile.x + blockOffset, core.tile.y + i).block() == Blocks.scrapWall){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean event(String name){
|
|
||||||
return control.tutorial.events.contains(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean placed(Block block, int amount){
|
|
||||||
return placed(block) >= amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int placed(Block block){
|
|
||||||
return control.tutorial.blocksPlaced.get(block, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int item(Item item){
|
|
||||||
return state.rules.defaultTeam.data().noCores() ? 0 : state.rules.defaultTeam.core().items.get(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
static boolean toggled(String name){
|
|
||||||
Element element = Core.scene.findVisible(name);
|
|
||||||
if(element instanceof Button){
|
|
||||||
return ((Button)element).isChecked();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void outline(String name){
|
|
||||||
Element element = Core.scene.findVisible(name);
|
|
||||||
if(element != null && !toggled(name)){
|
|
||||||
element.localToStageCoordinates(Tmp.v1.setZero());
|
|
||||||
float sin = Mathf.sin(11f, Scl.scl(4f));
|
|
||||||
Lines.stroke(Scl.scl(7f), Pal.place);
|
|
||||||
Lines.rect(Tmp.v1.x - sin, Tmp.v1.y - sin, element.getWidth() + sin*2, element.getHeight() + sin*2);
|
|
||||||
|
|
||||||
float size = Math.max(element.getWidth(), element.getHeight()) + Mathf.absin(11f/2f, Scl.scl(18f));
|
|
||||||
float angle = Angles.angle(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Tmp.v1.x + element.getWidth()/2f, Tmp.v1.y + element.getHeight()/2f);
|
|
||||||
Tmp.v2.trns(angle + 180f, size*1.4f);
|
|
||||||
float fs = Scl.scl(40f);
|
|
||||||
float fs2 = Scl.scl(56f);
|
|
||||||
|
|
||||||
Draw.color(Pal.gray);
|
|
||||||
Drawf.tri(Tmp.v1.x + element.getWidth()/2f + Tmp.v2.x, Tmp.v1.y + element.getHeight()/2f + Tmp.v2.y, fs2, fs2, angle);
|
|
||||||
Draw.color(Pal.place);
|
|
||||||
Tmp.v2.setLength(Tmp.v2.len() - Scl.scl(4));
|
|
||||||
Drawf.tri(Tmp.v1.x + element.getWidth()/2f + Tmp.v2.x, Tmp.v1.y + element.getHeight()/2f + Tmp.v2.y, fs, fs, angle);
|
|
||||||
Draw.reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -36,7 +36,7 @@ public class Universe{
|
|||||||
|
|
||||||
//update base coverage on capture
|
//update base coverage on capture
|
||||||
Events.on(SectorCaptureEvent.class, e -> {
|
Events.on(SectorCaptureEvent.class, e -> {
|
||||||
if(state.isCampaign()){
|
if(!net.client() && state.isCampaign()){
|
||||||
state.getSector().planet.updateBaseCoverage();
|
state.getSector().planet.updateBaseCoverage();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -215,7 +215,7 @@ public class Universe{
|
|||||||
//queue random invasions
|
//queue random invasions
|
||||||
if(!sector.isAttacked() && turn > invasionGracePeriod && sector.info.hasSpawns){
|
if(!sector.isAttacked() && turn > invasionGracePeriod && sector.info.hasSpawns){
|
||||||
//invasion chance depends on # of nearby bases
|
//invasion chance depends on # of nearby bases
|
||||||
if(Mathf.chance(baseInvasionChance * sector.near().count(Sector::hasEnemyBase))){
|
if(Mathf.chance(baseInvasionChance * Math.min(sector.near().count(Sector::hasEnemyBase), 1))){
|
||||||
int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 5) * 5;
|
int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 5) * 5;
|
||||||
|
|
||||||
//assign invasion-related things
|
//assign invasion-related things
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ public class OverlayRenderer{
|
|||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
Building tile = world.buildWorld(v.x, v.y);
|
Building tile = world.buildWorld(v.x, v.y);
|
||||||
if(tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0 && player.within(tile, itemTransferRange)){
|
if(input.canDropItem() && tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0 && player.within(tile, itemTransferRange)){
|
||||||
Lines.stroke(3f, Pal.gray);
|
Lines.stroke(3f, Pal.gray);
|
||||||
Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f));
|
Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f));
|
||||||
Lines.stroke(1f, Pal.place);
|
Lines.stroke(1f, Pal.place);
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ public enum Binding implements KeyBind{
|
|||||||
fullscreen(KeyCode.f11),
|
fullscreen(KeyCode.f11),
|
||||||
pause(KeyCode.space),
|
pause(KeyCode.space),
|
||||||
minimap(KeyCode.m),
|
minimap(KeyCode.m),
|
||||||
|
research(KeyCode.b),
|
||||||
|
planet_map(KeyCode.n),
|
||||||
toggle_menus(KeyCode.c),
|
toggle_menus(KeyCode.c),
|
||||||
screenshot(KeyCode.p),
|
screenshot(KeyCode.p),
|
||||||
toggle_power_lines(KeyCode.f5),
|
toggle_power_lines(KeyCode.f5),
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildUI(Group group){
|
public void buildUI(Group group){
|
||||||
|
//respawn hints
|
||||||
group.fill(t -> {
|
group.fill(t -> {
|
||||||
t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty()));
|
t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty()));
|
||||||
t.bottom();
|
t.bottom();
|
||||||
@@ -56,6 +57,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
}).margin(6f);
|
}).margin(6f);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//building hints
|
||||||
group.fill(t -> {
|
group.fill(t -> {
|
||||||
t.bottom();
|
t.bottom();
|
||||||
t.visible(() -> {
|
t.visible(() -> {
|
||||||
@@ -74,6 +76,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
}).margin(10f);
|
}).margin(10f);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//schematic controls
|
||||||
group.fill(t -> {
|
group.fill(t -> {
|
||||||
t.visible(() -> ui.hudfrag.shown && lastSchematic != null && !selectRequests.isEmpty());
|
t.visible(() -> ui.hudfrag.shown && lastSchematic != null && !selectRequests.isEmpty());
|
||||||
t.bottom();
|
t.bottom();
|
||||||
@@ -234,8 +237,10 @@ public class DesktopInput extends InputHandler{
|
|||||||
player.shooting = false;
|
player.shooting = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.isGame() && Core.input.keyTap(Binding.minimap) && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){
|
if(state.isGame() && !scene.hasDialog() && !(scene.getKeyboardFocus() instanceof TextField)){
|
||||||
ui.minimapfrag.toggle();
|
if(Core.input.keyTap(Binding.minimap)) ui.minimapfrag.toggle();
|
||||||
|
if(Core.input.keyTap(Binding.planet_map) && state.isCampaign()) ui.planet.toggle();
|
||||||
|
if(Core.input.keyTap(Binding.research) && state.isCampaign()) ui.research.toggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.isMenu() || Core.scene.hasDialog()) return;
|
if(state.isMenu() || Core.scene.hasDialog()) return;
|
||||||
@@ -480,7 +485,7 @@ public class DesktopInput extends InputHandler{
|
|||||||
deleting = true;
|
deleting = true;
|
||||||
}else if(selected != null){
|
}else if(selected != null){
|
||||||
//only begin shooting if there's no cursor event
|
//only begin shooting if there's no cursor event
|
||||||
if(!tileTapped(selected.build) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !player.unit().activelyBuilding() && !droppingItem &&
|
if(!tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !tileTapped(selected.build) && !player.unit().activelyBuilding() && !droppingItem &&
|
||||||
!tryBeginMine(selected) && player.unit().mineTile == null && !Core.scene.hasKeyboard()){
|
!tryBeginMine(selected) && player.unit().mineTile == null && !Core.scene.hasKeyboard()){
|
||||||
player.shooting = shouldShoot;
|
player.shooting = shouldShoot;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1056,6 +1056,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
|||||||
return droppingItem;
|
return droppingItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean canDropItem(){
|
||||||
|
return droppingItem && !canTapPlayer(Core.input.mouseWorldX(), Core.input.mouseWorldY());
|
||||||
|
}
|
||||||
|
|
||||||
public void tryDropItems(@Nullable Building tile, float x, float y){
|
public void tryDropItems(@Nullable Building tile, float x, float y){
|
||||||
if(!droppingItem || player.unit().stack.amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){
|
if(!droppingItem || player.unit().stack.amount <= 0 || canTapPlayer(x, y) || state.isPaused() ){
|
||||||
droppingItem = false;
|
droppingItem = false;
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
|||||||
selectRequests.clear();
|
selectRequests.clear();
|
||||||
mode = none;
|
mode = none;
|
||||||
block = null;
|
block = null;
|
||||||
}).width(155f).margin(12f);
|
}).width(155f).height(50f).margin(12f);
|
||||||
});
|
});
|
||||||
|
|
||||||
group.fill(t -> {
|
group.fill(t -> {
|
||||||
|
|||||||
@@ -302,6 +302,14 @@ public class Maps{
|
|||||||
flooronto = Blocks.sand;
|
flooronto = Blocks.sand;
|
||||||
block = Blocks.sandBoulder;
|
block = Blocks.sandBoulder;
|
||||||
}},
|
}},
|
||||||
|
new ScatterFilter(){{
|
||||||
|
flooronto = Blocks.darksand;
|
||||||
|
block = Blocks.basaltBoulder;
|
||||||
|
}},
|
||||||
|
new ScatterFilter(){{
|
||||||
|
flooronto = Blocks.basalt;
|
||||||
|
block = Blocks.basaltBoulder;
|
||||||
|
}},
|
||||||
new ScatterFilter(){{
|
new ScatterFilter(){{
|
||||||
flooronto = Blocks.dacite;
|
flooronto = Blocks.dacite;
|
||||||
block = Blocks.daciteBoulder;
|
block = Blocks.daciteBoulder;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import mindustry.world.*;
|
|||||||
import static mindustry.maps.filters.FilterOption.*;
|
import static mindustry.maps.filters.FilterOption.*;
|
||||||
|
|
||||||
public class ScatterFilter extends GenerateFilter{
|
public class ScatterFilter extends GenerateFilter{
|
||||||
protected float chance = 0.014f;
|
protected float chance = 0.013f;
|
||||||
protected Block flooronto = Blocks.air, floor = Blocks.air, block = Blocks.air;
|
protected Block flooronto = Blocks.air, floor = Blocks.air, block = Blocks.air;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import arc.math.*;
|
|||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.ai.*;
|
||||||
import mindustry.ai.BaseRegistry.*;
|
import mindustry.ai.BaseRegistry.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
@@ -146,6 +147,15 @@ public class BaseGenerator{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//clear path for ground units
|
||||||
|
for(Tile tile : cores){
|
||||||
|
Astar.pathfind(tile, spawn, t -> t.team() == state.rules.waveTeam && !t.within(tile, 25f * 8) ? 100000 : t.floor().hasSurface() ? 1 : 10, t -> !t.block().isStatic()).each(t -> {
|
||||||
|
if(t.team() == state.rules.waveTeam && !t.within(tile, 25f * 8)){
|
||||||
|
t.setBlock(Blocks.air);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void postGenerate(){
|
public void postGenerate(){
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ import mindustry.ai.*;
|
|||||||
import mindustry.ai.BaseRegistry.*;
|
import mindustry.ai.BaseRegistry.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
|
import mindustry.graphics.g3d.PlanetGrid.*;
|
||||||
import mindustry.maps.generators.*;
|
import mindustry.maps.generators.*;
|
||||||
|
import mindustry.type.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
@@ -59,6 +61,43 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
|
|||||||
return (Mathf.pow((float)noise.octaveNoise3D(7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset);
|
return (Mathf.pow((float)noise.octaveNoise3D(7, 0.5f, 1f/3f, position.x, position.y, position.z), 2.3f) + waterOffset) / (1f + waterOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateSector(Sector sector){
|
||||||
|
|
||||||
|
//these always have bases
|
||||||
|
if(sector.id == 154 || sector.id == 0){
|
||||||
|
sector.generateEnemyBase = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ptile tile = sector.tile;
|
||||||
|
|
||||||
|
boolean any = false;
|
||||||
|
float poles = Math.abs(tile.v.y);
|
||||||
|
float noise = Noise.snoise3(tile.v.x, tile.v.y, tile.v.z, 0.001f, 0.58f);
|
||||||
|
|
||||||
|
if(noise + poles/7.1 > 0.12 && poles > 0.23){
|
||||||
|
any = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(noise < 0.16){
|
||||||
|
for(Ptile other : tile.tiles){
|
||||||
|
var osec = sector.planet.getSector(other);
|
||||||
|
|
||||||
|
//no sectors near start sector!
|
||||||
|
if(
|
||||||
|
osec.id == sector.planet.startSector || //near starting sector
|
||||||
|
osec.generateEnemyBase && poles < 0.85 || //near other base
|
||||||
|
(sector.preset != null && noise < 0.11) //near preset
|
||||||
|
){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sector.generateEnemyBase = any;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getHeight(Vec3 position){
|
public float getHeight(Vec3 position){
|
||||||
float height = rawHeight(position);
|
float height = rawHeight(position);
|
||||||
@@ -158,7 +197,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
|
|||||||
//check positions on the map to place the player spawn. this needs to be in the corner of the map
|
//check positions on the map to place the player spawn. this needs to be in the corner of the map
|
||||||
Room spawn = null;
|
Room spawn = null;
|
||||||
Seq<Room> enemies = new Seq<>();
|
Seq<Room> enemies = new Seq<>();
|
||||||
int enemySpawns = rand.chance(0.3) ? 2 : 1;
|
int enemySpawns = rand.random(1, Math.max((int)(sector.threat * 4), 1));
|
||||||
int offset = rand.nextInt(360);
|
int offset = rand.nextInt(360);
|
||||||
float length = width/2.55f - rand.random(13, 23);
|
float length = width/2.55f - rand.random(13, 23);
|
||||||
int angleStep = 5;
|
int angleStep = 5;
|
||||||
@@ -237,7 +276,7 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{
|
|||||||
|
|
||||||
FloatSeq frequencies = new FloatSeq();
|
FloatSeq frequencies = new FloatSeq();
|
||||||
for(int i = 0; i < ores.size; i++){
|
for(int i = 0; i < ores.size; i++){
|
||||||
frequencies.add(rand.random(-0.09f, 0.01f) - i * 0.01f);
|
frequencies.add(rand.random(-0.1f, 0.01f) - i * 0.01f + poles * 0.04f);
|
||||||
}
|
}
|
||||||
|
|
||||||
pass((x, y) -> {
|
pass((x, y) -> {
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import mindustry.world.draw.*;
|
|||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
|
|
||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class ContentParser{
|
public class ContentParser{
|
||||||
@@ -267,7 +268,13 @@ public class ContentParser{
|
|||||||
UnitType unit;
|
UnitType unit;
|
||||||
if(locate(ContentType.unit, name) == null){
|
if(locate(ContentType.unit, name) == null){
|
||||||
unit = new UnitType(mod + "-" + name);
|
unit = new UnitType(mod + "-" + name);
|
||||||
unit.constructor = Reflect.cons(resolve(Strings.capitalize(getType(value)), "mindustry.gen"));
|
var typeVal = value.get("type");
|
||||||
|
|
||||||
|
if(typeVal != null && !typeVal.isString()){
|
||||||
|
throw new RuntimeException("Unit '" + name + "' has an incorrect type. Types must be strings.");
|
||||||
|
}
|
||||||
|
|
||||||
|
unit.constructor = unitType(typeVal);
|
||||||
}else{
|
}else{
|
||||||
unit = locate(ContentType.unit, name);
|
unit = locate(ContentType.unit, name);
|
||||||
}
|
}
|
||||||
@@ -337,6 +344,18 @@ public class ContentParser{
|
|||||||
//ContentType.sector, parser(ContentType.sector, SectorPreset::new)
|
//ContentType.sector, parser(ContentType.sector, SectorPreset::new)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
private Prov<Unit> unitType(JsonValue value){
|
||||||
|
if(value == null) return UnitEntity::create;
|
||||||
|
return switch(value.asString()){
|
||||||
|
case "flying" -> UnitEntity::create;
|
||||||
|
case "mech" -> MechUnit::create;
|
||||||
|
case "legs" -> LegsUnit::create;
|
||||||
|
case "naval" -> UnitWaterMove::create;
|
||||||
|
case "payload" -> PayloadUnit::create;
|
||||||
|
default -> throw new RuntimeException("Invalid unit type: '" + value + "'. Must be 'flying/mech/legs/naval/payload'.");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private String getString(JsonValue value, String key){
|
private String getString(JsonValue value, String key){
|
||||||
if(value.has(key)){
|
if(value.has(key)){
|
||||||
return value.getString(key);
|
return value.getString(key);
|
||||||
|
|||||||
@@ -830,7 +830,7 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
/** Mod metadata information.*/
|
/** Mod metadata information.*/
|
||||||
public static class ModMeta{
|
public static class ModMeta{
|
||||||
public String name, displayName, author, description, version, main, minGameVersion = "0";
|
public String name, displayName, author, description, version, main, minGameVersion = "0", repo;
|
||||||
public Seq<String> dependencies = Seq.with();
|
public Seq<String> dependencies = Seq.with();
|
||||||
/** Hidden mods are only server-side or client-side, and do not support adding new content. */
|
/** Hidden mods are only server-side or client-side, and do not support adding new content. */
|
||||||
public boolean hidden;
|
public boolean hidden;
|
||||||
|
|||||||
@@ -303,8 +303,6 @@ public class Administration{
|
|||||||
public boolean adminPlayer(String id, String usid){
|
public boolean adminPlayer(String id, String usid){
|
||||||
PlayerInfo info = getCreateInfo(id);
|
PlayerInfo info = getCreateInfo(id);
|
||||||
|
|
||||||
if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) return false;
|
|
||||||
|
|
||||||
info.adminUsid = usid;
|
info.adminUsid = usid;
|
||||||
info.admin = true;
|
info.admin = true;
|
||||||
save();
|
save();
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class Sector{
|
|||||||
|
|
||||||
/** @return whether the player has a base here. */
|
/** @return whether the player has a base here. */
|
||||||
public boolean hasBase(){
|
public boolean hasBase(){
|
||||||
return save != null && info.hasCore;
|
return save != null && info.hasCore && !(Vars.state.isGame() && Vars.state.rules.sector == this && state.gameOver);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return whether the enemy has a generated base here. */
|
/** @return whether the enemy has a generated base here. */
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ public class Fonts{
|
|||||||
glyph.srcX = 0;
|
glyph.srcX = 0;
|
||||||
glyph.srcY = 0;
|
glyph.srcY = 0;
|
||||||
glyph.width = size;
|
glyph.width = size;
|
||||||
glyph.height = size;
|
glyph.height = (int)((float)region.height / region.width * size);
|
||||||
glyph.u = region.u;
|
glyph.u = region.u;
|
||||||
glyph.v = region.v2;
|
glyph.v = region.v2;
|
||||||
glyph.u2 = region.u2;
|
glyph.u2 = region.u2;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mindustry.ui;
|
|||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
|
import mindustry.core.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
|
|
||||||
public class ItemImage extends Stack{
|
public class ItemImage extends Stack{
|
||||||
@@ -16,7 +17,7 @@ public class ItemImage extends Stack{
|
|||||||
|
|
||||||
add(new Table(t -> {
|
add(new Table(t -> {
|
||||||
t.left().bottom();
|
t.left().bottom();
|
||||||
t.add(amount + "");
|
t.add(amount > 1000 ? UI.formatAmount(amount) : amount + "");
|
||||||
t.pack();
|
t.pack();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -38,7 +39,7 @@ public class ItemImage extends Stack{
|
|||||||
if(stack.amount != 0){
|
if(stack.amount != 0){
|
||||||
add(new Table(t -> {
|
add(new Table(t -> {
|
||||||
t.left().bottom();
|
t.left().bottom();
|
||||||
t.add(stack.amount + "").style(Styles.outlineLabel);
|
t.add(stack.amount > 1000 ? UI.formatAmount(stack.amount) : stack.amount + "").style(Styles.outlineLabel);
|
||||||
t.pack();
|
t.pack();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public class Styles{
|
|||||||
//TODO all these names are inconsistent and not descriptive
|
//TODO all these names are inconsistent and not descriptive
|
||||||
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver;
|
public static Drawable black, black9, black8, black6, black3, black5, none, flatDown, flatOver;
|
||||||
public static ButtonStyle defaultb, waveb;
|
public static ButtonStyle defaultb, waveb;
|
||||||
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict;
|
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict;
|
||||||
public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
|
public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, logici, geni, colori, accenti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali;
|
||||||
public static ScrollPaneStyle defaultPane, horizontalPane, smallPane;
|
public static ScrollPaneStyle defaultPane, horizontalPane, smallPane;
|
||||||
public static KeybindDialogStyle defaultKeybindDialog;
|
public static KeybindDialogStyle defaultKeybindDialog;
|
||||||
@@ -86,6 +86,13 @@ public class Styles{
|
|||||||
up = buttonOver;
|
up = buttonOver;
|
||||||
over = buttonDown;
|
over = buttonDown;
|
||||||
}};
|
}};
|
||||||
|
nonet = new TextButtonStyle(){{
|
||||||
|
font = Fonts.outline;
|
||||||
|
fontColor = Color.lightGray;
|
||||||
|
overFontColor = Pal.accent;
|
||||||
|
disabledFontColor = Color.gray;
|
||||||
|
up = none;
|
||||||
|
}};
|
||||||
cleart = new TextButtonStyle(){{
|
cleart = new TextButtonStyle(){{
|
||||||
over = flatOver;
|
over = flatOver;
|
||||||
font = Fonts.def;
|
font = Fonts.def;
|
||||||
|
|||||||
@@ -31,13 +31,13 @@ public class GameOverDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void rebuild(){
|
void rebuild(){
|
||||||
title.setText("@gameover");
|
title.setText(state.isCampaign() ? "@sector.curlost" : "@gameover");
|
||||||
buttons.clear();
|
buttons.clear();
|
||||||
cont.clear();
|
cont.clear();
|
||||||
|
|
||||||
buttons.margin(10);
|
buttons.margin(10);
|
||||||
|
|
||||||
if(state.rules.pvp){
|
if(state.rules.pvp && winner != null){
|
||||||
cont.add(Core.bundle.format("gameover.pvp", winner.localized())).pad(6);
|
cont.add(Core.bundle.format("gameover.pvp", winner.localized())).pad(6);
|
||||||
buttons.button("@menu", () -> {
|
buttons.button("@menu", () -> {
|
||||||
hide();
|
hide();
|
||||||
|
|||||||
@@ -499,7 +499,7 @@ public class JoinDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}catch(Throwable e){
|
}catch(Throwable e){
|
||||||
Log.err("Failed to fetch communitycommunity servers.");
|
Log.err("Failed to fetch community servers.");
|
||||||
}
|
}
|
||||||
}, t -> {});
|
}, t -> {});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ public class LaunchLoadoutDialog extends BaseDialog{
|
|||||||
selected = s;
|
selected = s;
|
||||||
update.run();
|
update.run();
|
||||||
rebuildItems.run();
|
rebuildItems.run();
|
||||||
}).group(group).pad(4).disabled(!sitems.has(s.requirements())).checked(s == selected).size(200f);
|
}).group(group).pad(4).checked(s == selected).size(200f);
|
||||||
|
|
||||||
if(++i % cols == 0){
|
if(++i % cols == 0){
|
||||||
t.row();
|
t.row();
|
||||||
|
|||||||
@@ -35,30 +35,28 @@ public class PausedDialog extends BaseDialog{
|
|||||||
cont.button("@back", Icon.left, this::hide).name("back");
|
cont.button("@back", Icon.left, this::hide).name("back");
|
||||||
cont.button("@settings", Icon.settings, ui.settings::show).name("settings");
|
cont.button("@settings", Icon.settings, ui.settings::show).name("settings");
|
||||||
|
|
||||||
if(!state.rules.tutorial){
|
if(!state.isCampaign() && !state.isEditor()){
|
||||||
if(!state.isCampaign() && !state.isEditor()){
|
|
||||||
cont.row();
|
|
||||||
cont.button("@savegame", Icon.save, save::show);
|
|
||||||
cont.button("@loadgame", Icon.upload, load::show).disabled(b -> net.active());
|
|
||||||
}
|
|
||||||
|
|
||||||
cont.row();
|
cont.row();
|
||||||
|
cont.button("@savegame", Icon.save, save::show);
|
||||||
cont.button("@hostserver", Icon.host, () -> {
|
cont.button("@loadgame", Icon.upload, load::show).disabled(b -> net.active());
|
||||||
if(net.server() && steam){
|
|
||||||
platform.inviteFriends();
|
|
||||||
}else{
|
|
||||||
if(steam){
|
|
||||||
ui.host.runHost();
|
|
||||||
}else{
|
|
||||||
ui.host.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).disabled(b -> !((steam && net.server()) || !net.active())).colspan(2).width(dw * 2 + 20f).update(e -> e.setText(net.server() && steam ? "@invitefriends" : "@hostserver"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cont.row();
|
cont.row();
|
||||||
|
|
||||||
|
cont.button("@hostserver", Icon.host, () -> {
|
||||||
|
if(net.server() && steam){
|
||||||
|
platform.inviteFriends();
|
||||||
|
}else{
|
||||||
|
if(steam){
|
||||||
|
ui.host.runHost();
|
||||||
|
}else{
|
||||||
|
ui.host.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).disabled(b -> !((steam && net.server()) || !net.active())).colspan(2).width(dw * 2 + 20f).update(e -> e.setText(net.server() && steam ? "@invitefriends" : "@hostserver"));
|
||||||
|
|
||||||
|
cont.row();
|
||||||
|
|
||||||
cont.button("@quit", Icon.exit, this::showQuitConfirm).colspan(2).width(dw + 20f).update(s -> s.setText(control.saves.getCurrent() != null && control.saves.getCurrent().isAutosave() ? "@save.quit" : "@quit"));
|
cont.button("@quit", Icon.exit, this::showQuitConfirm).colspan(2).width(dw + 20f).update(s -> s.setText(control.saves.getCurrent() != null && control.saves.getCurrent().isAutosave() ? "@save.quit" : "@quit"));
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
@@ -95,10 +93,7 @@ public class PausedDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void showQuitConfirm(){
|
void showQuitConfirm(){
|
||||||
ui.showConfirm("@confirm", state.rules.tutorial ? "@quit.confirm.tutorial" : "@quit.confirm", () -> {
|
ui.showConfirm("@confirm", "@quit.confirm", () -> {
|
||||||
if(state.rules.tutorial){
|
|
||||||
Core.settings.put("playedtutorial", true);
|
|
||||||
}
|
|
||||||
wasClient = net.client();
|
wasClient = net.client();
|
||||||
if(net.client()) netClient.disconnectQuietly();
|
if(net.client()) netClient.disconnectQuietly();
|
||||||
runExitSave();
|
runExitSave();
|
||||||
@@ -112,7 +107,7 @@ public class PausedDialog extends BaseDialog{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(control.saves.getCurrent() == null || !control.saves.getCurrent().isAutosave() || state.rules.tutorial || wasClient){
|
if(control.saves.getCurrent() == null || !control.saves.getCurrent().isAutosave() || wasClient){
|
||||||
logic.reset();
|
logic.reset();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import mindustry.game.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.graphics.g3d.*;
|
import mindustry.graphics.g3d.*;
|
||||||
|
import mindustry.input.*;
|
||||||
import mindustry.maps.*;
|
import mindustry.maps.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
@@ -60,7 +61,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
shouldPause = true;
|
shouldPause = true;
|
||||||
|
|
||||||
keyDown(key -> {
|
keyDown(key -> {
|
||||||
if(key == KeyCode.escape || key == KeyCode.back){
|
if(key == KeyCode.escape || key == KeyCode.back || key == Core.keybinds.get(Binding.planet_map).key){
|
||||||
if(showing() && newPresets.size > 1){
|
if(showing() && newPresets.size > 1){
|
||||||
//clear all except first, which is the last sector.
|
//clear all except first, which is the last sector.
|
||||||
newPresets.truncate(1);
|
newPresets.truncate(1);
|
||||||
@@ -134,6 +135,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
/** show with no limitations, just as a map. */
|
/** show with no limitations, just as a map. */
|
||||||
@Override
|
@Override
|
||||||
public Dialog show(){
|
public Dialog show(){
|
||||||
|
if(net.client()){
|
||||||
|
ui.showInfo("@map.multiplayer");
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
mode = look;
|
mode = look;
|
||||||
selected = hovered = launchSector = null;
|
selected = hovered = launchSector = null;
|
||||||
launching = false;
|
launching = false;
|
||||||
@@ -239,6 +245,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Sector findLauncher(Sector to){
|
Sector findLauncher(Sector to){
|
||||||
|
Sector launchSector = this.launchSector != null && this.launchSector.hasBase() ? this.launchSector : null;
|
||||||
//directly nearby.
|
//directly nearby.
|
||||||
if(to.near().contains(launchSector)) return launchSector;
|
if(to.near().contains(launchSector)) return launchSector;
|
||||||
|
|
||||||
@@ -671,34 +678,30 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
stable.add(Core.bundle.get("sectors.threat") + " [accent]" + sector.displayThreat()).row();
|
stable.add(Core.bundle.get("sectors.threat") + " [accent]" + sector.displayThreat()).row();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sector.isAttacked()){ //TODO localize
|
if(sector.isAttacked()){
|
||||||
//these mechanics are likely to change and as such are not added to the bundle
|
stable.add(Core.bundle.format("sectors.underattack", (int)(sector.info.damage * 100)));
|
||||||
stable.add("[scarlet]Under attack! [accent]" + (int)(sector.info.damage * 100) + "% damaged");
|
|
||||||
stable.row();
|
stable.row();
|
||||||
|
|
||||||
if(sector.info.wavesSurvived >= 0 && sector.info.wavesSurvived - sector.info.wavesPassed >= 0 && !sector.isBeingPlayed()){
|
if(sector.info.wavesSurvived >= 0 && sector.info.wavesSurvived - sector.info.wavesPassed >= 0 && !sector.isBeingPlayed()){
|
||||||
int toCapture = sector.info.attack || sector.info.winWave <= 1 ? -1 : sector.info.winWave - (sector.info.wave + sector.info.wavesPassed);
|
int toCapture = sector.info.attack || sector.info.winWave <= 1 ? -1 : sector.info.winWave - (sector.info.wave + sector.info.wavesPassed);
|
||||||
boolean plus = (sector.info.wavesSurvived - sector.info.wavesPassed) >= SectorDamage.maxRetWave - 1;
|
boolean plus = (sector.info.wavesSurvived - sector.info.wavesPassed) >= SectorDamage.maxRetWave - 1;
|
||||||
stable.add("[accent]Survives " + Math.min(sector.info.wavesSurvived - sector.info.wavesPassed, toCapture <= 0 ? 200 : 0) +
|
stable.add(Core.bundle.format("sectors.survives", Math.min(sector.info.wavesSurvived - sector.info.wavesPassed, toCapture <= 0 ? 200 : toCapture) +
|
||||||
(plus ? "+" : "") + (toCapture < 0 ? "" : "/" + toCapture) + " waves");
|
(plus ? "+" : "") + (toCapture < 0 ? "" : "/" + toCapture)));
|
||||||
stable.row();
|
stable.row();
|
||||||
}
|
}
|
||||||
}else if(sector.hasBase() && sector.near().contains(Sector::hasEnemyBase)){ //TODO localize
|
}else if(sector.hasBase() && sector.near().contains(Sector::hasEnemyBase)){
|
||||||
stable.add("[scarlet]Vulnerable");
|
stable.add("@sectors.vulnerable");
|
||||||
stable.row();
|
stable.row();
|
||||||
}else if(!sector.hasBase() && sector.hasEnemyBase()){ //TODO localize
|
}else if(!sector.hasBase() && sector.hasEnemyBase()){
|
||||||
stable.add("[scarlet]Enemy Base");
|
stable.add("@sectors.enemybase");
|
||||||
stable.row();
|
stable.row();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sector.save != null && sector.info.resources.any()){
|
if(sector.save != null && sector.info.resources.any()){
|
||||||
stable.table(t -> {
|
stable.table(t -> {
|
||||||
t.add("@sectors.resources").padRight(4);
|
t.add("@sectors.resources").padRight(4);
|
||||||
int idx = 0;
|
|
||||||
int max = 5;
|
|
||||||
for(UnlockableContent c : sector.info.resources){
|
for(UnlockableContent c : sector.info.resources){
|
||||||
t.image(c.icon(Cicon.small)).padRight(3).size(Cicon.small.size);
|
t.image(c.icon(Cicon.small)).padRight(3).size(Cicon.small.size);
|
||||||
//if(++idx % max == 0) t.row();
|
|
||||||
}
|
}
|
||||||
}).padLeft(10f).fillX().row();
|
}).padLeft(10f).fillX().row();
|
||||||
}
|
}
|
||||||
@@ -710,8 +713,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if((sector.hasBase() && mode == look) || canSelect(sector) || (sector.preset != null && sector.preset.alwaysUnlocked) || debugSelect){
|
if((sector.hasBase() && mode == look) || canSelect(sector) || (sector.preset != null && sector.preset.alwaysUnlocked) || debugSelect){
|
||||||
stable.button(mode == select ? "@sectors.select" : sector.hasBase() ? "@sectors.resume" : "@sectors.launch", Icon.play, () -> {
|
stable.button(mode == select ? "@sectors.select" : sector.isBeingPlayed() ? "@sectors.resume" : sector.hasBase() ? "@sectors.go" : "@sectors.launch", Icon.play, () -> {
|
||||||
if(state.rules.sector == sector && !state.isMenu()){
|
if(sector.isBeingPlayed()){
|
||||||
//already at this sector
|
//already at this sector
|
||||||
hide();
|
hide();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import mindustry.game.EventType.*;
|
|||||||
import mindustry.game.Objectives.*;
|
import mindustry.game.Objectives.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.input.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
import mindustry.ui.layout.*;
|
import mindustry.ui.layout.*;
|
||||||
@@ -114,6 +115,12 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
|
|
||||||
addCloseButton();
|
addCloseButton();
|
||||||
|
|
||||||
|
keyDown(key -> {
|
||||||
|
if(key == Core.keybinds.get(Binding.research).key){
|
||||||
|
Core.app.post(this::hide);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
buttons.button("@database", Icon.book, () -> {
|
buttons.button("@database", Icon.book, () -> {
|
||||||
hide();
|
hide();
|
||||||
ui.database.show();
|
ui.database.show();
|
||||||
@@ -169,7 +176,7 @@ public class ResearchDialog extends BaseDialog{
|
|||||||
public Dialog show(){
|
public Dialog show(){
|
||||||
if(net.client()){
|
if(net.client()){
|
||||||
ui.showInfo("@research.multiplayer");
|
ui.showInfo("@research.multiplayer");
|
||||||
return null;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.show();
|
return super.show();
|
||||||
|
|||||||
@@ -314,8 +314,6 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i));
|
game.sliderPref("saveinterval", 60, 10, 5 * 120, 10, i -> Core.bundle.format("setting.seconds", i));
|
||||||
|
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
game.sliderPref("blockselecttimeout", 750, 0, 2000, 50, i -> Core.bundle.format("setting.milliseconds", i));
|
|
||||||
|
|
||||||
game.checkPref("crashreport", true);
|
game.checkPref("crashreport", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,7 +396,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
graphics.checkPref("blockstatus", false);
|
graphics.checkPref("blockstatus", false);
|
||||||
graphics.checkPref("playerchat", true);
|
graphics.checkPref("playerchat", true);
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
graphics.checkPref("coreitems", false);
|
graphics.checkPref("coreitems", true);
|
||||||
}
|
}
|
||||||
graphics.checkPref("minimap", !mobile);
|
graphics.checkPref("minimap", !mobile);
|
||||||
graphics.checkPref("smoothcamera", true);
|
graphics.checkPref("smoothcamera", true);
|
||||||
|
|||||||
264
core/src/mindustry/ui/fragments/HintsFragment.java
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
package mindustry.ui.fragments;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
|
import arc.func.*;
|
||||||
|
import arc.input.*;
|
||||||
|
import arc.math.*;
|
||||||
|
import arc.scene.*;
|
||||||
|
import arc.scene.actions.*;
|
||||||
|
import arc.scene.event.*;
|
||||||
|
import arc.scene.ui.layout.*;
|
||||||
|
import arc.struct.*;
|
||||||
|
import arc.util.*;
|
||||||
|
import mindustry.*;
|
||||||
|
import mindustry.content.*;
|
||||||
|
import mindustry.game.EventType.*;
|
||||||
|
import mindustry.gen.*;
|
||||||
|
import mindustry.input.*;
|
||||||
|
import mindustry.ui.*;
|
||||||
|
import mindustry.world.*;
|
||||||
|
import mindustry.world.meta.*;
|
||||||
|
|
||||||
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
|
public class HintsFragment extends Fragment{
|
||||||
|
private static final Boolp isTutorial = () -> Vars.state.rules.sector == SectorPresets.groundZero.sector;
|
||||||
|
private static final float foutTime = 0.6f;
|
||||||
|
|
||||||
|
/** All hints to be displayed in the game. */
|
||||||
|
public Seq<Hint> hints = Seq.with(DefaultHint.values());
|
||||||
|
|
||||||
|
@Nullable Hint current;
|
||||||
|
Group group = new WidgetGroup();
|
||||||
|
ObjectSet<String> events = new ObjectSet<>();
|
||||||
|
ObjectSet<Block> placedBlocks = new ObjectSet<>();
|
||||||
|
Table last;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void build(Group parent){
|
||||||
|
group.setFillParent(true);
|
||||||
|
group.touchable = Touchable.childrenOnly;
|
||||||
|
group.visibility = () -> Core.settings.getBool("hints", true);
|
||||||
|
group.update(() -> {
|
||||||
|
if(current != null){
|
||||||
|
//current got completed
|
||||||
|
if(current.complete()){
|
||||||
|
complete();
|
||||||
|
}else if(!current.show()){ //current became hidden
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
}else if(hints.size > 0){
|
||||||
|
//check one hint each frame to see if it should be shown.
|
||||||
|
Hint hint = hints.find(Hint::show);
|
||||||
|
if(hint != null && hint.complete()){
|
||||||
|
hints.remove(hint);
|
||||||
|
}else if(hint != null){
|
||||||
|
display(hint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
parent.addChild(group);
|
||||||
|
|
||||||
|
checkNext();
|
||||||
|
|
||||||
|
Events.on(BlockBuildEndEvent.class, event -> {
|
||||||
|
if(!event.breaking && event.unit == player.unit()){
|
||||||
|
placedBlocks.add(event.tile.block());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(event.breaking){
|
||||||
|
events.add("break");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Events.on(ResetEvent.class, e -> {
|
||||||
|
placedBlocks.clear();
|
||||||
|
events.clear();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkNext(){
|
||||||
|
if(current != null) return;
|
||||||
|
|
||||||
|
hints.removeAll(h -> !h.valid() || h.finished() || (h.show() && h.complete()));
|
||||||
|
hints.sort(Hint::order);
|
||||||
|
|
||||||
|
Hint first = hints.find(Hint::show);
|
||||||
|
if(first != null){
|
||||||
|
hints.remove(first);
|
||||||
|
display(first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void display(Hint hint){
|
||||||
|
if(current != null) return;
|
||||||
|
|
||||||
|
group.fill(t -> {
|
||||||
|
last = t;
|
||||||
|
t.left();
|
||||||
|
t.table(Styles.black5, cont -> {
|
||||||
|
cont.actions(Actions.alpha(0f), Actions.alpha(1f, 1f, Interp.smooth));
|
||||||
|
cont.margin(6f).add(hint.text()).width(Vars.mobile ? 270f : 400f).left().labelAlign(Align.left).wrap();
|
||||||
|
});
|
||||||
|
t.row();
|
||||||
|
t.button("@hint.skip", Styles.nonet, () -> {
|
||||||
|
if(current != null){
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
}).size(100f, 40f).left();
|
||||||
|
});
|
||||||
|
|
||||||
|
this.current = hint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Completes and hides the current hint. */
|
||||||
|
void complete(){
|
||||||
|
if(current == null) return;
|
||||||
|
|
||||||
|
current.finish();
|
||||||
|
hints.remove(current);
|
||||||
|
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Hides the current hint, but does not complete it. */
|
||||||
|
void hide(){
|
||||||
|
//hide previous child if found
|
||||||
|
if(last != null){
|
||||||
|
last.actions(Actions.parallel(Actions.alpha(0f, foutTime, Interp.smooth), Actions.translateBy(0f, Scl.scl(-200f), foutTime, Interp.smooth)), Actions.remove());
|
||||||
|
}
|
||||||
|
//check for next hint to display immediately
|
||||||
|
current = null;
|
||||||
|
last = null;
|
||||||
|
checkNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean shown(){
|
||||||
|
return current != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DefaultHint implements Hint{
|
||||||
|
desktopMove(visibleDesktop, () -> Core.input.axis(Binding.move_x) != 0 || Core.input.axis(Binding.move_y) != 0),
|
||||||
|
zoom(visibleDesktop, () -> Core.input.axis(KeyCode.scroll) != 0),
|
||||||
|
mine(() -> player.unit().canMine() && isTutorial.get(), () -> player.unit().mining()),
|
||||||
|
placeDrill(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.mechanicalDrill)),
|
||||||
|
placeConveyor(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.conveyor)),
|
||||||
|
placeTurret(isTutorial, () -> ui.hints.placedBlocks.contains(Blocks.duo)),
|
||||||
|
breaking(isTutorial, () -> ui.hints.events.contains("break")),
|
||||||
|
desktopShoot(visibleDesktop, () -> Vars.state.enemies > 0, () -> player.shooting),
|
||||||
|
depositItems(() -> player.unit().hasItem(), () -> !player.unit().hasItem()),
|
||||||
|
desktopPause(visibleDesktop, () -> isTutorial.get() && !Vars.net.active(), () -> Core.input.keyTap(Binding.pause)),
|
||||||
|
research(isTutorial, () -> ui.research.isShown()),
|
||||||
|
unitControl(() -> state.rules.defaultTeam.data().units.size > 1 && !net.active(), () -> !player.dead() && !player.unit().spawnedByCore),
|
||||||
|
respawn(visibleMobile, () -> !player.dead() && !player.unit().spawnedByCore, () -> !player.dead() && player.unit().spawnedByCore),
|
||||||
|
launch(() -> isTutorial.get() && state.rules.sector.isCaptured(), () -> ui.planet.isShown()),
|
||||||
|
schematicSelect(visibleDesktop, () -> ui.hints.placedBlocks.contains(Blocks.router), () -> Core.input.keyRelease(Binding.schematic_select) || Core.input.keyTap(Binding.pick)),
|
||||||
|
conveyorPathfind(() -> control.input.block == Blocks.titaniumConveyor, () -> Core.input.keyRelease(Binding.diagonal_placement) || (mobile && Core.settings.getBool("swapdiagonal"))),
|
||||||
|
boost(visibleDesktop, () -> !player.dead() && player.unit().type.canBoost, () -> Core.input.keyDown(Binding.boost)),
|
||||||
|
command(() -> state.rules.defaultTeam.data().units.size > 3 && !net.active(), () -> player.unit().isCommanding()),
|
||||||
|
payloadPickup(() -> !player.unit().dead && player.unit() instanceof Payloadc p && p.payloads().isEmpty(), () -> player.unit() instanceof Payloadc p && p.payloads().any()),
|
||||||
|
payloadDrop(() -> !player.unit().dead && player.unit() instanceof Payloadc p && p.payloads().any(), () -> player.unit() instanceof Payloadc p && p.payloads().isEmpty()),
|
||||||
|
waveFire(() -> Groups.fire.size() > 0 && Blocks.wave.unlockedNow(), () -> indexer.getAllied(state.rules.defaultTeam, BlockFlag.extinguisher).size() > 0),
|
||||||
|
generator(() -> control.input.block == Blocks.combustionGenerator, () -> ui.hints.placedBlocks.contains(Blocks.combustionGenerator)),
|
||||||
|
;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
String text;
|
||||||
|
int visibility = visibleAll;
|
||||||
|
Hint[] dependencies = {};
|
||||||
|
boolean finished, cached;
|
||||||
|
Boolp complete, shown = () -> true;
|
||||||
|
|
||||||
|
DefaultHint(Boolp complete){
|
||||||
|
this.complete = complete;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultHint(int visiblity, Boolp complete){
|
||||||
|
this(complete);
|
||||||
|
this.visibility = visiblity;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultHint(Boolp shown, Boolp complete){
|
||||||
|
this(complete);
|
||||||
|
this.shown = shown;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultHint(int visiblity, Boolp shown, Boolp complete){
|
||||||
|
this(complete);
|
||||||
|
this.shown = shown;
|
||||||
|
this.visibility = visiblity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean finished(){
|
||||||
|
if(!cached){
|
||||||
|
cached = true;
|
||||||
|
finished = Core.settings.getBool(name() + "-hint-done", false);
|
||||||
|
}
|
||||||
|
return finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void finish(){
|
||||||
|
Core.settings.put(name() + "-hint-done", finished = true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String text(){
|
||||||
|
if(text == null){
|
||||||
|
text = Vars.mobile && Core.bundle.has("hint." + name() + ".mobile") ? Core.bundle.get("hint." + name() + ".mobile") : Core.bundle.get("hint." + name());
|
||||||
|
if(!Vars.mobile) text = text.replace("tap", "click").replace("Tap", "Click");
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean complete(){
|
||||||
|
return complete.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean show(){
|
||||||
|
return shown.get() && (dependencies.length == 0 || !Structs.contains(dependencies, d -> !d.finished()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int order(){
|
||||||
|
return ordinal();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean valid(){
|
||||||
|
return (Vars.mobile && (visibility & visibleMobile) != 0) || (!Vars.mobile && (visibility & visibleDesktop) != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Hint interface for defining any sort of message appearing at the left. */
|
||||||
|
public interface Hint{
|
||||||
|
int visibleDesktop = 1, visibleMobile = 2, visibleAll = visibleDesktop | visibleMobile;
|
||||||
|
|
||||||
|
/** Hint name for preference storage. */
|
||||||
|
String name();
|
||||||
|
/** Displayed text. */
|
||||||
|
String text();
|
||||||
|
/** @return true if hint objective is complete */
|
||||||
|
boolean complete();
|
||||||
|
/** @return whether the hint is ready to be shown */
|
||||||
|
boolean show();
|
||||||
|
/** @return order integer, determines priority */
|
||||||
|
int order();
|
||||||
|
/** @return whether this hint should be processed, used for platform splits */
|
||||||
|
boolean valid();
|
||||||
|
|
||||||
|
/** finishes the hint - it should not be shown again */
|
||||||
|
default void finish(){
|
||||||
|
Core.settings.put(name() + "-hint-done", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @return whether the hint is finished - if true, it should not be shown again */
|
||||||
|
default boolean finished(){
|
||||||
|
return Core.settings.getBool(name() + "-hint-done", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -53,7 +53,7 @@ public class HudFragment extends Fragment{
|
|||||||
int max = 10;
|
int max = 10;
|
||||||
int winWave = state.isCampaign() && state.rules.winWave > 0 ? state.rules.winWave : Integer.MAX_VALUE;
|
int winWave = state.isCampaign() && state.rules.winWave > 0 ? state.rules.winWave : Integer.MAX_VALUE;
|
||||||
outer:
|
outer:
|
||||||
for(int i = state.wave - 1; i <= Math.min(state.wave + max, winWave); i++){
|
for(int i = state.wave - 1; i <= Math.min(state.wave + max, winWave - 2); i++){
|
||||||
for(SpawnGroup group : state.rules.spawns){
|
for(SpawnGroup group : state.rules.spawns){
|
||||||
if(group.effect == StatusEffects.boss && group.getSpawned(i) > 0){
|
if(group.effect == StatusEffects.boss && group.getSpawned(i) > 0){
|
||||||
int diff = (i + 2) - state.wave;
|
int diff = (i + 2) - state.wave;
|
||||||
@@ -90,25 +90,26 @@ public class HudFragment extends Fragment{
|
|||||||
parent.fill(t -> {
|
parent.fill(t -> {
|
||||||
t.name = "paused";
|
t.name = "paused";
|
||||||
t.top().visible(() -> state.isPaused() && shown).touchable = Touchable.disabled;
|
t.top().visible(() -> state.isPaused() && shown).touchable = Touchable.disabled;
|
||||||
t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX();
|
t.table(Styles.black5, top -> top.label(() -> state.gameOver && state.isCampaign() ? "@sector.curlost" : "@paused").style(Styles.outlineLabel).pad(8f)).growX();
|
||||||
});
|
});
|
||||||
|
|
||||||
//minimap + position
|
//minimap + position
|
||||||
parent.fill(t -> {
|
parent.fill(t -> {
|
||||||
t.name = "minimap/position";
|
t.name = "minimap/position";
|
||||||
t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown);
|
t.visible(() -> Core.settings.getBool("minimap") && shown);
|
||||||
//minimap
|
//minimap
|
||||||
t.add(new Minimap()).name("minimap");
|
t.add(new Minimap()).name("minimap");
|
||||||
t.row();
|
t.row();
|
||||||
//position
|
//position
|
||||||
t.label(() -> player.tileX() + "," + player.tileY())
|
t.label(() -> player.tileX() + "," + player.tileY())
|
||||||
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial)
|
.visible(() -> Core.settings.getBool("position"))
|
||||||
.touchable(Touchable.disabled)
|
.touchable(Touchable.disabled)
|
||||||
.name("position");
|
.name("position");
|
||||||
t.top().right();
|
t.top().right();
|
||||||
});
|
});
|
||||||
|
|
||||||
//TODO tear this all down
|
ui.hints.build(parent);
|
||||||
|
|
||||||
//menu at top left
|
//menu at top left
|
||||||
parent.fill(cont -> {
|
parent.fill(cont -> {
|
||||||
cont.name = "overlaymarker";
|
cont.name = "overlaymarker";
|
||||||
@@ -319,29 +320,6 @@ public class HudFragment extends Fragment{
|
|||||||
.update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled);
|
.update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled);
|
||||||
});
|
});
|
||||||
|
|
||||||
//tutorial text
|
|
||||||
parent.fill(t -> {
|
|
||||||
t.name = "tutorial";
|
|
||||||
Runnable resize = () -> {
|
|
||||||
t.clearChildren();
|
|
||||||
t.top().right().visible(() -> state.rules.tutorial);
|
|
||||||
t.stack(new Button(){{
|
|
||||||
marginLeft(48f);
|
|
||||||
labelWrap(() -> control.tutorial.stage.text() + (control.tutorial.canNext() ? "\n\n" + Core.bundle.get("tutorial.next") : "")).width(!Core.graphics.isPortrait() ? 400f : 160f).pad(2f);
|
|
||||||
clicked(() -> control.tutorial.nextSentence());
|
|
||||||
setDisabled(() -> !control.tutorial.canNext());
|
|
||||||
}},
|
|
||||||
new Table(f -> {
|
|
||||||
f.left().button(Icon.left, Styles.emptyi, () -> {
|
|
||||||
control.tutorial.prevSentence();
|
|
||||||
}).width(44f).growY().visible(() -> control.tutorial.canPrev());
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
resize.run();
|
|
||||||
Events.on(ResizeEvent.class, e -> resize.run());
|
|
||||||
});
|
|
||||||
|
|
||||||
//'saving' indicator
|
//'saving' indicator
|
||||||
parent.fill(t -> {
|
parent.fill(t -> {
|
||||||
t.name = "saving";
|
t.name = "saving";
|
||||||
@@ -465,7 +443,7 @@ public class HudFragment extends Fragment{
|
|||||||
public void showUnlock(UnlockableContent content){
|
public void showUnlock(UnlockableContent content){
|
||||||
//some content may not have icons... yet
|
//some content may not have icons... yet
|
||||||
//also don't play in the tutorial to prevent confusion
|
//also don't play in the tutorial to prevent confusion
|
||||||
if(state.isMenu() || state.rules.tutorial) return;
|
if(state.isMenu()) return;
|
||||||
|
|
||||||
Sounds.message.play();
|
Sounds.message.play();
|
||||||
|
|
||||||
@@ -720,19 +698,15 @@ public class HudFragment extends Fragment{
|
|||||||
float bw = 40f;
|
float bw = 40f;
|
||||||
float pad = -20;
|
float pad = -20;
|
||||||
t.margin(0);
|
t.margin(0);
|
||||||
|
t.clicked(() -> {
|
||||||
t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad);
|
if(!player.dead() && mobile){
|
||||||
t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f).with(i -> {
|
Call.unitClear(player);
|
||||||
if(mobile){
|
control.input.controlledType = null;
|
||||||
//on mobile, cause a respawn on tap
|
|
||||||
i.clicked(() -> {
|
|
||||||
if(!player.unit().spawnedByCore && !player.dead()){
|
|
||||||
Call.unitClear(player);
|
|
||||||
control.input.controlledType = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad);
|
||||||
|
t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f);
|
||||||
t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> {
|
t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> {
|
||||||
b.color.set(player.displayAmmo() ? player.dead() || player.unit() instanceof BlockUnitc ? Pal.ammo : player.unit().type.ammoType.color : Pal.health);
|
b.color.set(player.displayAmmo() ? player.dead() || player.unit() instanceof BlockUnitc ? Pal.ammo : player.unit().type.ammoType.color : Pal.health);
|
||||||
});
|
});
|
||||||
@@ -782,13 +756,11 @@ public class HudFragment extends Fragment{
|
|||||||
return builder;
|
return builder;
|
||||||
}).growX().pad(8f);
|
}).growX().pad(8f);
|
||||||
|
|
||||||
table.touchable(() -> state.rules.waves ? Touchable.enabled : Touchable.disabled);
|
|
||||||
|
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean canSkipWave(){
|
private boolean canSkipWave(){
|
||||||
return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning() && !state.rules.tutorial;
|
return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class PlacementFragment extends Fragment{
|
|||||||
boolean gridUpdate(InputHandler input){
|
boolean gridUpdate(InputHandler input){
|
||||||
scrollPositions.put(currentCategory, blockPane.getScrollY());
|
scrollPositions.put(currentCategory, blockPane.getScrollY());
|
||||||
|
|
||||||
if(Core.input.keyDown(Binding.pick) && player.isBuilder()){ //mouse eyedropper select
|
if(Core.input.keyTap(Binding.pick) && player.isBuilder()){ //mouse eyedropper select
|
||||||
Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
||||||
Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block;
|
Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block;
|
||||||
Object tryConfig = tile == null ? null : tile.config();
|
Object tryConfig = tile == null ? null : tile.config();
|
||||||
@@ -145,7 +145,7 @@ public class PlacementFragment extends Fragment{
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else if(blockSelectEnd || Time.timeSinceMillis(blockSelectSeqMillis) > Core.settings.getInt("blockselecttimeout")){ //1st number of combo, select category
|
}else if(blockSelectEnd || Time.timeSinceMillis(blockSelectSeqMillis) > 750){ //1st number of combo, select category
|
||||||
//select only visible categories
|
//select only visible categories
|
||||||
if(!getUnlockedByCategory(Category.all[i]).isEmpty()){
|
if(!getUnlockedByCategory(Category.all[i]).isEmpty()){
|
||||||
currentCategory = Category.all[i];
|
currentCategory = Category.all[i];
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public class ConstructBlock extends Block{
|
|||||||
consumesTap = true;
|
consumesTap = true;
|
||||||
solidifes = true;
|
solidifes = true;
|
||||||
consBlocks[size - 1] = this;
|
consBlocks[size - 1] = this;
|
||||||
|
sync = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns a ConstructBlock by size. */
|
/** Returns a ConstructBlock by size. */
|
||||||
|
|||||||
@@ -32,8 +32,10 @@ public class Accelerator extends Block{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
|
itemCapacity = 0;
|
||||||
for(ItemStack stack : launching.requirements){
|
for(ItemStack stack : launching.requirements){
|
||||||
capacities[stack.item.id] = stack.amount;
|
capacities[stack.item.id] = stack.amount;
|
||||||
|
itemCapacity += stack.amount;
|
||||||
}
|
}
|
||||||
consumes.items(launching.requirements);
|
consumes.items(launching.requirements);
|
||||||
super.init();
|
super.init();
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public class ItemTurret extends Turret{
|
|||||||
public void build(Building tile, Table table){
|
public void build(Building tile, Table table){
|
||||||
MultiReqImage image = new MultiReqImage();
|
MultiReqImage image = new MultiReqImage();
|
||||||
content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)),
|
content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)),
|
||||||
() -> tile != null && !((ItemTurretBuild)tile).ammo.isEmpty() && ((ItemEntry)((ItemTurretBuild)tile).ammo.peek()).item == item)));
|
() -> tile instanceof ItemTurretBuild it && !it.ammo.isEmpty() && ((ItemEntry)it.ammo.peek()).item == item)));
|
||||||
|
|
||||||
table.add(image).size(8 * 4);
|
table.add(image).size(8 * 4);
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,7 @@ public class ItemTurret extends Turret{
|
|||||||
@Override
|
@Override
|
||||||
public boolean valid(Building entity){
|
public boolean valid(Building entity){
|
||||||
//valid when there's any ammo in the turret
|
//valid when there's any ammo in the turret
|
||||||
return !((ItemTurretBuild)entity).ammo.isEmpty();
|
return entity instanceof ItemTurretBuild it && !it.ammo.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -139,11 +139,6 @@ public class ItemTurret extends Turret{
|
|||||||
|
|
||||||
//must not be found
|
//must not be found
|
||||||
ammo.add(new ItemEntry(item, (int)type.ammoMultiplier));
|
ammo.add(new ItemEntry(item, (int)type.ammoMultiplier));
|
||||||
|
|
||||||
//fire events for the tutorial
|
|
||||||
if(state.rules.tutorial){
|
|
||||||
Events.fire(new TurretAmmoDeliverEvent());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -96,8 +96,6 @@ public class PointDefenseTurret extends ReloadTurret{
|
|||||||
shootSound.at(x + Tmp.v1.x, y + Tmp.v1.y, Mathf.random(0.9f, 1.1f));
|
shootSound.at(x + Tmp.v1.x, y + Tmp.v1.y, Mathf.random(0.9f, 1.1f));
|
||||||
reload = 0;
|
reload = 0;
|
||||||
}
|
}
|
||||||
}else{
|
|
||||||
target = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,33 +93,34 @@ public class TractorBeamTurret extends BaseTurret{
|
|||||||
coolant = 1f + (used * liquid.heatCapacity * coolantMultiplier);
|
coolant = 1f + (used * liquid.heatCapacity * coolantMultiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
any = false;
|
||||||
|
|
||||||
//look at target
|
//look at target
|
||||||
if(target != null && target.within(this, range) && target.team() != team && target.type.flying && efficiency() > 0.01f){
|
if(target != null && target.within(this, range) && target.team() != team && target.type.flying && efficiency() > 0.02f){
|
||||||
if(!headless){
|
if(!headless){
|
||||||
control.sound.loop(shootSound, this, shootSoundVolume);
|
control.sound.loop(shootSound, this, shootSoundVolume);
|
||||||
}
|
}
|
||||||
|
|
||||||
any = true;
|
|
||||||
float dest = angleTo(target);
|
float dest = angleTo(target);
|
||||||
rotation = Angles.moveToward(rotation, dest, rotateSpeed * edelta());
|
rotation = Angles.moveToward(rotation, dest, rotateSpeed * edelta());
|
||||||
lastX = target.x;
|
lastX = target.x;
|
||||||
lastY = target.y;
|
lastY = target.y;
|
||||||
strength = Mathf.lerpDelta(strength, 1f, 0.1f);
|
strength = Mathf.lerpDelta(strength, 1f, 0.1f);
|
||||||
|
|
||||||
if(damage > 0){
|
|
||||||
target.damageContinuous(damage * efficiency());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(status != StatusEffects.none){
|
|
||||||
target.apply(status, statusDuration);
|
|
||||||
}
|
|
||||||
|
|
||||||
//shoot when possible
|
//shoot when possible
|
||||||
if(Angles.within(rotation, dest, shootCone)){
|
if(Angles.within(rotation, dest, shootCone)){
|
||||||
|
if(damage > 0){
|
||||||
|
target.damageContinuous(damage * efficiency());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(status != StatusEffects.none){
|
||||||
|
target.apply(status, statusDuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
any = true;
|
||||||
target.impulse(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * efficiency() * timeScale));
|
target.impulse(Tmp.v1.set(this).sub(target).limit((force + (1f - target.dst(this) / range) * scaledForce) * efficiency() * timeScale));
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
target = null;
|
|
||||||
strength = Mathf.lerpDelta(strength, 0, 0.1f);
|
strength = Mathf.lerpDelta(strength, 0, 0.1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,6 +106,8 @@ public class StackConveyor extends Block implements Autotiler{
|
|||||||
public float cooldown;
|
public float cooldown;
|
||||||
public Item lastItem;
|
public Item lastItem;
|
||||||
|
|
||||||
|
boolean proxUpdating = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
Draw.rect(regions[state], x, y, rotdeg());
|
Draw.rect(regions[state], x, y, rotdeg());
|
||||||
@@ -168,15 +170,15 @@ public class StackConveyor extends Block implements Autotiler{
|
|||||||
|
|
||||||
//update other conveyor state when this conveyor's state changes
|
//update other conveyor state when this conveyor's state changes
|
||||||
if(state != lastState){
|
if(state != lastState){
|
||||||
|
proxUpdating = true;
|
||||||
for(Building near : proximity){
|
for(Building near : proximity){
|
||||||
if(near instanceof StackConveyorBuild){
|
if(!(near instanceof StackConveyorBuild b && b.proxUpdating && b.state != stateUnload)){
|
||||||
near.onProximityUpdate();
|
near.onProximityUpdate();
|
||||||
for(Building other : near.proximity){
|
|
||||||
if(!(other instanceof StackConveyorBuild)) other.onProximityUpdate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
proxUpdating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -366,10 +366,6 @@ public class CoreBlock extends StorageBlock{
|
|||||||
}else{
|
}else{
|
||||||
super.handleItem(source, item);
|
super.handleItem(source, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(state.rules.tutorial){
|
|
||||||
Events.fire(new CoreItemDeliverEvent());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,12 +53,15 @@ public class UnitFactory extends UnitBlock{
|
|||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
capacities = new int[Vars.content.items().size];
|
capacities = new int[Vars.content.items().size];
|
||||||
|
itemCapacity = 0;
|
||||||
for(UnitPlan plan : plans){
|
for(UnitPlan plan : plans){
|
||||||
for(ItemStack stack : plan.requirements){
|
for(ItemStack stack : plan.requirements){
|
||||||
capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2);
|
capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2);
|
||||||
itemCapacity = Math.max(itemCapacity, stack.amount * 2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for(int i : capacities){
|
||||||
|
itemCapacity += i;
|
||||||
|
}
|
||||||
|
|
||||||
super.init();
|
super.init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ public enum BlockFlag{
|
|||||||
/** Any reactor block. */
|
/** Any reactor block. */
|
||||||
reactor,
|
reactor,
|
||||||
/** Any block that boosts unit capacity. */
|
/** Any block that boosts unit capacity. */
|
||||||
unitModifier;
|
unitModifier,
|
||||||
|
/** Blocks that extinguishes fires. */
|
||||||
|
extinguisher;
|
||||||
|
|
||||||
public final static BlockFlag[] all = values();
|
public final static BlockFlag[] all = values();
|
||||||
}
|
}
|
||||||
|
|||||||
9
fastlane/metadata/android/en-US/changelogs/29719.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
- Added tutorial hints (Can be disabled in settings)
|
||||||
|
- Fixed game crashing on systems without audio devices
|
||||||
|
- Removed game startup dialog
|
||||||
|
- Campaign: Balancing of certain preset sectors
|
||||||
|
- Campaign: Made attacks less frequent
|
||||||
|
- Campaign: Shifted AI bases toward poles
|
||||||
|
- Campaign: Increased resource quantities near poles
|
||||||
|
- Campaign: Fixed sectors being accessible after defeat
|
||||||
|
- Campaign: Fixed AI builders sometimes blocking ground unit paths
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
org.gradle.daemon=true
|
org.gradle.daemon=true
|
||||||
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
org.gradle.jvmargs=-Xms256m -Xmx1024m
|
||||||
archash=e327ec0bf805e7ad3cb4d95b242bf8424c487a64
|
archash=9446f0f01b2a1b25abf870a32bf839bc486b12e3
|
||||||
|
|||||||
@@ -405,7 +405,7 @@ public class ServerControl implements ApplicationListener{
|
|||||||
info("Path: @", mod.file.path());
|
info("Path: @", mod.file.path());
|
||||||
info("Description: @", mod.meta.description);
|
info("Description: @", mod.meta.description);
|
||||||
}else{
|
}else{
|
||||||
info("No mod with name '@' found.");
|
info("No mod with name '@' found.", arg[0]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1008,6 +1008,10 @@ public class ServerControl implements ApplicationListener{
|
|||||||
currentLogFile = null;
|
currentLogFile = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(String value : values){
|
||||||
|
text = text.replace(value, "");
|
||||||
|
}
|
||||||
|
|
||||||
if(currentLogFile == null){
|
if(currentLogFile == null){
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(logFolder.child("log-" + i + ".txt").length() >= maxLogLength){
|
while(logFolder.child("log-" + i + ".txt").length() >= maxLogLength){
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package mindustry.server;
|
package mindustry.server;
|
||||||
|
|
||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.backend.headless.*;
|
import arc.backend.headless.*;
|
||||||
import arc.files.*;
|
import arc.files.*;
|
||||||
@@ -86,5 +85,4 @@ public class ServerLauncher implements ApplicationListener{
|
|||||||
|
|
||||||
Events.fire(new ServerLoadEvent());
|
Events.fire(new ServerLoadEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ public class ScriptMainGenerator{
|
|||||||
getClasses("arc.func"),
|
getClasses("arc.func"),
|
||||||
getClasses("arc.struct"),
|
getClasses("arc.struct"),
|
||||||
getClasses("arc.scene"),
|
getClasses("arc.scene"),
|
||||||
getClasses("arc.math")
|
getClasses("arc.math"),
|
||||||
|
getClasses("arc.audio")
|
||||||
);
|
);
|
||||||
classes.addAll(whitelist);
|
classes.addAll(whitelist);
|
||||||
classes.sort(Structs.comparing(Class::getName));
|
classes.sort(Structs.comparing(Class::getName));
|
||||||
|
|||||||