Compare commits
128 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e6513702d6 | ||
|
|
aeddf7014c | ||
|
|
1613f49c16 | ||
|
|
57a833c2fb | ||
|
|
6de53343a4 | ||
|
|
7bb4b09308 | ||
|
|
68020fa7d4 | ||
|
|
b94aba0301 | ||
|
|
0316009a9c | ||
|
|
820f7f0ef2 | ||
|
|
6d105ad3e7 | ||
|
|
f043a5f340 | ||
|
|
73d6f95d2e | ||
|
|
fb48070388 | ||
|
|
fa7697fc40 | ||
|
|
b46a5c0bda | ||
|
|
1072c310ad | ||
|
|
d5448b59a2 | ||
|
|
78317e6126 | ||
|
|
5a58f9c71a | ||
|
|
06b8dd61c7 | ||
|
|
a81b5778a0 | ||
|
|
a7188c4884 | ||
|
|
0bf0d48a02 | ||
|
|
dc5cd196ed | ||
|
|
f8f9bf228b | ||
|
|
d0dc1ea132 | ||
|
|
ff9fad6a2c | ||
|
|
76dbdb59ce | ||
|
|
0013402962 | ||
|
|
1ef7ae7079 | ||
|
|
07a39d0da8 | ||
|
|
b8bfb30c56 | ||
|
|
00342ddaae | ||
|
|
fb40c0b9de | ||
|
|
5d9506eb12 | ||
|
|
080fe8c3c4 | ||
|
|
48745d7380 | ||
|
|
41b50d67af | ||
|
|
b65dffca9d | ||
|
|
66bdfcf877 | ||
|
|
b0082c92c5 | ||
|
|
fdd1c01ac3 | ||
|
|
1ffdd9fd99 | ||
|
|
f64ad2db9f | ||
|
|
7bfe9bf914 | ||
|
|
214f3bb9b5 | ||
|
|
3f51149883 | ||
|
|
2c368953f9 | ||
|
|
9d5454e5ce | ||
|
|
631e4d9eef | ||
|
|
957583071d | ||
|
|
c942331117 | ||
|
|
710a55dc2d | ||
|
|
4bbb4b9a19 | ||
|
|
a2e5dae27f | ||
|
|
d5645b8a7b | ||
|
|
a9f9946a39 | ||
|
|
561deacce4 | ||
|
|
e528e35e06 | ||
|
|
af39d6a6ee | ||
|
|
7a21c02476 | ||
|
|
557e5710cd | ||
|
|
fa52255d04 | ||
|
|
e16622afcc | ||
|
|
f2468f0b3d | ||
|
|
30c9231df6 | ||
|
|
7532aadaf8 | ||
|
|
3d226246b9 | ||
|
|
d6c852a082 | ||
|
|
07a27e913c | ||
|
|
092d152bdc | ||
|
|
8b756d221b | ||
|
|
f33d684dce | ||
|
|
56e41309b1 | ||
|
|
91b24433b9 | ||
|
|
9050937900 | ||
|
|
2e6b90d4d5 | ||
|
|
146b2589e2 | ||
|
|
abd07e1525 | ||
|
|
541da5c0c9 | ||
|
|
21f642ad0c | ||
|
|
0d084d380d | ||
|
|
0fe158d080 | ||
|
|
0cc64c6a8d | ||
|
|
cd684996e1 | ||
|
|
0350e6bbf4 | ||
|
|
4fe5972d89 | ||
|
|
27c8efc672 | ||
|
|
aef0faf79c | ||
|
|
ea7d1dd91e | ||
|
|
ea2b57ec4b | ||
|
|
949f5eccd7 | ||
|
|
e525d89e43 | ||
|
|
6498ce3c4f | ||
|
|
cbf30c599b | ||
|
|
54c406f83d | ||
|
|
7b2957ab41 | ||
|
|
e22fccf5b1 | ||
|
|
ce8b32f022 | ||
|
|
0d0aef3dea | ||
|
|
386da22f6e | ||
|
|
f76b514892 | ||
|
|
77dc959e4a | ||
|
|
a99151441c | ||
|
|
852b0a97fe | ||
|
|
38843c25fb | ||
|
|
ce2750ba60 | ||
|
|
1d3dbddaef | ||
|
|
d8177daada | ||
|
|
3cbcd779eb | ||
|
|
33fc36a2d4 | ||
|
|
c06146110d | ||
|
|
1802aab683 | ||
|
|
49fe47f1f8 | ||
|
|
a13c9d0761 | ||
|
|
3d8479355c | ||
|
|
86c702861e | ||
|
|
47ec13eef4 | ||
|
|
d8cd0d867c | ||
|
|
d5ede6b1bb | ||
|
|
fd931564aa | ||
|
|
6b19178a13 | ||
|
|
64acd6c1e4 | ||
|
|
560914bebe | ||
|
|
2edec90dfb | ||
|
|
10c1305eae | ||
|
|
852c98f004 |
1
.github/workflows/deployment.yml
vendored
1
.github/workflows/deployment.yml
vendored
@@ -50,6 +50,7 @@ jobs:
|
|||||||
echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt
|
echo versionName=6-fdroid-${RELEASE_VERSION:1}$'\n'versionCode=${RELEASE_VERSION:1} > version_fdroid.txt
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Updating to build ${RELEASE_VERSION:1}"
|
git commit -m "Updating to build ${RELEASE_VERSION:1}"
|
||||||
|
git push https://Anuken:${{ secrets.API_TOKEN_GITHUB }}@github.com/Anuken/MindustryBuilds
|
||||||
cd ../Mindustry
|
cd ../Mindustry
|
||||||
- name: Upload client artifacts
|
- name: Upload client artifacts
|
||||||
uses: svenstaro/upload-release-action@v2
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||

|

|
||||||
|
|
||||||
[](https://travis-ci.org/Anuken/Mindustry)
|
[](https://github.com/Anuken/Mindustry/actions)
|
||||||
[](https://discord.gg/mindustry)
|
[](https://discord.gg/mindustry)
|
||||||
|
|
||||||
A sandbox tower defense game written in Java.
|
A sandbox tower defense game written in Java.
|
||||||
|
|
||||||
|
|||||||
@@ -72,9 +72,8 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> loadJar(Fi jar, String mainClass) throws Exception{
|
public ClassLoader loadJar(Fi jar, String mainClass) throws Exception{
|
||||||
DexClassLoader loader = new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader());
|
return new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader());
|
||||||
return Class.forName(mainClass, true, loader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -162,7 +161,6 @@ public class AndroidLauncher extends AndroidApplication{
|
|||||||
}, new AndroidApplicationConfiguration(){{
|
}, new AndroidApplicationConfiguration(){{
|
||||||
useImmersiveMode = true;
|
useImmersiveMode = true;
|
||||||
hideStatusBar = true;
|
hideStatusBar = true;
|
||||||
stencil = 8;
|
|
||||||
}});
|
}});
|
||||||
checkFiles(getIntent());
|
checkFiles(getIntent());
|
||||||
|
|
||||||
|
|||||||
11
build.gradle
11
build.gradle
@@ -35,7 +35,7 @@ allprojects{
|
|||||||
if(!project.hasProperty("versionType")) versionType = 'official'
|
if(!project.hasProperty("versionType")) versionType = 'official'
|
||||||
appName = 'Mindustry'
|
appName = 'Mindustry'
|
||||||
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
|
steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256'
|
||||||
rhinoVersion = '2617981f706e50b8753155d8e15e326308be3b22'
|
rhinoVersion = '378626d8abc552bba57864358358045d2f2dbe9b'
|
||||||
|
|
||||||
loadVersionProps = {
|
loadVersionProps = {
|
||||||
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p }
|
||||||
@@ -318,6 +318,15 @@ project(":core"){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task sourcesJar(type: Jar, dependsOn: classes){
|
||||||
|
classifier = 'sources'
|
||||||
|
from sourceSets.main.allSource
|
||||||
|
}
|
||||||
|
|
||||||
|
artifacts{
|
||||||
|
archives sourcesJar
|
||||||
|
}
|
||||||
|
|
||||||
dependencies{
|
dependencies{
|
||||||
compileJava.dependsOn(preGen)
|
compileJava.dependsOn(preGen)
|
||||||
|
|
||||||
|
|||||||
BIN
core/assets-raw/sprites/ui/pane-solid.9.png
Normal file
BIN
core/assets-raw/sprites/ui/pane-solid.9.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
@@ -113,7 +113,7 @@ committingchanges = Committing Changes
|
|||||||
done = Done
|
done = Done
|
||||||
feature.unsupported = Your device does not support this feature.
|
feature.unsupported = Your device does not support this feature.
|
||||||
|
|
||||||
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub.
|
mods.initfailed = [red]⚠[] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[]\n\nTo disable this feature, turn it off in [accent]Settings->Game->Disable Mods On Startup Crash[].
|
||||||
mods = Mods
|
mods = Mods
|
||||||
mods.none = [lightgray]No mods found!
|
mods.none = [lightgray]No mods found!
|
||||||
mods.guide = Modding Guide
|
mods.guide = Modding Guide
|
||||||
@@ -312,6 +312,7 @@ cancelbuilding = [accent][[{0}][] to clear plan
|
|||||||
selectschematic = [accent][[{0}][] to select+copy
|
selectschematic = [accent][[{0}][] to select+copy
|
||||||
pausebuilding = [accent][[{0}][] to pause building
|
pausebuilding = [accent][[{0}][] to pause building
|
||||||
resumebuilding = [scarlet][[{0}][] to resume building
|
resumebuilding = [scarlet][[{0}][] to resume building
|
||||||
|
enablebuilding = [scarlet][[{0}][] to enable building
|
||||||
showui = UI hidden.\nPress [accent][[{0}][] to show UI.
|
showui = UI hidden.\nPress [accent][[{0}][] to show UI.
|
||||||
wave = [accent]Wave {0}
|
wave = [accent]Wave {0}
|
||||||
wave.cap = [accent]Wave {0}/{1}
|
wave.cap = [accent]Wave {0}/{1}
|
||||||
@@ -683,6 +684,7 @@ stat.drillspeed = Base Drill Speed
|
|||||||
stat.boosteffect = Boost Effect
|
stat.boosteffect = Boost Effect
|
||||||
stat.maxunits = Max Active Units
|
stat.maxunits = Max Active Units
|
||||||
stat.health = Health
|
stat.health = Health
|
||||||
|
stat.armor = Armor
|
||||||
stat.buildtime = Build Time
|
stat.buildtime = Build Time
|
||||||
stat.maxconsecutive = Max Consecutive
|
stat.maxconsecutive = Max Consecutive
|
||||||
stat.buildcost = Build Cost
|
stat.buildcost = Build Cost
|
||||||
@@ -794,9 +796,11 @@ setting.shadows.name = Shadows
|
|||||||
setting.blockreplace.name = Automatic Block Suggestions
|
setting.blockreplace.name = Automatic Block Suggestions
|
||||||
setting.linear.name = Linear Filtering
|
setting.linear.name = Linear Filtering
|
||||||
setting.hints.name = Hints
|
setting.hints.name = Hints
|
||||||
|
setting.logichints.name = Logic Hints
|
||||||
setting.flow.name = Display Resource Flow Rate
|
setting.flow.name = Display Resource Flow Rate
|
||||||
setting.backgroundpause.name = Pause In Background
|
setting.backgroundpause.name = Pause In Background
|
||||||
setting.buildautopause.name = Auto-Pause Building
|
setting.buildautopause.name = Auto-Pause Building
|
||||||
|
setting.modcrashdisable = Disable Mods On Startup Crash
|
||||||
setting.animatedwater.name = Animated Surfaces
|
setting.animatedwater.name = Animated Surfaces
|
||||||
setting.animatedshields.name = Animated Shields
|
setting.animatedshields.name = Animated Shields
|
||||||
setting.antialias.name = Antialias[lightgray] (requires restart)[]
|
setting.antialias.name = Antialias[lightgray] (requires restart)[]
|
||||||
@@ -954,6 +958,8 @@ rules.blockdamagemultiplier = Block Damage Multiplier
|
|||||||
rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier
|
rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier
|
||||||
rules.unithealthmultiplier = Unit Health Multiplier
|
rules.unithealthmultiplier = Unit Health Multiplier
|
||||||
rules.unitdamagemultiplier = Unit Damage Multiplier
|
rules.unitdamagemultiplier = Unit Damage Multiplier
|
||||||
|
rules.unitcapvariable = Cores Contribute To Unit Cap
|
||||||
|
rules.unitcap = Base Unit Cap
|
||||||
rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles)
|
rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles)
|
||||||
rules.wavespacing = Wave Spacing:[lightgray] (sec)
|
rules.wavespacing = Wave Spacing:[lightgray] (sec)
|
||||||
rules.buildcostmultiplier = Build Cost Multiplier
|
rules.buildcostmultiplier = Build Cost Multiplier
|
||||||
@@ -1511,3 +1517,139 @@ unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Co
|
|||||||
unit.alpha.description = Defends the Shard core from enemies. Builds structures.
|
unit.alpha.description = Defends the Shard core from enemies. Builds structures.
|
||||||
unit.beta.description = Defends the Foundation core from enemies. Builds structures.
|
unit.beta.description = Defends the Foundation core from enemies. Builds structures.
|
||||||
unit.gamma.description = Defends the Nucleus core from enemies. Builds structures.
|
unit.gamma.description = Defends the Nucleus core from enemies. Builds structures.
|
||||||
|
|
||||||
|
lst.read = Read a number from a linked memory cell.
|
||||||
|
lst.write = Write a number to a linked memory cell.
|
||||||
|
lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used.
|
||||||
|
lst.draw = Add an operation to the drawing buffer.\nDoes not display anything until [accent]Draw Flush[] is used.
|
||||||
|
lst.drawflush = Flush queued [accent]Draw[] operations to a display.
|
||||||
|
lst.printflush = Flush queued [accent]Print[] operations to a message block.
|
||||||
|
lst.getlink = Get a processor link by index. Starts at 0.
|
||||||
|
lst.control = Control a building.
|
||||||
|
lst.radar = Locate units around a building with range.
|
||||||
|
lst.sensor = Get data from a building or unit.
|
||||||
|
lst.set = Set a variable.
|
||||||
|
lst.operation = Perform an operation on 1-2 variables.
|
||||||
|
lst.end = Jump to the top of the instruction stack.
|
||||||
|
lst.jump = Conditionally jump to another statement.
|
||||||
|
lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
|
||||||
|
lst.unitcontrol = Control the currently bound unit.
|
||||||
|
lst.unitradar = Locate units around the currently bound unit.
|
||||||
|
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
|
||||||
|
|
||||||
|
lenum.type = Type of building/unit.\ne.g. for any router, this will return [accent]@router[].\nNot a string.
|
||||||
|
lenum.shoot = Shoot at a position.
|
||||||
|
lenum.shootp = Shoot at a unit/building with velocity prediction.
|
||||||
|
lenum.configure = Building configuration, e.g. sorter item.
|
||||||
|
lenum.enabled = Whether the block is enabled.
|
||||||
|
|
||||||
|
laccess.color = Illuminator color.
|
||||||
|
|
||||||
|
graphicstype.clear = Fill the display with a color.
|
||||||
|
graphicstype.color = Set color for next drawing operations.
|
||||||
|
graphicstype.stroke = Set line width.
|
||||||
|
graphicstype.line = Draw line segment.
|
||||||
|
graphicstype.rect = Fill a rectangle.
|
||||||
|
graphicstype.linerect = Draw a rectangle outline.
|
||||||
|
graphicstype.poly = Fill a regular polygon.
|
||||||
|
graphicstype.linepoly = Draw a regular polygon outline.
|
||||||
|
graphicstype.triangle = Fill a triangle.
|
||||||
|
graphicstype.image = Draw an image of some content.\nex: [accent]@router[] or [accent]@dagger[].
|
||||||
|
|
||||||
|
lenum.always = Always true.
|
||||||
|
lenum.idiv = Integer division.
|
||||||
|
lenum.div = Division.\nReturns [accent]null[] on divide-by-zero.
|
||||||
|
lenum.mod = Modulo.
|
||||||
|
lenum.equal = Equal. Coerces types.\nNon-null objects compared with numbers become 1, otherwise 0.
|
||||||
|
lenum.notequal = Not equal. Coerces types.
|
||||||
|
lenum.strictequal = Strict equality. Does not coerce types.\nCan be used to check for [accent]null[].
|
||||||
|
lenum.shl = Bit-shift left.
|
||||||
|
lenum.shr = Bit-shift right.
|
||||||
|
lenum.or = Bitwise OR.
|
||||||
|
lenum.land = Logical AND.
|
||||||
|
lenum.and = Bitwise AND.
|
||||||
|
lenum.not = Bitwise flip.
|
||||||
|
lenum.xor = Bitwise XOR.
|
||||||
|
|
||||||
|
lenum.min = Minimum of two numbers.
|
||||||
|
lenum.max = Maximum of two numbers.
|
||||||
|
lenum.angle = Angle of vector in degrees.
|
||||||
|
lenum.len = Length of vector.
|
||||||
|
lenum.sin = Sine, in degrees.
|
||||||
|
lenum.cos = Cosine, in degrees.
|
||||||
|
lenum.tan = Tangent, in degrees.
|
||||||
|
#not a typo, look up 'range notation'
|
||||||
|
lenum.rand = Random number in range [0, value).
|
||||||
|
lenum.log = Natural logarithm (ln).
|
||||||
|
lenum.log10 = Base 10 logarithm.
|
||||||
|
lenum.noise = 2D simplex noise.
|
||||||
|
lenum.abs = Absolute value.
|
||||||
|
lenum.sqrt = Square root.
|
||||||
|
|
||||||
|
lenum.any = Any unit.
|
||||||
|
lenum.ally = Ally unit.
|
||||||
|
lenum.attacker = Unit with a weapon.
|
||||||
|
lenum.enemy = Enemy unit.
|
||||||
|
lenum.boss = Guardian unit.
|
||||||
|
lenum.flying = Flying unit.
|
||||||
|
lenum.ground = Ground unit.
|
||||||
|
lenum.player = Unit controlled by a player.
|
||||||
|
|
||||||
|
lenum.ore = Ore deposit.
|
||||||
|
lenum.damaged = Damaged ally building.
|
||||||
|
lenum.spawn = Enemy spawn point.\nMay be a core or a position.
|
||||||
|
lenum.building = Building in a specific group.
|
||||||
|
|
||||||
|
lenum.core = Any core.
|
||||||
|
lenum.storage = Storage building, e.g. Vault.
|
||||||
|
lenum.generator = Buildings that generate power.
|
||||||
|
lenum.factory = Buildings that transform resources.
|
||||||
|
lenum.repair = Repair points.
|
||||||
|
lenum.rally = Command center.
|
||||||
|
lenum.battery = Any battery.
|
||||||
|
lenum.resupply = Resupply points.\nOnly relevant when [accent]"Unit Ammo"[] is enabled.
|
||||||
|
lenum.reactor = Impact/Thorium reactor.
|
||||||
|
lenum.turret = Any turret.
|
||||||
|
|
||||||
|
sensor.in = The building/unit to sense.
|
||||||
|
|
||||||
|
radar.from = Building to sense from.\nSensor range is limited by building range.
|
||||||
|
radar.target = Filter for units to sense.
|
||||||
|
radar.and = Additional filters.
|
||||||
|
radar.order = Sorting order. 0 to reverse.
|
||||||
|
radar.sort = Metric to sort results by.
|
||||||
|
radar.output = Variable to write output unit to.
|
||||||
|
|
||||||
|
unitradar.target = Filter for units to sense.
|
||||||
|
unitradar.and = Additional filters.
|
||||||
|
unitradar.order = Sorting order. 0 to reverse.
|
||||||
|
unitradar.sort = Metric to sort results by.
|
||||||
|
unitradar.output = Variable to write output unit to.
|
||||||
|
|
||||||
|
control.of = Building to control.
|
||||||
|
control.unit = Unit/building to aim at.
|
||||||
|
control.shoot = Whether to shoot.
|
||||||
|
|
||||||
|
unitlocate.enemy = Whether to locate enemy buildings.
|
||||||
|
unitlocate.found = Whether the object was found.
|
||||||
|
unitlocate.building = Output variable for located building.
|
||||||
|
unitlocate.outx = Output X coordinate.
|
||||||
|
unitlocate.outy = Output Y coordinate.
|
||||||
|
unitlocate.group = Building group to look for.
|
||||||
|
|
||||||
|
lenum.stop = Stop moving/mining/building.
|
||||||
|
lenum.move = Move to exact position.
|
||||||
|
lenum.approach = Approach a position with a radius.
|
||||||
|
lenum.pathfind = Pathfind to the enemy spawn.
|
||||||
|
lenum.target = Shoot a position.
|
||||||
|
lenum.targetp = Shoot a target with velocity prediction.
|
||||||
|
lenum.itemdrop = Drop an item.
|
||||||
|
lenum.itemtake = Take an item from a building.
|
||||||
|
lenum.paydrop = Drop current payload.
|
||||||
|
lenum.paytake = Pick up payload at current location.
|
||||||
|
lenum.flag = Numeric unit flag.
|
||||||
|
lenum.mine = Mine at a position.
|
||||||
|
lenum.build = Build a structure.
|
||||||
|
lenum.getblock = Fetch a building and type at coordinates.\nUnit must be in range of position.\nSolid non-buildings will have the type [accent]@solid[].
|
||||||
|
lenum.within = Check if unit is near a position.
|
||||||
|
lenum.boost = Start/stop boosting.
|
||||||
@@ -41,10 +41,13 @@ be.ignore = Ignorieren
|
|||||||
be.noupdates = Keine Aktualisierungen gefunden.
|
be.noupdates = Keine Aktualisierungen gefunden.
|
||||||
be.check = Auf Aktualisierungen prüfen
|
be.check = Auf Aktualisierungen prüfen
|
||||||
|
|
||||||
mod.featured.dialog.title = Mod Browser (unfertig)
|
mod.featured.dialog.title = Mod Browser
|
||||||
mods.browser.selected = Ausgewählter Mod
|
mods.browser.selected = Ausgewählter Mod
|
||||||
mods.browser.add = Installieren
|
mods.browser.add = Installieren
|
||||||
mods.github.open = Ansehen
|
mods.browser.reinstall = Neu Installieren
|
||||||
|
mods.github.open = Github
|
||||||
|
mods.browser.sortdate = Nach neusten sortieren
|
||||||
|
mods.browser.sortstars = Nach Sternen sortieren
|
||||||
|
|
||||||
schematic = Entwurf
|
schematic = Entwurf
|
||||||
schematic.add = Entwurf speichern...
|
schematic.add = Entwurf speichern...
|
||||||
@@ -68,9 +71,9 @@ schematic.disabled = [scarlet]Entwürfe deaktiviert[]\nAuf dieser [accent]Karte[
|
|||||||
stats = Statistiken
|
stats = Statistiken
|
||||||
stat.wave = Wellen besiegt:[accent] {0}
|
stat.wave = Wellen besiegt:[accent] {0}
|
||||||
stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
|
stat.enemiesDestroyed = Gegner zerstört:[accent] {0}
|
||||||
stat.built = Gebäude gebaut:[accent] {0}
|
stat.built = Blöcke gebaut:[accent] {0}
|
||||||
stat.destroyed = Gebäude zerstört:[accent] {0}
|
stat.destroyed = Blöcke zerstört:[accent] {0}
|
||||||
stat.deconstructed = Gebäude abgebaut:[accent] {0}
|
stat.deconstructed = Blöcke abgebaut:[accent] {0}
|
||||||
stat.delivered = Übertragene Ressourcen:
|
stat.delivered = Übertragene Ressourcen:
|
||||||
stat.playtime = Spielzeit:[accent] {0}
|
stat.playtime = Spielzeit:[accent] {0}
|
||||||
stat.rank = Finaler Rang:[accent] {0}
|
stat.rank = Finaler Rang:[accent] {0}
|
||||||
@@ -116,8 +119,10 @@ mods.none = [lightgray]Keine Mods gefunden!
|
|||||||
mods.guide = Modding-Anleitung
|
mods.guide = Modding-Anleitung
|
||||||
mods.report = Problem melden
|
mods.report = Problem melden
|
||||||
mods.openfolder = Mod-Verzeichnis öffnen
|
mods.openfolder = Mod-Verzeichnis öffnen
|
||||||
|
mods.viewcontent = Inhalt ansehen
|
||||||
mods.reload = Neu laden
|
mods.reload = Neu laden
|
||||||
mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden.
|
mods.reloadexit = Das Spiel wird jetzt beendet, um die Mod-Änderungen anzuwenden.
|
||||||
|
mod.installed = [[Installiert]
|
||||||
mod.display = [gray]Mod:[orange] {0}
|
mod.display = [gray]Mod:[orange] {0}
|
||||||
mod.enabled = [lightgray]Aktiviert
|
mod.enabled = [lightgray]Aktiviert
|
||||||
mod.disabled = [scarlet]Deaktiviert
|
mod.disabled = [scarlet]Deaktiviert
|
||||||
@@ -287,6 +292,7 @@ cancel = Abbruch
|
|||||||
openlink = Link öffnen
|
openlink = Link öffnen
|
||||||
copylink = Link kopieren
|
copylink = Link kopieren
|
||||||
back = Zurück
|
back = Zurück
|
||||||
|
max = Max
|
||||||
crash.export = Crash-Logs exportieren
|
crash.export = Crash-Logs exportieren
|
||||||
crash.none = Keine Crash-Logs gefunden.
|
crash.none = Keine Crash-Logs gefunden.
|
||||||
crash.exported = Crash-Logs wurden erfolgreich exportiert.
|
crash.exported = Crash-Logs wurden erfolgreich exportiert.
|
||||||
@@ -306,6 +312,7 @@ cancelbuilding = [accent][[{0}][] um den Plan zu leeren
|
|||||||
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
|
selectschematic = [accent][[{0}][] zum Auswählen+Kopieren
|
||||||
pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
|
pausebuilding = [accent][[{0}][] um das Bauen zu pausieren
|
||||||
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
|
resumebuilding = [scarlet][[{0}][] um das Bauen fortzusetzen
|
||||||
|
enablebuilding = [scarlet][[{0}][] um zu bauen
|
||||||
showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen.
|
showui = Bedienflächen versteckt.\nDrücke [accent][[{0}][], um sie wieder anzuzeigen.
|
||||||
wave = [accent]Welle {0}
|
wave = [accent]Welle {0}
|
||||||
wave.cap = [accent]Welle {0}/{1}
|
wave.cap = [accent]Welle {0}/{1}
|
||||||
@@ -361,7 +368,6 @@ editor.center = Zur Mitte
|
|||||||
workshop = Workshop
|
workshop = Workshop
|
||||||
waves.title = Wellen
|
waves.title = Wellen
|
||||||
waves.remove = Entfernen
|
waves.remove = Entfernen
|
||||||
waves.never = <nie>
|
|
||||||
waves.every = alle
|
waves.every = alle
|
||||||
waves.waves = Welle(n)
|
waves.waves = Welle(n)
|
||||||
waves.perspawn = pro Spawn
|
waves.perspawn = pro Spawn
|
||||||
@@ -390,7 +396,7 @@ editor.removeunit = Bereich entfernen
|
|||||||
editor.teams = Teams
|
editor.teams = Teams
|
||||||
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
|
editor.errorload = Fehler beim Laden der Datei:\n[accent]{0}
|
||||||
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
|
editor.errorsave = Fehler beim Speichern der Datei:\n[accent]{0}
|
||||||
editor.errorimage = Das ist ein Bild, keine Karte. Wechsle nicht den Dateityp und erwarte, dass es funktioniert.\n\nWenn du eine 'v3.5/build 40'-Karte importieren möchtest, benutze den 'Importiere Terrainbild'-Knopf im Editor.
|
editor.errorimage = Das ist ein Bild, keine Karte.
|
||||||
editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
|
editor.errorlegacy = Diese Karte ist zu alt und benutzt ein veraltetes Kartenformat, das nicht mehr unterstützt wird.
|
||||||
editor.errornot = Dies ist keine Kartendatei.
|
editor.errornot = Dies ist keine Kartendatei.
|
||||||
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
|
editor.errorheader = Diese Karte ist entweder nicht gültig oder beschädigt.
|
||||||
@@ -678,6 +684,7 @@ stat.drillspeed = Bohrgeschwindigkeit
|
|||||||
stat.boosteffect = Verstärkungseffekt
|
stat.boosteffect = Verstärkungseffekt
|
||||||
stat.maxunits = Max. aktive Einheiten
|
stat.maxunits = Max. aktive Einheiten
|
||||||
stat.health = Lebenspunkte
|
stat.health = Lebenspunkte
|
||||||
|
stat.armour = Panzer
|
||||||
stat.buildtime = Baudauer
|
stat.buildtime = Baudauer
|
||||||
stat.maxconsecutive = Max. Konsekutive
|
stat.maxconsecutive = Max. Konsekutive
|
||||||
stat.buildcost = Baukosten
|
stat.buildcost = Baukosten
|
||||||
@@ -693,6 +700,7 @@ stat.lightningchance = Blitzwahrscheinlichkeit
|
|||||||
stat.lightningdamage = Blitzschaden
|
stat.lightningdamage = Blitzschaden
|
||||||
stat.flammability = Brennbarkeit
|
stat.flammability = Brennbarkeit
|
||||||
stat.radioactivity = Radioaktivität
|
stat.radioactivity = Radioaktivität
|
||||||
|
stat.charge = Ladung
|
||||||
stat.heatcapacity = Hitzekapazität
|
stat.heatcapacity = Hitzekapazität
|
||||||
stat.viscosity = Viskosität
|
stat.viscosity = Viskosität
|
||||||
stat.temperature = Temperatur
|
stat.temperature = Temperatur
|
||||||
@@ -720,6 +728,7 @@ bar.corereq = Kern-Basis erforderlich
|
|||||||
bar.drillspeed = Bohrgeschwindigkeit: {0}/s
|
bar.drillspeed = Bohrgeschwindigkeit: {0}/s
|
||||||
bar.pumpspeed = Pumpengeschwindigkeit: {0}/s
|
bar.pumpspeed = Pumpengeschwindigkeit: {0}/s
|
||||||
bar.efficiency = Effizienz: {0}%
|
bar.efficiency = Effizienz: {0}%
|
||||||
|
bar.boost = Beschleunigung: {0}%
|
||||||
bar.powerbalance = Strom: {0}/s
|
bar.powerbalance = Strom: {0}/s
|
||||||
bar.powerstored = Gespeichert: {0}/{1}
|
bar.powerstored = Gespeichert: {0}/{1}
|
||||||
bar.poweramount = Strom: {0}
|
bar.poweramount = Strom: {0}
|
||||||
@@ -787,6 +796,7 @@ setting.shadows.name = Schatten
|
|||||||
setting.blockreplace.name = Automatische Blockvorschläge
|
setting.blockreplace.name = Automatische Blockvorschläge
|
||||||
setting.linear.name = Lineare Filterung
|
setting.linear.name = Lineare Filterung
|
||||||
setting.hints.name = Tipps
|
setting.hints.name = Tipps
|
||||||
|
setting.logichints.name = Logiktipps
|
||||||
setting.flow.name = Ressourcen-Fluss anzeigen
|
setting.flow.name = Ressourcen-Fluss anzeigen
|
||||||
setting.backgroundpause.name = Im Hintergrund pausieren
|
setting.backgroundpause.name = Im Hintergrund pausieren
|
||||||
setting.buildautopause.name = Bauen automatisch pausieren
|
setting.buildautopause.name = Bauen automatisch pausieren
|
||||||
@@ -935,6 +945,7 @@ mode.custom = Angepasste Regeln
|
|||||||
|
|
||||||
rules.infiniteresources = Unbegrenzte Ressourcen
|
rules.infiniteresources = Unbegrenzte Ressourcen
|
||||||
rules.reactorexplosions = Reaktor-Explosionen
|
rules.reactorexplosions = Reaktor-Explosionen
|
||||||
|
rules.coreincinerates = Kern verbrennt überflüssige Materialien
|
||||||
rules.schematic = Entwürfe erlaubt
|
rules.schematic = Entwürfe erlaubt
|
||||||
rules.wavetimer = Wellen-Timer
|
rules.wavetimer = Wellen-Timer
|
||||||
rules.waves = Wellen
|
rules.waves = Wellen
|
||||||
@@ -946,6 +957,8 @@ rules.blockdamagemultiplier = Block-Schaden-Multiplikator
|
|||||||
rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator
|
rules.unitbuildspeedmultiplier = Baugeschwindigkeit-Einheit Multiplikator
|
||||||
rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator
|
rules.unithealthmultiplier = Lebenspunkte-Einheit Multiplikator
|
||||||
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
|
rules.unitdamagemultiplier = Schaden-Einheit Multiplikator
|
||||||
|
rules.unitcapvariable = Kerne zählen zum Einheiten-Limit dazu
|
||||||
|
rules.unitcap = Einheiten-Limit
|
||||||
rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln)
|
rules.enemycorebuildradius = Bauverbot-Radius durch feindlichen Kern:[lightgray] (Kacheln)
|
||||||
rules.wavespacing = Wellen-Abstand:[lightgray] (Sek)
|
rules.wavespacing = Wellen-Abstand:[lightgray] (Sek)
|
||||||
rules.buildcostmultiplier = Bau-Kosten Multiplikator
|
rules.buildcostmultiplier = Bau-Kosten Multiplikator
|
||||||
@@ -955,7 +968,7 @@ rules.waitForWaveToEnd = Warten bis Welle endet
|
|||||||
rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln)
|
rules.dropzoneradius = Drop-Zonen-Radius:[lightgray] (Kacheln)
|
||||||
rules.unitammo = Einheiten benötigen Munition
|
rules.unitammo = Einheiten benötigen Munition
|
||||||
rules.title.waves = Wellen
|
rules.title.waves = Wellen
|
||||||
rules.title.resourcesbuilding = Ressourcen & Gebäude
|
rules.title.resourcesbuilding = Ressourcen & Blöcke
|
||||||
rules.title.enemy = Gegner
|
rules.title.enemy = Gegner
|
||||||
rules.title.unit = Einheiten
|
rules.title.unit = Einheiten
|
||||||
rules.title.experimental = Experimentell
|
rules.title.experimental = Experimentell
|
||||||
@@ -1031,7 +1044,7 @@ unit.reign.name = Reign
|
|||||||
unit.vela.name = Vela
|
unit.vela.name = Vela
|
||||||
unit.corvus.name = Korvus
|
unit.corvus.name = Korvus
|
||||||
|
|
||||||
block.resupply-point.name = Nachlade-Punkt
|
block.resupply-point.name = Munitionsvorrat
|
||||||
block.parallax.name = Parallax
|
block.parallax.name = Parallax
|
||||||
block.cliff.name = Klippe
|
block.cliff.name = Klippe
|
||||||
block.sand-boulder.name = Sandbrocken
|
block.sand-boulder.name = Sandbrocken
|
||||||
@@ -1310,7 +1323,7 @@ item.coal.details = Scheint versteinerte Pflanzenmasse zu sein, die sich schon l
|
|||||||
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt.
|
item.titanium.description = Wird im Flüssigkeitsbereich, im Bohrerbereich und für Flugzeuge vielfältig eingesetzt.
|
||||||
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
|
item.thorium.description = Wird als festes Baumaterial oder radioaktiver Kraftstoff verwendet.
|
||||||
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet.
|
item.scrap.description = Wird in Pulverisierer und Schmelzer zu anderen Materialien bearbeitet.
|
||||||
item.scrap.details = Übriggebliebene Reste alter Gebäude oder Einheiten.
|
item.scrap.details = Übriggebliebene Reste alter Blöcke oder Einheiten.
|
||||||
item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet.
|
item.silicon.description = Wird in Solarzellen, komplizierter Elektronik und als zielsuchende Munition verwendet.
|
||||||
item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt.
|
item.plastanium.description = Wird für fortgeschrittene Einheiten, Isolation und Munition eingesetzt.
|
||||||
item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden.
|
item.phase-fabric.description = Kann in Elektronik und selbstreparierende Blöcke verwendet werden.
|
||||||
@@ -1381,8 +1394,8 @@ block.inverted-sorter.description = Wie ein normaler Sortierer, aber gibt das au
|
|||||||
block.router.description = Verteilt Materialien auf bis zu drei Richtungen.
|
block.router.description = Verteilt Materialien auf bis zu drei Richtungen.
|
||||||
block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
|
block.router.details = Ein nötiges Übel. Es ist nicht empfehlenswert, ihn neben Fabriken zu setzen, da er sich dort verstopfen kann.
|
||||||
block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen.
|
block.distributor.description = Verteilt Materialien auf bis zu sieben Richtungen.
|
||||||
block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden.
|
block.overflow-gate.description = Gibt Materialien nur zu den Seiten heraus, wenn der fordere Ausgang blockiert ist.
|
||||||
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind. Kann nicht neben anderen Überlauf- oder Unterlauftoren verwendet werden.
|
block.underflow-gate.description = Das Gegenteil eines Überlauftors. Gibt Materialien nur nach vorne heraus, wenn die Seiten blockiert sind.
|
||||||
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
|
block.mass-driver.description = Ein Transportblock mit sehr hoher Reichweite. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger.
|
||||||
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
|
block.mechanical-pump.description = Eine Pumpe, die keinen Strom benötigt.
|
||||||
block.rotary-pump.description = Eine Pumpe, die Strom verbraucht.
|
block.rotary-pump.description = Eine Pumpe, die Strom verbraucht.
|
||||||
@@ -1503,3 +1516,138 @@ unit.omura.description = Schießt eine Railgun mit hoher Reichweite, um Gegner z
|
|||||||
unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke.
|
unit.alpha.description = Beschützt den Scherbenkern vor Feinden. Baut Blöcke.
|
||||||
unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke.
|
unit.beta.description = Beschützt den Fundamentkern vor Feinden. Baut Blöcke.
|
||||||
unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke.
|
unit.gamma.description = Beschützt den Nukleuskern vor Feinden. Baut Blöcke.
|
||||||
|
|
||||||
|
lst.read = Liest einen Wert aus einer verbundenen Spiecherzelle.
|
||||||
|
lst.write = Schreibt eine Zahl in einer verbundene Speicherzelle.
|
||||||
|
lst.print = Fügt Text zum Textspeicher hinzu.\nZeigt nichts an, bis [accent]Print Flush[] verwendet wird.
|
||||||
|
lst.draw = Fügt eine [accent]Draw[]-Aufgabe zum Bildspeicher hinzu.\nZeigt nichts an, bis [accent]Draw Flush[] verwendet wird.
|
||||||
|
lst.drawflush = Druckt [accent]Draw[]-Aufgaben aus dem Bildspeicher auf einen Bildschirm.
|
||||||
|
lst.printflush = Druckt [accent]Print[]-Aufgaben aus dem Textspeicher auf einen Nachrichtenblock.
|
||||||
|
lst.getlink = Gibt ein verbundenen Block wieder. Fängt bei 0 an.
|
||||||
|
lst.control = Steuert einen Block.
|
||||||
|
lst.radar = Findet Einheiten.
|
||||||
|
lst.sensor = Gibt Daten über einen Block oder eine Einheit wieder.
|
||||||
|
lst.set = Setzt eine Variable fest.
|
||||||
|
lst.operation = Verändert eine Variable.
|
||||||
|
lst.end = Springt wieder nach oben.
|
||||||
|
lst.jump = Falls die Bedingung erfüllt ist, wird woanders weitergemacht.
|
||||||
|
lst.unitbind = Speichert eine Einheit einer Sorte als [accent]@unit[].
|
||||||
|
lst.unitcontrol = Steuert [accent]@unit[].
|
||||||
|
lst.unitradar = Findet Einheiten in der Nähe von [accent]@unit[].
|
||||||
|
lst.unitlocate = Findet mit [accent]@unit[] bestimmte Positionen / Blöcke auf der ganzen Karte.
|
||||||
|
|
||||||
|
lenum.type = Englischer Name eines Blocks / einer Einheit. Ein Verteiler gibt [accent]@router[] wieder.\nKein string.
|
||||||
|
lenum.shoot = Schießt auf eine Position.
|
||||||
|
lenum.shootp = Schießt auf eine Einheit / einen Block und sagt deren Position voraus.
|
||||||
|
lenum.configure = Blockkonfiguration, z.B. das ausgewählte Item in einem Sortierer.
|
||||||
|
lenum.enabled = Ob der Block an oder aus ist.
|
||||||
|
|
||||||
|
laccess.color = Illuminiererfarbe.
|
||||||
|
|
||||||
|
graphicstype.stroke = Setzt die Linienbreite fest.
|
||||||
|
graphicstype.line = Zeichnet eine Linie.
|
||||||
|
graphicstype.clear = Füllt den Bildschirm mit einer Farbe.
|
||||||
|
graphicstype.color = Wählt eine Farbe aus.
|
||||||
|
graphicstype.rect = Zeichnet ein Rechteck.
|
||||||
|
graphicstype.linerect = Zeichnet den Umriss eines Rechtecks.
|
||||||
|
graphicstype.poly = Füllt ein gleichmäßiges Polygon.
|
||||||
|
graphicstype.linepoly = Zeichnet den Umriss eines gleichmäßigen Polygons.
|
||||||
|
graphicstype.triangle = Zeichnet ein Dreieck.
|
||||||
|
graphicstype.image = Zeichnet ein Bild von einem englischen Namen.\nz.B. [accent]@router[] oder [accent]@dagger[].
|
||||||
|
lenum.always = Immer.
|
||||||
|
lenum.idiv = Division mit ganzen Zahlen.
|
||||||
|
lenum.div = Division.\nGibt bei Teilung durch null [accent]null[] zurück.
|
||||||
|
lenum.mod = Modulo.
|
||||||
|
lenum.equal = Prüft Gleichheit.\nNicht-"null" Objekte, die mit Zahlen verglichen werden, werden 1.
|
||||||
|
lenum.notequal = Prüft Ungleichheit.
|
||||||
|
lenum.strictequal = Prüft strenge Gleichheit.\nKann verwendet werden, um "null" zu finden.
|
||||||
|
lenum.shl = Bit-shift nacht links.
|
||||||
|
lenum.shr = Bit-shift nach rechts.
|
||||||
|
lenum.or = Bitwise ODER.
|
||||||
|
lenum.land = Logisches AND.
|
||||||
|
lenum.and = Bitwise UND.
|
||||||
|
lenum.not = Bitwise NOT.
|
||||||
|
lenum.xor = Bitwise XOR.
|
||||||
|
|
||||||
|
lenum.min = Die Größte von zwei Zahlen.
|
||||||
|
lenum.max = Die Kleinste von zwei Zahlen.
|
||||||
|
lenum.angle = Angle of vector in degrees.
|
||||||
|
lenum.len = Length of vector.
|
||||||
|
lenum.sin = Sinus in Grad.
|
||||||
|
lenum.cos = Cosinus in Grad.
|
||||||
|
lenum.tan = Tangens in Grad.
|
||||||
|
#not a typo, look up 'range notation'
|
||||||
|
lenum.rand = Zufällige Zahl zwischen [0, <wert>).
|
||||||
|
lenum.log = Logarithmus (ln).
|
||||||
|
lenum.log10 = Logarithmus zur Basis 10.
|
||||||
|
lenum.noise = 2D rauschen.
|
||||||
|
lenum.abs = Betrag.
|
||||||
|
lenum.sqrt = Quadratwurzel.
|
||||||
|
|
||||||
|
lenum.any = Irgendeine Einheit.
|
||||||
|
lenum.ally = Freundliche Einheit.
|
||||||
|
lenum.attacker = Einheit mit Waffe.
|
||||||
|
lenum.enemy = Gegnerische Einheit.
|
||||||
|
lenum.boss = Bosseinheit.
|
||||||
|
lenum.flying = Lufteinheit.
|
||||||
|
lenum.ground = Bodeneinheit.
|
||||||
|
lenum.player = Spielergesteuerte Einheit.
|
||||||
|
|
||||||
|
lenum.ore = Erz.
|
||||||
|
lenum.damaged = Beschädigter, alliierter Block.
|
||||||
|
lenum.spawn = Gegnerischer Spawnpunkt.\nKann ein Kern oder eine Position sein.
|
||||||
|
lenum.building = Ein Block einer bestimmten Sorte.
|
||||||
|
|
||||||
|
lenum.core = Irgendein Kern.
|
||||||
|
lenum.storage = Speicherblock, z.B. ein Tresor.
|
||||||
|
lenum.generator = Blöcke, die Strom generieren.
|
||||||
|
lenum.factory = Blöcke, die Ressourcen verarbeiten.
|
||||||
|
lenum.repair = Reperaturpunkt.
|
||||||
|
lenum.rally = Kommandozentrale
|
||||||
|
lenum.battery = Irgendeine Batterie.
|
||||||
|
lenum.resupply = Munitionsvorrat.\nNur wichtig, wenn [accent]"Einheiten benötigen Munition"[] an ist.
|
||||||
|
lenum.reactor = Schlag- / Thoriumreaktor.
|
||||||
|
lenum.turret = Irgendein Geschütz.
|
||||||
|
|
||||||
|
sensor.in = Der Block / die Einheit.
|
||||||
|
|
||||||
|
radar.from = Block zu benutzen. [accent]Sensor[]-Reichweite hängt von der Blockreichweite ab.
|
||||||
|
radar.target = Einheitenfilter.
|
||||||
|
radar.and = Weitere Filter.
|
||||||
|
radar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts.
|
||||||
|
radar.sort = Sortiermethode der Ergebnisse.
|
||||||
|
radar.output = Variable für das Ergebnis.
|
||||||
|
|
||||||
|
unitradar.target = Einheitenfilter.
|
||||||
|
unitradar.and = Weitere Filter.
|
||||||
|
unitradar.order = Sortierreihenfolge der Ergebnisse. 0 bedeutet rückwärts.
|
||||||
|
unitradar.sort = Sortiermethode der Ergebnisse.
|
||||||
|
unitradar.output = Variable für das Ergebnis.
|
||||||
|
|
||||||
|
control.of = Block, der gesteuert werden soll.
|
||||||
|
control.unit = Zieleinheit / Zielblock.
|
||||||
|
control.shoot = Ob geschossen werden soll.
|
||||||
|
|
||||||
|
unitlocate.enemy = Ob gegnerische Blöcke gesucht werden sollen.
|
||||||
|
unitlocate.found = Ob der Block gefunden wurde.
|
||||||
|
unitlocate.building = Variable für das Ergebnis.
|
||||||
|
unitlocate.outx = Variable für die X-Koordinate.
|
||||||
|
unitlocate.outy = Variable für die Y-Koordinate.
|
||||||
|
unitlocate.group = Gesuchter Blocktyp.
|
||||||
|
|
||||||
|
lenum.stop = Bewegung / Abbau / Bau abbrechen.
|
||||||
|
lenum.move = Geht zu diese Position.
|
||||||
|
lenum.approach = Geht auf einen Punkt mit einem bestimmten Radius zu.
|
||||||
|
lenum.pathfind = Geht zum gegnerischen Spawnpunkt.
|
||||||
|
lenum.target = Schießt auf eine Position.
|
||||||
|
lenum.targetp = Schießt auf eine Einheit und sagt deren Position voraus.
|
||||||
|
lenum.itemdrop = Items abwerfen.
|
||||||
|
lenum.itemtake = Items aus einem Block nehmen.
|
||||||
|
lenum.paydrop = Lässt einen Block / eine Einheit wieder fallen.
|
||||||
|
lenum.paytake = Hebt einen Block / eine kleine Einheit auf.
|
||||||
|
lenum.flag = Zahl, mit der eine Einheit identifiziert werden kann.
|
||||||
|
lenum.mine = Erz von einer Position abbauen.
|
||||||
|
lenum.build = Einen Block bauen.
|
||||||
|
lenum.getblock = Gibt den Blocktyp an den Koordinaten zurück.\nEinheiten müssen nah genug dran sein.\nFeste nicht-Blöcke sind [accent]@solid[].
|
||||||
|
lenum.within = Prüft, ob eine Einheit in einem Radius um einen Punkt ist.
|
||||||
|
lenum.boost = Aktiviert / deaktiviert den Boost.
|
||||||
@@ -693,7 +693,8 @@ stat.lightningchance = Probabilidad de descarga
|
|||||||
stat.lightningdamage = Daño por rayo
|
stat.lightningdamage = Daño por rayo
|
||||||
stat.flammability = Inflamabilidad
|
stat.flammability = Inflamabilidad
|
||||||
stat.radioactivity = Radioactividad
|
stat.radioactivity = Radioactividad
|
||||||
stat.heatcapacity = Resistencia temperatura
|
stat.charge = Carga eléctrica
|
||||||
|
stat.heatcapacity = Resistencia a la temperatura
|
||||||
stat.viscosity = Viscosidad
|
stat.viscosity = Viscosidad
|
||||||
stat.temperature = Temperatura
|
stat.temperature = Temperatura
|
||||||
stat.speed = Velocidad
|
stat.speed = Velocidad
|
||||||
@@ -1116,7 +1117,7 @@ block.plastanium-wall.name = Muro de Plastanio
|
|||||||
block.plastanium-wall-large.name = Muro de Plastanio grande
|
block.plastanium-wall-large.name = Muro de Plastanio grande
|
||||||
block.phase-wall.name = Muro de Fase grande
|
block.phase-wall.name = Muro de Fase grande
|
||||||
block.phase-wall-large.name = Muro de Fase grande
|
block.phase-wall-large.name = Muro de Fase grande
|
||||||
block.thorium-wall.name = Pared de Torio
|
block.thorium-wall.name = Muro de Torio
|
||||||
block.thorium-wall-large.name = Muro de Torio grande
|
block.thorium-wall-large.name = Muro de Torio grande
|
||||||
block.door.name = Puerta
|
block.door.name = Puerta
|
||||||
block.door-large.name = Puerta Grande
|
block.door-large.name = Puerta Grande
|
||||||
@@ -1329,16 +1330,16 @@ block.graphite-press.description = Comprime carbón en piezas de grafito puro.
|
|||||||
block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente.
|
block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente.
|
||||||
block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio.
|
block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio.
|
||||||
block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar.
|
block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía para funcionar.
|
||||||
block.plastanium-compressor.description = Produce plastanio con aceite y titanio.
|
block.plastanium-compressor.description = Produce plastanio con petróleo y titanio.
|
||||||
block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena.
|
block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena.
|
||||||
block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre.
|
block.alloy-smelter.description = Produce aleación eléctrica con titanio, plomo, silicio y cobre.
|
||||||
block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar.
|
block.cryofluid-mixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar.
|
||||||
block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo.
|
block.blast-mixer.description = Usa esporas para transformar pirotita en un objeto menos inflamable pero más explosivo: el compuesto explosivo.
|
||||||
block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable.
|
block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable.
|
||||||
block.melter.description = Calienta piedra a temperaturas muy altas para obtener lava.
|
block.melter.description = Calienta chatarra a temperaturas muy altas para obtener magma.
|
||||||
block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra.
|
block.separator.description = Expone piedra a la presión del agua para obtener diversos minerales contenidos en la piedra.
|
||||||
block.spore-press.description = Comprime esporas en petróleo.
|
block.spore-press.description = Comprime esporas en petróleo.
|
||||||
block.pulverizer.description = Despedaza la piedra en arena. Útil cuando no hay arena natural.
|
block.pulverizer.description = Despedaza la chatarra en arena. Útil cuando no hay arena natural.
|
||||||
block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón.
|
block.coal-centrifuge.description = Solidifica petróleo en piezas de carbón.
|
||||||
block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso.
|
block.incinerator.description = Se deshace de cualquier líquido o material producido en exceso.
|
||||||
block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre.
|
block.power-void.description = Elimina toda la energía que se le da. Solo en disponible en el modo Libre.
|
||||||
@@ -1351,7 +1352,7 @@ block.copper-wall.description = Un bloque defensivo barato.\nÚtil para defender
|
|||||||
block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas.
|
block.copper-wall-large.description = Un bloque defensivo barato.\nÚtil para defender el núcleo y las torres en las primeras oleadas.\nOcupa múltiples casillas.
|
||||||
block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.
|
block.titanium-wall.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.
|
||||||
block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas.
|
block.titanium-wall-large.description = Un bloque defensivo moderadamente fuerte.\nProporciona protección moderada contra los enemigos.\nOcupa múltiples casillas.
|
||||||
block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia..
|
block.plastanium-wall.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.
|
||||||
block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas.
|
block.plastanium-wall-large.description = Un tipo especial de pared que absorbe los arcos eléctricos y bloquea las conexiones automáticas de los nodos de potencia.\nOcupa múltiples casillas.
|
||||||
block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.
|
block.thorium-wall.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.
|
||||||
block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas.
|
block.thorium-wall-large.description = Un bloque defensivo fuerte.\nBuena protección contra enemigos.\nOcupa múltiples casillas.
|
||||||
@@ -1359,8 +1360,8 @@ block.phase-wall.description = No es tan fuerte como un muro de torio pero hace
|
|||||||
block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas.
|
block.phase-wall-large.description = No es tan fuerte como un muro de torio pero rebota balas al enemigo si no son demasiado fuertes.\nOcupa múltiples casillas.
|
||||||
block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.
|
block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.
|
||||||
block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas.
|
block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas.
|
||||||
block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella.
|
block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.
|
||||||
block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas.
|
block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abierta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas.
|
||||||
block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia.
|
block.mender.description = Repara bloques cercanos de forma constante. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia.
|
||||||
block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas.
|
block.mend-projector.description = Regenera edificios cercanos de forma constante. Ocupa multiples casillas.
|
||||||
block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores.
|
block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores.
|
||||||
@@ -1388,7 +1389,7 @@ block.pulse-conduit.description = Bloque de transporte de líquidos avanzado. Tr
|
|||||||
block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos.
|
block.plated-conduit.description = Mueve líquidos a la misma velocidad que los conductos de pulso, pero posee más armadura. No acepta líquidos de los lados por otra cosa que no sean conductos.\nGotea menos.
|
||||||
block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos.
|
block.liquid-router.description = Acepta líquidos de una dirección y los deja en hasta 3 direcciones equitativamente. También puede almacenar cierta capacidad de líquido. Útil para dividir los líquidos de una fuente a varios objetivos.
|
||||||
block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales.
|
block.liquid-tank.description = Almacena una gran cantidad de líquidos. Úsalo para crear almacenes cuando no hay una demanda constante de materiales o para asegurarse de enfriar bloques vitales.
|
||||||
block.liquid-junction.description = Actúa como un puente para dos condusctos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares.
|
block.liquid-junction.description = Actúa como un puente para dos conductos que se cruzan. Útil en situaciones en las que hay dos conductos con líquidos diferentes a diferentes lugares.
|
||||||
block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción.
|
block.bridge-conduit.description = Bloque avanzado de transporte de líquidos. Permite transportar líquidos por encima de hasta 3 casillas de cualquier terreno o construcción.
|
||||||
block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas.
|
block.phase-conduit.description = Bloque de transporte de líquidos avanzado. Usa energía para transportar líquidos a otro conducto de fase conectado a través de varias casillas.
|
||||||
block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente.
|
block.power-node.description = Transmite energía a nodos conectados, conecta hasta diez fuentes de energía, edificios que usan energía o nodos. El nodo obtendrá o transmitirá energía de cualquier bloque adyacente.
|
||||||
@@ -1398,7 +1399,7 @@ block.diode.description = La energía de la batería puede fluir a través de es
|
|||||||
block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía.
|
block.battery.description = Guarda energía cuando hay abundancia y proporciona energía cuando hay escasez de energía mientras la batería tenga energía.
|
||||||
block.battery-large.description = Almacena mucha más energía que una batería normal.
|
block.battery-large.description = Almacena mucha más energía que una batería normal.
|
||||||
block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo.
|
block.combustion-generator.description = Genera energía quemando materiales inflamables o petróleo.
|
||||||
block.thermal-generator.description = Genera una gran cantidad de energía con la lava.
|
block.thermal-generator.description = Genera una gran cantidad de energía con el magma.
|
||||||
block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional.
|
block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional.
|
||||||
block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita.
|
block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de pirotita.
|
||||||
block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio.
|
block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio.
|
||||||
@@ -1444,7 +1445,7 @@ block.segment.description = Daña y destruye proyectiles que se acerquen. No afe
|
|||||||
block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso.
|
block.parallax.description = Dispara un rayo tractor que atrae enemigos aéreos, dañándolos en el proceso.
|
||||||
block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua.
|
block.tsunami.description = Dispara poderosos torrentes de líquido a los enemigos. También apaga fuegos automáticamente si se lo abastece con agua.
|
||||||
block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos.
|
block.silicon-crucible.description = Refina silicio a partir de arena y carbón, usando pirotita como una fuente de calor adicional. Es más eficiente en lugares cálidos.
|
||||||
block.disassembler.description = Separa magma cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio.
|
block.disassembler.description = Separa magma en cantidades moderadas de componentes minerales exóticos con baja eficiencia. Puede producir Torio.
|
||||||
block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar.
|
block.overdrive-dome.description = Incrementa la velocidad de estructuras cercanas. Requiere Tejido de Fase y Silicio para operar.
|
||||||
block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas.
|
block.payload-conveyor.description = Mueve tanto grandes cargas, como unidades recién ensambladas de sus fábricas.
|
||||||
block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida.
|
block.payload-router.description = Divide las cargas entrantes en 3 direcciones de salida.
|
||||||
@@ -1487,7 +1488,7 @@ unit.zenith.description = Dispara ráfagas de misiles a enemigos cercanos.
|
|||||||
unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano.
|
unit.antumbra.description = Dispara un enjambre de balas a cualquer enemigo cercano.
|
||||||
unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación.
|
unit.eclipse.description = Dispara dos láseres perforantes y un enjambre de balas de fragmentación.
|
||||||
unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo.
|
unit.mono.description = Extrae cobre y plomo, y los deposita en el núcleo.
|
||||||
unit.poly.description = Recosntruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción.
|
unit.poly.description = Reconstruye automáticamente estructuras dañadas y asiste a otras unidades en la construcción.
|
||||||
unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas.
|
unit.mega.description = Repara automáticamente estructuras dañadas. Puede llevar estructuras y unidades terrestres pequeñas.
|
||||||
unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio.
|
unit.quad.description = Suelta grandes bombas sobre objetivos terrestres, repara estructuras aliadas y daña enemigos. Puede cargar con unidades terrestres de tamaño medio.
|
||||||
unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres.
|
unit.oct.description = Protege aliados con su escudo. Puede cargar con la mayoría de unidades terrestres.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ link.discord.description = Discord officiel de Mindustry
|
|||||||
link.reddit.description = Subreddit de Mindustry
|
link.reddit.description = Subreddit de Mindustry
|
||||||
link.github.description = Code source du jeu
|
link.github.description = Code source du jeu
|
||||||
link.changelog.description = Liste des mises à jour
|
link.changelog.description = Liste des mises à jour
|
||||||
link.dev-builds.description = Versions expérimentale du jeu
|
link.dev-builds.description = Versions expérimentales du jeu
|
||||||
link.trello.description = Trello officiel pour les nouvelles fonctionalités planifiées
|
link.trello.description = Trello officiel pour les nouvelles fonctionalités planifiées
|
||||||
link.itch.io.description = Page itch.io avec les différentes versions du jeu.
|
link.itch.io.description = Page itch.io avec les différentes versions du jeu.
|
||||||
link.google-play.description = Page Google Play du jeu
|
link.google-play.description = Page Google Play du jeu
|
||||||
@@ -41,17 +41,20 @@ be.ignore = Ignorer
|
|||||||
be.noupdates = Aucune mise à jour trouvée.
|
be.noupdates = Aucune mise à jour trouvée.
|
||||||
be.check = Chercher des mises à jour
|
be.check = Chercher des mises à jour
|
||||||
|
|
||||||
mod.featured.dialog.title = Navigateur de Mods (WIP)
|
mods.browser = Navigateur de Mods
|
||||||
mods.browser.selected = Mod sélectionné
|
mods.browser.selected = Mod sélectionné
|
||||||
mods.browser.add = Installer
|
mods.browser.add = Installer
|
||||||
mods.github.open = Voir
|
mods.browser.reinstall = Reinstaller
|
||||||
|
mods.github.open = Voir sur Github
|
||||||
|
mods.browser.sortdate = Classer par date
|
||||||
|
mods.browser.sortstars = Classer par étoiles
|
||||||
|
|
||||||
schematic = Schéma
|
schematic = Schéma
|
||||||
schematic.add = Enregistrer le Schéma...
|
schematic.add = Enregistrer le Schéma
|
||||||
schematics = Schémas
|
schematics = Schémas
|
||||||
schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer?
|
schematic.replace = Un schéma avec ce nom existe déjà. Voulez-vous le remplacer?
|
||||||
schematic.exists = Un schéma avec ce nom existe déjà.
|
schematic.exists = Un schéma avec ce nom existe déjà.
|
||||||
schematic.import = Importer un schéma...
|
schematic.import = Importer un schéma
|
||||||
schematic.exportfile = Exporter le fichier
|
schematic.exportfile = Exporter le fichier
|
||||||
schematic.importfile = Importer un fichier
|
schematic.importfile = Importer un fichier
|
||||||
schematic.browseworkshop = Consulter le Steam Workshop
|
schematic.browseworkshop = Consulter le Steam Workshop
|
||||||
@@ -63,7 +66,7 @@ schematic.saved = Schéma enregistré.
|
|||||||
schematic.delete.confirm = Ce schéma sera supprimé définitivement.
|
schematic.delete.confirm = Ce schéma sera supprimé définitivement.
|
||||||
schematic.rename = Renommer le Schéma
|
schematic.rename = Renommer le Schéma
|
||||||
schematic.info = {0}x{1}, {2} blocs
|
schematic.info = {0}x{1}, {2} blocs
|
||||||
schematic.disabled = [scarlet] Schémas désactivés![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]cartemap[] ou ce [accent]serveur.
|
schematic.disabled = [scarlet]Schémas désactivés![]\nVous n'êtes pas autorisés à utiliser des schémas sur cette [accent]carte[] ou dans ce [accent]serveur.
|
||||||
|
|
||||||
stats = Stats
|
stats = Stats
|
||||||
stat.wave = Vagues vaincues:[accent] {0}
|
stat.wave = Vagues vaincues:[accent] {0}
|
||||||
@@ -84,8 +87,8 @@ coreattack = [scarlet]< Le Noyau est attaqué! >
|
|||||||
nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
|
nearpoint = [[ [scarlet]QUITTEZ LE POINT D'APPARITION ENNEMI IMMÉDIATEMENT[] ]\nannihilation imminente
|
||||||
database = Base de données
|
database = Base de données
|
||||||
savegame = Sauvegarder la partie
|
savegame = Sauvegarder la partie
|
||||||
loadgame = Charger la partie
|
loadgame = Charger une partie
|
||||||
joingame = Rejoindre la partie
|
joingame = Rejoindre une partie
|
||||||
customgame = Partie personnalisée
|
customgame = Partie personnalisée
|
||||||
newgame = Nouvelle partie
|
newgame = Nouvelle partie
|
||||||
none = <Vide>
|
none = <Vide>
|
||||||
@@ -116,8 +119,10 @@ mods.none = [lightgray]Aucun Mod trouvé!
|
|||||||
mods.guide = Guide de Modding
|
mods.guide = Guide de Modding
|
||||||
mods.report = Signaler un Bug
|
mods.report = Signaler un Bug
|
||||||
mods.openfolder = Ouvrir le Dossier
|
mods.openfolder = Ouvrir le Dossier
|
||||||
|
mods.viewcontent = Voir le Contenu
|
||||||
mods.reload = Relancer
|
mods.reload = Relancer
|
||||||
mods.reloadexit = Le jeu va se fermer pour relancer les mods.
|
mods.reloadexit = Le jeu va se fermer pour relancer les mods.
|
||||||
|
mod.installed = [[Installé]
|
||||||
mod.display = [gray]Mod:[orange] {0}
|
mod.display = [gray]Mod:[orange] {0}
|
||||||
mod.enabled = [lightgray]Activé
|
mod.enabled = [lightgray]Activé
|
||||||
mod.disabled = [scarlet]Désactivé
|
mod.disabled = [scarlet]Désactivé
|
||||||
@@ -125,7 +130,7 @@ mod.disable = Désactiver
|
|||||||
mod.content = Contenu:
|
mod.content = Contenu:
|
||||||
mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation.
|
mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation.
|
||||||
mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0}
|
mod.requiresversion = [scarlet]Version minimale du jeu requise : [accent]{0}
|
||||||
mod.outdated = [scarlet]non compatible avec la V6 (no minGameVersion: 105)
|
mod.outdated = [scarlet]Non compatible avec la V6 (no minGameVersion: 105)
|
||||||
mod.missingdependencies = [scarlet]Dépendances manquantes: {0}
|
mod.missingdependencies = [scarlet]Dépendances manquantes: {0}
|
||||||
mod.erroredcontent = [scarlet]Erreurs de contenu
|
mod.erroredcontent = [scarlet]Erreurs de contenu
|
||||||
mod.errors = Des erreurs se sont produites lors du chargement du contenu.
|
mod.errors = Des erreurs se sont produites lors du chargement du contenu.
|
||||||
@@ -137,7 +142,7 @@ mod.reloadrequired = [scarlet]Redémarrage requis
|
|||||||
mod.import = Importer un mod
|
mod.import = Importer un mod
|
||||||
mod.import.file = Importer un fichier
|
mod.import.file = Importer un fichier
|
||||||
mod.import.github = Importer un mod depuis GitHub
|
mod.import.github = Importer un mod depuis GitHub
|
||||||
mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'Importer ce mod depuis une source digne de confiance.
|
mod.jarwarn = [scarlet]Les mods JAR sont par nature peu sûrs.[]\nFaites en sorte d'importer ce mod depuis une source digne de confiance.
|
||||||
mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question.
|
mod.item.remove = Cet objet fait partie du mod[accent] '{0}'[]. Pour le supprimer, désinstallez le mod en question.
|
||||||
mod.remove.confirm = Ce mod sera supprimé.
|
mod.remove.confirm = Ce mod sera supprimé.
|
||||||
mod.author = [lightgray]Auteur:[] {0}
|
mod.author = [lightgray]Auteur:[] {0}
|
||||||
@@ -148,7 +153,7 @@ mod.scripts.disable = Votre appareil ne prend pas an charge les mods avec des sc
|
|||||||
|
|
||||||
about.button = À propos
|
about.button = À propos
|
||||||
name = Nom:
|
name = Nom:
|
||||||
noname = Commencez par choisir un[accent] pseudo[].
|
noname = Commencez par choisir un[accent] nom[].
|
||||||
planetmap = Carte de la planète
|
planetmap = Carte de la planète
|
||||||
launchcore = Lancer le Noyau
|
launchcore = Lancer le Noyau
|
||||||
filename = Nom du fichier:
|
filename = Nom du fichier:
|
||||||
@@ -156,8 +161,8 @@ unlocked = Nouveau contenu débloqué!
|
|||||||
available = Nouvelle recherche disponible!
|
available = Nouvelle recherche disponible!
|
||||||
completed = [accent]Complété
|
completed = [accent]Complété
|
||||||
techtree = Arbre technologique
|
techtree = Arbre technologique
|
||||||
research.legacy = Données de recherche de la [accent]5.0[] trouvées.\nVoulez-vous [accent]charger les données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne? (recommandé)
|
research.legacy = Des données de recherche de la [accent]5.0[] ont été trouvées.\nVoulez-vous [accent]charger ces données[] ou [accent]les ignorer[] et recommencer la recherche dans la nouvelle campagne? (recommandé)
|
||||||
research.load = Chargement
|
research.load = Charger
|
||||||
research.discard = Ignorer
|
research.discard = Ignorer
|
||||||
research.list = [lightgray]Recherche:
|
research.list = [lightgray]Recherche:
|
||||||
research = Rechercher
|
research = Rechercher
|
||||||
@@ -176,7 +181,7 @@ server.kicked.clientOutdated = Client obsolète! Mettez votre jeu à jour!
|
|||||||
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
|
server.kicked.serverOutdated = Serveur obsolète! Demandez à l'hôte de le mettre à jour!
|
||||||
server.kicked.banned = Vous avez été banni de ce serveur.
|
server.kicked.banned = Vous avez été banni de ce serveur.
|
||||||
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
|
server.kicked.typeMismatch = Ce serveur n'est pas compatible avec votre version du jeu.
|
||||||
server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libére.
|
server.kicked.playerLimit = Ce serveur est complet. Attendez qu'une place se libère.
|
||||||
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter.
|
server.kicked.recentKick = Vous avez été expulsé récemment.\nAttendez avant de vous reconnecter.
|
||||||
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
|
server.kicked.nameInUse = Il y a déjà quelqu'un avec\nce nom sur ce serveur.
|
||||||
server.kicked.nameEmpty = Votre nom est invalide.
|
server.kicked.nameEmpty = Votre nom est invalide.
|
||||||
@@ -203,9 +208,9 @@ servers.local = Serveurs locaux
|
|||||||
servers.remote = Serveurs distants
|
servers.remote = Serveurs distants
|
||||||
servers.global = Serveurs communautaires
|
servers.global = Serveurs communautaires
|
||||||
|
|
||||||
servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés ou controllés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tout les âges.
|
servers.disclaimer = Les serveurs communautaires ne sont [accent]pas[] gérés, ni controllés par le développeur.\n\nCes serveurs peuvent contenir du contenu qui ne convient pas à tout les âges.
|
||||||
servers.showhidden = Montrer les serveurs cachés
|
servers.showhidden = Montrer les serveurs cachés
|
||||||
server.shown = Montré
|
server.shown = Visible
|
||||||
server.hidden = Caché
|
server.hidden = Caché
|
||||||
|
|
||||||
trace = Suivre le joueur
|
trace = Suivre le joueur
|
||||||
@@ -307,6 +312,7 @@ cancelbuilding = [accent][[{0}][] pour effacer le plan
|
|||||||
selectschematic = [accent][[{0}][] pour sélectionner+copier
|
selectschematic = [accent][[{0}][] pour sélectionner+copier
|
||||||
pausebuilding = [accent][[{0}][] pour mettre la construction en pause
|
pausebuilding = [accent][[{0}][] pour mettre la construction en pause
|
||||||
resumebuilding = [scarlet][[{0}][] pour reprendre la construction
|
resumebuilding = [scarlet][[{0}][] pour reprendre la construction
|
||||||
|
enablebuilding = [scarlet][[{0}][] pour activer la construction
|
||||||
showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface.
|
showui = Interface cachée.\nPressez [accent][[{0}][] pour montrer l'interface.
|
||||||
wave = [accent]Vague {0}
|
wave = [accent]Vague {0}
|
||||||
wave.cap = [accent]Vague {0}/{1}
|
wave.cap = [accent]Vague {0}/{1}
|
||||||
@@ -327,9 +333,9 @@ custom = Personnalisé
|
|||||||
builtin = Pré-fait
|
builtin = Pré-fait
|
||||||
map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura pas de retour en arrière!
|
map.delete.confirm = Voulez-vous vraiment supprimer cette carte? Il n'y aura pas de retour en arrière!
|
||||||
map.random = [accent]Carte aléatoire
|
map.random = [accent]Carte aléatoire
|
||||||
map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître! Ajouter un [royalNoyau orange[] sur cette carte dans l'éditeur.
|
map.nospawn = Cette carte ne possède pas de base pour que le joueur puisse apparaître! Ajouter un [accent]Noyau orange[] sur cette carte dans l'éditeur.
|
||||||
map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins une base [scarlet] non-orange[] dans l'éditeur.
|
map.nospawn.pvp = Cette carte n'a pas de base ennemie pour qu'un joueur ennemi puisse y apparaître! Ajoutez au moins un Noyau[scarlet] non-orange[] dans l'éditeur.
|
||||||
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter une base[scarlet] rouge[] sur cette carte dans l'éditeur.
|
map.nospawn.attack = Cette carte n'a aucune base ennemie à attaquer! Veuillez ajouter un Noyau[scarlet] rouge[] sur cette carte dans l'éditeur.
|
||||||
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
|
map.invalid = Erreur lors du chargement de la carte: carte corrompue ou invalide.
|
||||||
workshop.update = Mettre à jour
|
workshop.update = Mettre à jour
|
||||||
workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0}
|
workshop.error = Erreur lors de la récupération des détails du Steam Workshop: {0}
|
||||||
@@ -487,7 +493,7 @@ play = Jouer
|
|||||||
campaign = Campagne
|
campaign = Campagne
|
||||||
load = Charger
|
load = Charger
|
||||||
save = Sauvegarder
|
save = Sauvegarder
|
||||||
fps = IPS: {0}
|
fps = FPS: {0}
|
||||||
ping = Ping: {0}ms
|
ping = Ping: {0}ms
|
||||||
memory = Mem: {0}mb
|
memory = Mem: {0}mb
|
||||||
memory2 = Mem:\n {0}mb +\n {1}mb
|
memory2 = Mem:\n {0}mb +\n {1}mb
|
||||||
@@ -601,9 +607,9 @@ sector.craters.description = Ce cratère est une relique d'anciennes guerres. De
|
|||||||
sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il n’en reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie.
|
sector.ruinousShores.description = Au-delà des déchets, se trouve le littoral. Autrefois, cet endroit abritait un réseau de défense côtière, mais il n’en reste pas grand-chose. Seules quelques structures de défense basiques sont restées intactes, tout le reste a été réduit en ferraille.\nContinuez votre exploration en redécouvrant la technologie.
|
||||||
sector.stainedMountains.description = Plus loin, à l’intérieur des terres, se trouvent des montagnes qui n'ont pas touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps d’envoyer leurs unités les plus fortes.
|
sector.stainedMountains.description = Plus loin, à l’intérieur des terres, se trouvent des montagnes qui n'ont pas touchées par les spores.\nExploitez le Titane présent en abondance dans cette zone et apprenez comment l'utiliser.\n\nLa présence ennemie est bien plus grande ici. Ne leur donnez pas le temps d’envoyer leurs unités les plus fortes.
|
||||||
sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le.
|
sector.overgrowth.description = Étant plus proche de la source des spores, cette zone a été complètement envahie.\nL'ennemi y a établi un avant-poste. Formez des Titans et détruisez-le.
|
||||||
sector.tarFields.description = La périphérie d’une zone de production de pétrole, situé entre les montagnes et le désert. L’une des rares avec des réserves de goudron utilisables.\nBien qu’abandonnée, cette zone a quelques forces ennemies dangereuses à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible.
|
sector.tarFields.description = La périphérie d’une zone de production de pétrole, situé entre les montagnes et le désert. L’une des rares avec des réserves de goudron utilisables.\nBien qu’abandonnée, quelques forces ennemies dangereuses se trouvent à proximité. Ne les sous-estimez pas!\n\n[lightgray]Recherchez la technologie de traitement de pétrole si possible.
|
||||||
sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu d’espace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquerez de le regretter.
|
sector.desolateRift.description = Une zone extrêmement dangereuse. Des ressources abondantes, mais peu d’espace. Un risque élevé de destruction donc partez dès que possible! Ne vous laissez surtout pas berner par le long temps d'attente entre les vagues ennemies. Vous risquerez de le regretter.
|
||||||
sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur le thorium et ses nombreuses utilisations.\n\nL’ennemi est présent ici en grand nombre, recherchant constamment des attaquants.
|
sector.nuclearComplex.description = Une ancienne installation de production et de traitement de thorium, réduite en ruines.\n[lightgray]Faites des recherches sur ce minerai et ses nombreuses utilisations.\n\nL’ennemi est présent ici en grand nombre, recherchant constamment des attaquants.
|
||||||
sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poingnards et des Rampeurs.
|
sector.fungalPass.description = Une zone de transition entre les hautes montagnes et les terres plus basses, infestées de spores. Une petite base de reconnaissance ennemie se trouve ici.\nDétruisez les 2 Noyaux ennemis en utilisant des Poingnards et des Rampeurs.
|
||||||
sector.biomassFacility.description = L’origine des spores. Il s’agit de l’installation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans l’écosystème local ne pouvait concurrencer un organisme aussi envahissant.
|
sector.biomassFacility.description = L’origine des spores. Il s’agit de l’installation dans laquelle elles ont été étudiées et initialement produites.\nRecherchez la technologie présente sur les lieux et cultivez des spores pour la production de carburant et de plastique.\n\n[lightgray]Lors de la destruction de cette installation, les spores ont été libérées. Rien dans l’écosystème local ne pouvait concurrencer un organisme aussi envahissant.
|
||||||
sector.windsweptIslands.description = Au delà du rivage se trouve cette chaîne d’îles reculées. Les registres montrent qu’il y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines.
|
sector.windsweptIslands.description = Au delà du rivage se trouve cette chaîne d’îles reculées. Les registres montrent qu’il y avait autrefois des usines de [accent]Plastanium[].\n\nDéfendez-vous contre les unités navales ennemies, établissez-y une base et faites des recherches sur ces usines.
|
||||||
@@ -631,17 +637,17 @@ settings.clearcampaignsaves = Supprimer la Campagne
|
|||||||
settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne?
|
settings.clearcampaignsaves.confirm = Êtes-vous sûr de vouloir supprimer toutes les sauvegardes de la campagne?
|
||||||
paused = [accent]< Pause >
|
paused = [accent]< Pause >
|
||||||
clear = Effacer
|
clear = Effacer
|
||||||
banned = [scarlet]Bannis
|
banned = [scarlet]Banni
|
||||||
yes = Oui
|
yes = Oui
|
||||||
no = Non
|
no = Non
|
||||||
info.title = Info
|
info.title = Info
|
||||||
error.title = [scarlet]Une erreur s'est produite
|
error.title = [scarlet]Une erreur s'est produite
|
||||||
error.crashtitle = Une erreur s'est produite
|
error.crashtitle = Une erreur s'est produite
|
||||||
unit.nobuild = [scarlet]Cette unité ne peut construire
|
unit.nobuild = [scarlet]Cette unité ne peut pas construire
|
||||||
lastaccessed = [lightgray]Dernier accès: {0}
|
lastaccessed = [lightgray]Dernier accès: {0}
|
||||||
block.unknown = [lightgray]???
|
block.unknown = [lightgray]???
|
||||||
|
|
||||||
stat.description = But
|
stat.description = Description
|
||||||
stat.input = Ressource(s) requise(s)
|
stat.input = Ressource(s) requise(s)
|
||||||
stat.output = Ressource(s) produite(s)
|
stat.output = Ressource(s) produite(s)
|
||||||
stat.booster = Boosteur
|
stat.booster = Boosteur
|
||||||
@@ -678,6 +684,7 @@ stat.drillspeed = Vitesse de forage de Base
|
|||||||
stat.boosteffect = Effet(s) du Boost
|
stat.boosteffect = Effet(s) du Boost
|
||||||
stat.maxunits = Max d'Unités Actives
|
stat.maxunits = Max d'Unités Actives
|
||||||
stat.health = Santé
|
stat.health = Santé
|
||||||
|
stat.armor = Armure
|
||||||
stat.buildtime = Durée de construction
|
stat.buildtime = Durée de construction
|
||||||
stat.maxconsecutive = Max Consécutif
|
stat.maxconsecutive = Max Consécutif
|
||||||
stat.buildcost = Coût de construction
|
stat.buildcost = Coût de construction
|
||||||
@@ -693,6 +700,7 @@ stat.lightningchance = Chance d'Éclairs
|
|||||||
stat.lightningdamage = Dégats des Éclairs
|
stat.lightningdamage = Dégats des Éclairs
|
||||||
stat.flammability = Inflammabilité
|
stat.flammability = Inflammabilité
|
||||||
stat.radioactivity = Radioactivité
|
stat.radioactivity = Radioactivité
|
||||||
|
stat.charge = Charge
|
||||||
stat.heatcapacity = Capacité Thermique
|
stat.heatcapacity = Capacité Thermique
|
||||||
stat.viscosity = Viscosité
|
stat.viscosity = Viscosité
|
||||||
stat.temperature = Température
|
stat.temperature = Température
|
||||||
@@ -709,7 +717,7 @@ stat.ammouse = Utilisation de munitions
|
|||||||
|
|
||||||
ability.forcefield = Champ de Force
|
ability.forcefield = Champ de Force
|
||||||
ability.repairfield = Champ de Réparation
|
ability.repairfield = Champ de Réparation
|
||||||
ability.statusfield = Champ de statut
|
ability.statusfield = Champ d'Amélioration
|
||||||
ability.unitspawn = Usine de {0}
|
ability.unitspawn = Usine de {0}
|
||||||
ability.shieldregenfield = Champ de regénération de bouclier
|
ability.shieldregenfield = Champ de regénération de bouclier
|
||||||
ability.movelightning = Déplacement éclair
|
ability.movelightning = Déplacement éclair
|
||||||
@@ -736,7 +744,7 @@ bar.progress = Construction en cours
|
|||||||
bar.input = Entrée
|
bar.input = Entrée
|
||||||
bar.output = Sortie
|
bar.output = Sortie
|
||||||
|
|
||||||
units.processorcontrol = [lightgray]Contrôlée par un processeur
|
units.processorcontrol = [lightgray]Contrôlé par un processeur
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] dégâts
|
bullet.damage = [stat]{0}[lightgray] dégâts
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
|
bullet.splashdamage = [stat]{0}[lightgray] dégâts de zone ~[stat] {1}[lightgray] blocs
|
||||||
@@ -775,8 +783,8 @@ unit.thousands = k
|
|||||||
unit.millions = mil
|
unit.millions = mil
|
||||||
unit.billions = Md
|
unit.billions = Md
|
||||||
unit.pershot = /tirs
|
unit.pershot = /tirs
|
||||||
category.purpose = But
|
category.purpose = Description
|
||||||
category.general = Général
|
category.general = Caractéristiques
|
||||||
category.power = Énergie
|
category.power = Énergie
|
||||||
category.liquids = Liquides
|
category.liquids = Liquides
|
||||||
category.items = Objets
|
category.items = Objets
|
||||||
@@ -788,6 +796,7 @@ setting.shadows.name = Ombres
|
|||||||
setting.blockreplace.name = Suggestion automatique des Blocs
|
setting.blockreplace.name = Suggestion automatique des Blocs
|
||||||
setting.linear.name = Filtrage linéaire
|
setting.linear.name = Filtrage linéaire
|
||||||
setting.hints.name = Astuces
|
setting.hints.name = Astuces
|
||||||
|
setting.logichints.name = Astuces pour les commandes des processeurs
|
||||||
setting.flow.name = Afficher le Débit des ressources
|
setting.flow.name = Afficher le Débit des ressources
|
||||||
setting.backgroundpause.name = Pause en Arrière-plan
|
setting.backgroundpause.name = Pause en Arrière-plan
|
||||||
setting.buildautopause.name = Confirmation avant construction
|
setting.buildautopause.name = Confirmation avant construction
|
||||||
@@ -799,10 +808,10 @@ setting.indicators.name = Indicateurs ennemis
|
|||||||
setting.autotarget.name = Visée automatique
|
setting.autotarget.name = Visée automatique
|
||||||
setting.keyboard.name = Contrôles Souris+Clavier
|
setting.keyboard.name = Contrôles Souris+Clavier
|
||||||
setting.touchscreen.name = Commandes d'écran tactile
|
setting.touchscreen.name = Commandes d'écran tactile
|
||||||
setting.fpscap.name = Max IPS
|
setting.fpscap.name = Max FPS
|
||||||
setting.fpscap.none = Illimité
|
setting.fpscap.none = Illimité
|
||||||
setting.fpscap.text = {0} IPS
|
setting.fpscap.text = {0} FPS
|
||||||
Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[]
|
setting.uiscale.name = Échelle de l'interface[lightgray] (redémarrage du jeu nécessaire)[]
|
||||||
setting.swapdiagonal.name = Autoriser le placement en diagonale
|
setting.swapdiagonal.name = Autoriser le placement en diagonale
|
||||||
setting.difficulty.training = Entraînement
|
setting.difficulty.training = Entraînement
|
||||||
setting.difficulty.easy = Facile
|
setting.difficulty.easy = Facile
|
||||||
@@ -821,7 +830,7 @@ setting.seconds = {0} secondes
|
|||||||
setting.milliseconds = {0} millisecondes
|
setting.milliseconds = {0} millisecondes
|
||||||
setting.fullscreen.name = Plein Écran
|
setting.fullscreen.name = Plein Écran
|
||||||
setting.borderlesswindow.name = Fenêtre sans bords[lightgray] (peut nécessiter le redémarrage du jeu)
|
setting.borderlesswindow.name = Fenêtre sans bords[lightgray] (peut nécessiter le redémarrage du jeu)
|
||||||
setting.fps.name = Afficher IPS et Ping
|
setting.fps.name = Afficher FPS et Ping
|
||||||
setting.smoothcamera.name = Lissage de la Caméra
|
setting.smoothcamera.name = Lissage de la Caméra
|
||||||
setting.vsync.name = Synchronisation Verticale
|
setting.vsync.name = Synchronisation Verticale
|
||||||
setting.pixelate.name = Pixeliser
|
setting.pixelate.name = Pixeliser
|
||||||
@@ -858,7 +867,7 @@ category.blocks.name = Sélection des blocs
|
|||||||
command.attack = Attaquer
|
command.attack = Attaquer
|
||||||
command.rally = Rallier
|
command.rally = Rallier
|
||||||
command.retreat = Retraite
|
command.retreat = Retraite
|
||||||
command.idle = Pause
|
command.idle = Inactif
|
||||||
placement.blockselectkeys = \n[lightgray]Raccourci: [{0},
|
placement.blockselectkeys = \n[lightgray]Raccourci: [{0},
|
||||||
keybind.respawn.name = Réapparaître
|
keybind.respawn.name = Réapparaître
|
||||||
keybind.control.name = Controler une Unité
|
keybind.control.name = Controler une Unité
|
||||||
@@ -948,6 +957,8 @@ rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs
|
|||||||
rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités
|
rules.unitbuildspeedmultiplier = Multiplicateur de Vitesse de Construction des Unités
|
||||||
rules.unithealthmultiplier = Multiplicateur de Santé des Unités
|
rules.unithealthmultiplier = Multiplicateur de Santé des Unités
|
||||||
rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités
|
rules.unitdamagemultiplier = Multiplicateur de Dégât des Unités
|
||||||
|
rules.unitcapvariable = Les Noyaux contribuent à la limite d'Unités actives
|
||||||
|
rules.unitcap = Limite d'Unités actives de Base
|
||||||
rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi:[lightgray] (blocs)
|
rules.enemycorebuildradius = Périmètre de Non-Construction autour du Noyau ennemi:[lightgray] (blocs)
|
||||||
rules.wavespacing = Temps entre les Vagues:[lightgray] (sec)
|
rules.wavespacing = Temps entre les Vagues:[lightgray] (sec)
|
||||||
rules.buildcostmultiplier = Multiplicateur du prix de construction
|
rules.buildcostmultiplier = Multiplicateur du prix de construction
|
||||||
@@ -1140,7 +1151,7 @@ block.router.name = Routeur
|
|||||||
block.distributor.name = Distributeur
|
block.distributor.name = Distributeur
|
||||||
block.sorter.name = Trieur
|
block.sorter.name = Trieur
|
||||||
block.inverted-sorter.name = Trieur Inversé
|
block.inverted-sorter.name = Trieur Inversé
|
||||||
block.message.name = Message
|
block.message.name = Bloc de Message
|
||||||
block.illuminator.name = Illuminateur
|
block.illuminator.name = Illuminateur
|
||||||
block.overflow-gate.name = Barrière de Débordement
|
block.overflow-gate.name = Barrière de Débordement
|
||||||
block.underflow-gate.name = Barrière de Refoulement
|
block.underflow-gate.name = Barrière de Refoulement
|
||||||
@@ -1249,7 +1260,7 @@ block.logic-processor.name = Processeur
|
|||||||
block.hyper-processor.name = Hyper Processeur
|
block.hyper-processor.name = Hyper Processeur
|
||||||
block.logic-display.name = Écran
|
block.logic-display.name = Écran
|
||||||
block.large-logic-display.name = Grand Écran
|
block.large-logic-display.name = Grand Écran
|
||||||
block.memory-cell.name = Bloc de mémoire
|
block.memory-cell.name = Cellule de mémoire
|
||||||
block.memory-bank.name = Banque de mémoire
|
block.memory-bank.name = Banque de mémoire
|
||||||
|
|
||||||
team.blue.name = bleu
|
team.blue.name = bleu
|
||||||
@@ -1286,8 +1297,8 @@ hint.schematicSelect = Retenez [accent][[F][] pour sélectionner des blocs dans
|
|||||||
hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement.
|
hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement.
|
||||||
hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement.
|
hint.conveyorPathfind.mobile = Activez le mode \ue844 [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement.
|
||||||
hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler.
|
hint.boost = Retenez [accent][[Maj-gauche][] pour voler au-dessus des obstacles avec votre unité actuelle.\n\nSeules quelques unités terrestres peuvent voler.
|
||||||
hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger une formation.\n\nSeules les unités terrestres peuvent controller d'autres unités terrestres.
|
hint.command = Pressez [accent][[G][] pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.\n\nSeules les unités terrestres peuvent controller d'autres unités terrestres.
|
||||||
hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger une formation.
|
hint.command.mobile = [accent][[Tapez][] 2 fois votre unité pour commander les unités proches d'un [accent]type similaire[] et bouger en formation.
|
||||||
hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités.
|
hint.payloadPickup = Pressez [accent][[[] pour transporter des blocs ou des unités.
|
||||||
hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités.
|
hint.payloadPickup.mobile = [accent]Tapez et retenez[] votre doigt pour transporter des blocs ou des unités.
|
||||||
hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement.
|
hint.payloadDrop = Pressez [accent]][] pour larguer votre chargement.
|
||||||
@@ -1363,8 +1374,8 @@ block.thorium-wall.description = Un bloc défensif puissant.\nProcure une très
|
|||||||
block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies.
|
block.thorium-wall-large.description = Un bloc défensif puissant.\nProcure une très bonne protection contre les attaques ennemies.
|
||||||
block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
|
block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
|
||||||
block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
|
block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
|
||||||
block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance de créer des éclairs vers les ennemis.
|
block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
|
||||||
block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance de créer des éclairs vers les ennemis.
|
block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
|
||||||
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
|
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
|
||||||
block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
|
block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
|
||||||
block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité.
|
block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité.
|
||||||
@@ -1374,7 +1385,7 @@ block.force-projector.description = Crée un champ de force hexagonal autour de
|
|||||||
block.shock-mine.description = Blesse les ennemis qui marchent dessus.
|
block.shock-mine.description = Blesse les ennemis qui marchent dessus.
|
||||||
block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné.
|
block.conveyor.description = Convoyeur basique servant à transporter des objets. Les objets déplacés en avant sont automatiquement déposés dans les tourelles ou les bâtiments. Peut être tourné.
|
||||||
block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards.
|
block.titanium-conveyor.description = Convoyeur avancé. Déplace les objets plus rapidement que les convoyeurs standards.
|
||||||
block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les déchargent par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne.
|
block.plastanium-conveyor.description = Convoyeur transportant les ressources par paquets. Accepte les ressources par derrière et les décharge par 3 directions à l'avant. Pour une efficacité maximale, utilisez plusieurs points de chargement et de déchargement pour une même ligne.
|
||||||
block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits.
|
block.junction.description = Agit comme un pont pour deux lignes de convoyeurs se croisant. Utile lorsque deux lignes de convoyeurs différentes déplacent différents matériaux à différents endroits.
|
||||||
block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
|
block.bridge-conveyor.description = Bloc de transport avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
|
||||||
block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée.
|
block.phase-conveyor.description = Convoyeur très avancé. Utilise de l'énergie pour téléporter des objets à un autre convoyeur phasé. Possède une longue portée.
|
||||||
@@ -1393,13 +1404,13 @@ block.conduit.description = Bloc de transport de liquide de base, faisant avance
|
|||||||
block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards.
|
block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards.
|
||||||
block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire.
|
block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire.
|
||||||
block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide.
|
block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide.
|
||||||
block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la sortie quand la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants.
|
block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants.
|
||||||
block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits.
|
block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits.
|
||||||
block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
|
block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
|
||||||
block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance.
|
block.phase-conduit.description = Conduit très avancé permettant le transport de liquide. Utilise de l'énergie pour téléporter les liquides à un autre conduit phasé sur une longue distance.
|
||||||
block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement.
|
block.power-node.description = Transmet de l'énergie aux autres transmetteurs énergétiques connectés. Le transmetteur recevra de l'énergie ou la transmettra à n'importe quel bâtiment adjacent. La connexion peut être activée/désactivée manuellement.
|
||||||
block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions.
|
block.power-node-large.description = Ce transmetteur possède un rayon plus grand que le transmetteur énergétique standard. Il peut aussi accepter plus de connexions.
|
||||||
block.surge-tower.description = Un transmetteur énergétique de très grande portée mais avec moins de connections disponibles.
|
block.surge-tower.description = Un transmetteur énergétique à très grande portée mais avec moins de connections disponibles.
|
||||||
block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si l’autre côté présente moins d’énergie en stock. Idéal pour protéger les lieux de production d'énergie.
|
block.diode.description = L'énergie ne circule que dans un sens à travers ce bloc, et uniquement si l’autre côté présente moins d’énergie en stock. Idéal pour protéger les lieux de production d'énergie.
|
||||||
block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin.
|
block.battery.description = Stocke le surplus d'énergie et le redistribue en cas de besoin.
|
||||||
block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale.
|
block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale.
|
||||||
@@ -1418,7 +1429,7 @@ block.laser-drill.description = Permet de forer bien plus vite grâce à la tech
|
|||||||
block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner.
|
block.blast-drill.description = La Foreuse ultime. Demande une grande quantité d'énergie pour fonctionner.
|
||||||
block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité.
|
block.water-extractor.description = Extrait l'eau des nappes phréatiques. Utile quand il n'y a pas d'étendue d'eau à proximité.
|
||||||
block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères.
|
block.cultivator.description = Cultive une petite quantité de spores atmosphériques afin de former des bulbes sporifères.
|
||||||
block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement l’incubateur initial des spores qui couvrent maintenant Serpulo.
|
block.cultivator.details = Technologie de récupération. Utilisée pour produire des quantités massives de biomasse aussi efficacement que possible. Probablement l’incubateur initial des spores, qui couvrent maintenant Serpulo.
|
||||||
block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité.
|
block.oil-extractor.description = Utilise de grandes quantités d'énergie pour extraire le pétrole du sable. Utilisez-le lorsqu'il n'y a pas de source directe de pétrole à proximité.
|
||||||
block.core-shard.description = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver.
|
block.core-shard.description = Le coeur de votre base. Une fois détruit, le secteur est perdu. Ne laissez pas cela arriver.
|
||||||
block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équippé de propulseurs de lancement à usage unique. Equipped with single-use launch thrusters. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire.
|
block.core-shard.details = La première version du Noyau. Il est compact, doté d'un module d'auto-réplication et est équippé de propulseurs de lancement à usage unique. Equipped with single-use launch thrusters. Ceux-ci n'ont pas été conçus pour le voyage interplanétaire.
|
||||||
@@ -1445,7 +1456,7 @@ block.cyclone.description = Une grande tourelle qui tire rapidement des balles e
|
|||||||
block.spectre.description = Une tourelle massive à double cannon qui tire de puissantes balles perçantes.
|
block.spectre.description = Une tourelle massive à double cannon qui tire de puissantes balles perçantes.
|
||||||
block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement.
|
block.meltdown.description = Une tourelle massive chargeant et tirant de puissants rayons lasers. Nécessite un liquide de refroidissement.
|
||||||
block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité.
|
block.foreshadow.description = Une tourelle massive tirant une puissante balle sur une cible, sur de très longues distances. Elle vise les unités ayant le plus de santé en priorité.
|
||||||
block.repair-point.description = Soigne en permanence l'unité endommagée la plus proche à proximité.
|
block.repair-point.description = Soigne l'unité endommagée la plus proche.
|
||||||
block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés.
|
block.segment.description = Endommage et détruit les tirs ennemis. Les lasers ne peuvent pas être ciblés.
|
||||||
block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts.
|
block.parallax.description = Tire un rayon tracteur qui attire les ennemis volants, infligeant aussi des dégâts.
|
||||||
block.tsunami.description = Tire un puissant jet de liquide aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau.
|
block.tsunami.description = Tire un puissant jet de liquide aux ennemis. Peut éteindre les incendies automatiquement si elle est alimentée en eau.
|
||||||
@@ -1453,7 +1464,7 @@ block.silicon-crucible.description = Raffine du silicium avec du sable et du cha
|
|||||||
block.disassembler.description = Cette verion avancée du séparateur peut produire du thorium.
|
block.disassembler.description = Cette verion avancée du séparateur peut produire du thorium.
|
||||||
block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner.
|
block.overdrive-dome.description = Accélère le fonctionnement des bâtiments autour de lui. Requiert du silicium et du tissu phasé pour fonctionner.
|
||||||
block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unité depuis leurs usines ou bien des conteneurs.
|
block.payload-conveyor.description = Ce grand convoyeur peut déplacer de gros chargements, comme des unité depuis leurs usines ou bien des conteneurs.
|
||||||
block.payload-router.description = Distribue les chargements qui entrent dans 3 directions différentes.
|
block.payload-router.description = Distribue les chargements qui entrent jusqu'à 3 directions différentes.
|
||||||
block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes.
|
block.command-center.description = Contrôle le comportement des unités avec plusieurs commandes différentes.
|
||||||
block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
|
block.ground-factory.description = Produit des unités terrestres. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
|
||||||
block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
|
block.air-factory.description = Produit des unités aériennes. Elles peuvent être soit utilisées directement, soit envoyées vers des reconstructeurs pour être améliorées.
|
||||||
@@ -1479,21 +1490,21 @@ unit.scepter.description = Tire un barrage de balles superchargées aux ennemis
|
|||||||
unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches.
|
unit.reign.description = Tire un barrage de grosses balles perçantes aux ennemis proches.
|
||||||
unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
|
unit.nova.description = Tire des balles laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
|
||||||
unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
|
unit.pulsar.description = Tire des arcs électriques qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler.
|
||||||
unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est dotée d'un champ de force.
|
unit.quasar.description = Tire des faisceaux laser qui infligent des dégâts aux ennemis et réparent les structures alliées. Est capable de voler et est doté d'un champ de force.
|
||||||
unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler.
|
unit.vela.description = Tire un rayon laser continu qui inflige des dégâts aux ennemis, cause des incendies aux structures ennemies et répare les structures alliées. Est capable de voler.
|
||||||
unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur de la plupart des terrains.
|
unit.corvus.description = Tire un rayon laser massif qui inflige des dégâts aux ennemis et répare les structures alliées. Peut marcher sur la plupart des terrains.
|
||||||
unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion.
|
unit.crawler.description = Court vers un ennemi proche pour s'auto-détruire, causant une large explosion.
|
||||||
unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur de la plupart des terrains.
|
unit.atrax.description = Tire des orbes débilitants de scories sur des cibles terrestres. Peut marcher sur la plupart des terrains.
|
||||||
unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur de la plupart des terrains.
|
unit.spiroct.description = Tire des faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains.
|
||||||
unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur de la plupart des terrains.
|
unit.arkyid.description = Tire de larges faisceaux laser sapants aux ennemis proches, le réparant aussi. Peut marcher sur la plupart des terrains.
|
||||||
unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur de la plupart des terrains.
|
unit.toxopid.description = Tire de larges obus électriques et des lasers perçants aux ennemis proches. Peut marcher sur la plupart des terrains.
|
||||||
unit.flare.description = Tire des balles normales cibles terrestres.
|
unit.flare.description = Tire des balles normales aux cibles terrestres.
|
||||||
unit.horizon.description = Largue des bombes sur des cibles terrestres.
|
unit.horizon.description = Largue des bombes sur des cibles terrestres.
|
||||||
unit.zenith.description = Tire des salves de missiles sur les ennemis proches.
|
unit.zenith.description = Tire des salves de missiles sur les ennemis proches.
|
||||||
unit.antumbra.description = Tire un barrage de balles aux ennemis proches.
|
unit.antumbra.description = Tire un barrage de balles aux ennemis proches.
|
||||||
unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches.
|
unit.eclipse.description = Tire 2 lasers perçants et un barrage de balles explosives aux ennemis proches.
|
||||||
unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche.
|
unit.mono.description = Mine automatiquement du cuivre et du plomb et le dépose dans un Noyau proche.
|
||||||
unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs au thorium) et assiste les autres unités lorsqu'elles construisent.
|
unit.poly.description = Reconstruit automatiquement les structures détruites (sauf les réacteurs à thorium) et assiste les autres unités lorsqu'elles construisent.
|
||||||
unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres.
|
unit.mega.description = Répare automatiquement les structures endommagées. Capable de transporter des blocs et de petites unités terrestres.
|
||||||
unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne.
|
unit.quad.description = Largue de grosses bombes sur des cibles terrestres, réparant les structures alliées et infligeant des dégâts aux ennemis. Capable de transporter des blocs et des unités terrestres de taille moyenne.
|
||||||
unit.oct.description = Protège les alliés proches avec son champ de force auto-regénérant. Capable de transporter des blocs et de grosses unités terrestres.
|
unit.oct.description = Protège les alliés proches avec son champ de force auto-regénérant. Capable de transporter des blocs et de grosses unités terrestres.
|
||||||
@@ -1505,3 +1516,139 @@ unit.omura.description = Tire avec un canon à rails à longue portée, une puis
|
|||||||
unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures.
|
unit.alpha.description = Défend le Noyau fragment contre les ennemis. Peut construire des structures.
|
||||||
unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures.
|
unit.beta.description = Défend le Noyau fondation contre les ennemis. Peut construire des structures.
|
||||||
unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures.
|
unit.gamma.description = Défend le Noyau épicentre contre les ennemis. Peut construire des structures.
|
||||||
|
|
||||||
|
lst.read = Lit un nombre depuis un bloc de mémoire relié au processeur.
|
||||||
|
lst.write = Écrit un nombre dans un bloc de mémoire relié au processeur.
|
||||||
|
lst.print = Ajoute du texte dans la mémoire tampon de l'imprimante.\nNe montrera aucun texte tant que [accent]Print Flush[] ne sera pas utilisé.
|
||||||
|
lst.draw = Ajoute une opération dans la mémoire tampon de dessin.\nNe montrera aucune image tant que [accent]Draw Flush[] ne sera pas utilisé.
|
||||||
|
lst.drawflush = Affiche les opérations [accent]Draw[] en file d'attente vers un écran.
|
||||||
|
lst.printflush = Affiche les opérations [accent]Print[] en file d'attente vers un bloc de message.
|
||||||
|
lst.getlink = Obtient un lien de processeur par index. Commence à 0.
|
||||||
|
lst.control = Contrôle un bâtiment.
|
||||||
|
lst.radar = Localise des unités dans la portée d'un bâtiment.
|
||||||
|
lst.sensor = Récupère des données depuis un bâtiment ou une unité.
|
||||||
|
lst.set = Définit une variable.
|
||||||
|
lst.operation = Éffectue une opération sur 1 ou 2 variables.
|
||||||
|
lst.end = Saute au sommet de la série d’instructions.
|
||||||
|
lst.jump = Saute conditionnelement vers une autre instruction.
|
||||||
|
lst.unitbind = Se lie à une unité du type donné et la stocke dans [accent]@unit[].
|
||||||
|
lst.unitcontrol = Contrôle l'unité actuellement liée.
|
||||||
|
lst.unitradar = Localise des unités dans la portée de l'unité actuellement liée.
|
||||||
|
lst.unitlocate = Localise une position ou un type spécifique de bâtiment, n'importe où sur la carte.\nRequiert une unité reliée.
|
||||||
|
|
||||||
|
lenum.type = Type de bâtiment/unité.\nPar exemple, pour tout routeur, cela retournera [accent]@router[].\nPas en texte.
|
||||||
|
lenum.shoot = Tire à une position donnée.
|
||||||
|
lenum.shootp = Tire à une unité/bâtiment avec la prédiction de mouvement.
|
||||||
|
lenum.configure = La configuration d'un bâtiment. Par exemple, l'objet sélectionné dans un trieur.
|
||||||
|
lenum.enabled = Retourne si le bloc est activé ou pas.
|
||||||
|
|
||||||
|
laccess.color = La couleur d'un illuminateur.
|
||||||
|
|
||||||
|
graphicstype.clear = Remplit l’écran d’une couleur.
|
||||||
|
graphicstype.color = Définit une couleur pour les prochaines opérations de dessin.
|
||||||
|
graphicstype.stroke = Définit la largeur d'une ligne.
|
||||||
|
graphicstype.line = Dessine un segment de droite.
|
||||||
|
graphicstype.rect = Dessine un rectangle.
|
||||||
|
graphicstype.linerect = Dessine le contour d'un rectangle.
|
||||||
|
graphicstype.poly = Dessine un polygone régulier.
|
||||||
|
graphicstype.linepoly = Dessine le contour un polygone régulier.
|
||||||
|
graphicstype.triangle = Dessine un triangle.
|
||||||
|
graphicstype.image = Dessine une image venant du contenu du jeu.\nex: [accent]@router[] ou [accent]@dagger[].
|
||||||
|
|
||||||
|
lenum.always = Toujours [accent]true[].
|
||||||
|
lenum.idiv = Division entière.
|
||||||
|
lenum.div = Division.\nRetourne [accent]null[] lors d'une division par zéro.
|
||||||
|
lenum.mod = Modulo.
|
||||||
|
lenum.equal = Égalité. Conversion des types.\nLes objets non-nuls comparés avec des nombres deviennent 1, sinon 0.
|
||||||
|
lenum.notequal = Inégalité. Conversion des types.
|
||||||
|
lenum.strictequal = Égalité stricte. Ne convertit pas les types.\nPeut être utilisé pour vérifier les valeurs [accent]null[].
|
||||||
|
lenum.shl = Décalage de bits gauche.
|
||||||
|
lenum.shr = Décalage de bits droite.
|
||||||
|
lenum.or = Opération binaire OR.
|
||||||
|
lenum.land = Opération logique AND.
|
||||||
|
lenum.and = Opération binaire AND.
|
||||||
|
lenum.not = Opération binaire flip.
|
||||||
|
lenum.xor = Opération binaire XOR.
|
||||||
|
|
||||||
|
lenum.min = Le minimum des 2 nombres.
|
||||||
|
lenum.max = Le maximum des 2 nombres.
|
||||||
|
lenum.angle = Angle d'un vecteur en degrés.
|
||||||
|
lenum.len = Longueur d'un vecteur.
|
||||||
|
lenum.sin = Sinus, en degrés.
|
||||||
|
lenum.cos = Cosinus, en degrés.
|
||||||
|
lenum.tan = Tangente, en degrés.
|
||||||
|
#not a typo, look up 'range notation'
|
||||||
|
lenum.rand = Nombre aléatoire dans la plage [0, valeur].
|
||||||
|
lenum.log = Logarithme naturel (ln).
|
||||||
|
lenum.log10 = Logarithme de base 10.
|
||||||
|
lenum.noise = Bruit simplex 2D.
|
||||||
|
lenum.abs = Valeur absolue.
|
||||||
|
lenum.sqrt = Racine carrée.
|
||||||
|
|
||||||
|
lenum.any = N'importe quelle unité.
|
||||||
|
lenum.ally = Unité alliée.
|
||||||
|
lenum.attacker = Unité avec des armes.
|
||||||
|
lenum.enemy = Unité ennemie.
|
||||||
|
lenum.boss = Gardien.
|
||||||
|
lenum.flying = Unité volante.
|
||||||
|
lenum.ground = Unité terrestre.
|
||||||
|
lenum.player = Unité controllée par un joueur.
|
||||||
|
|
||||||
|
lenum.ore = Gisement de minerai.
|
||||||
|
lenum.damaged = Bâtiments alliés endommagés.
|
||||||
|
lenum.spawn = Point d'apparition ennemi.\nPeut être un noyau ou une position.
|
||||||
|
lenum.building = Bâtiment dans un groupe spécifique.
|
||||||
|
|
||||||
|
lenum.core = N'importe quel noyau.
|
||||||
|
lenum.storage = Bâtiments de stockage, un coffre-fort par exemple.
|
||||||
|
lenum.generator = Bâtiments générant de l'énergie.
|
||||||
|
lenum.factory = Bâtiments traitant des ressources.
|
||||||
|
lenum.repair = Points de réparation.
|
||||||
|
lenum.rally = Centres de commandes.
|
||||||
|
lenum.battery = N'importe quelle batterie.
|
||||||
|
lenum.resupply = Points de rechargement.\nUtile seulement lorsque [accent]"munitions"[] sont limitées.
|
||||||
|
lenum.reactor = Réacteur à Impact/Thorium.
|
||||||
|
lenum.turret = N'importe quelle tourelle.
|
||||||
|
|
||||||
|
sensor.in = Les bâtiments/unités à analyser.
|
||||||
|
|
||||||
|
radar.from = Bâtiment de détection.\nLa portée du détecteur est limitée à la portée du bâtiment.
|
||||||
|
radar.target = Filtre pour les unités à détecter.
|
||||||
|
radar.and = Filtres additionnels
|
||||||
|
radar.order = Ordre de filtrage. 0 pour inverser.
|
||||||
|
radar.sort = Valeur par laquelle les résultats sont triés.
|
||||||
|
radar.output = Variable dans laquelle écrire l'unité retournée.
|
||||||
|
|
||||||
|
unitradar.target = Filtre pour les unités à détecter.
|
||||||
|
unitradar.and = Filtres additionnels
|
||||||
|
unitradar.order = Ordre de filtrage. 0 pour inverser.
|
||||||
|
unitradar.sort = Valeur par laquelle les résultats sont triés.
|
||||||
|
unitradar.output = Variable dans laquelle écrire l'unité retournée.
|
||||||
|
|
||||||
|
control.of = Bâtiment à contrôler.
|
||||||
|
control.unit = Unité/bâtiment à viser.
|
||||||
|
control.shoot = S’il faut tirer ou non.
|
||||||
|
|
||||||
|
unitlocate.enemy = S'il faut détecter les bâtiments ennemis au non.
|
||||||
|
unitlocate.found = Retourne un boolean s'il l'objet a été trouvé ou non.
|
||||||
|
unitlocate.building = Retourne une variable pour le bâtiment localisé.
|
||||||
|
unitlocate.outx = Retourne la coordonnée X.
|
||||||
|
unitlocate.outy = Retourne la coordonnée Y.
|
||||||
|
unitlocate.group = Le groupe de bâtiments à rechercher.
|
||||||
|
|
||||||
|
lenum.stop = Empêche l'unité de bouger/miner/construire.
|
||||||
|
lenum.move = Bouge vers la position exacte.
|
||||||
|
lenum.approach = Approche une position avec un rayon.
|
||||||
|
lenum.pathfind = Détermine un itinéraire et bouge vers le point d'apparition ennemi.
|
||||||
|
lenum.target = Tire vers la position donnée.
|
||||||
|
lenum.targetp = Tire sur un cible avec la prédiction de mouvement.
|
||||||
|
lenum.itemdrop = Lâche un objet.
|
||||||
|
lenum.itemtake = Prend un objet depuis un bâtiment.
|
||||||
|
lenum.paydrop = Lâche le chargement actuel.
|
||||||
|
lenum.paytake = Prend un chargement à la position actuelle.
|
||||||
|
lenum.flag = Drapeau numérique d'une unité.
|
||||||
|
lenum.mine = Mine à une position donnée.
|
||||||
|
lenum.build = Construit une structure.
|
||||||
|
lenum.getblock = Récupère des données sur un bâtiment et son type aux coordonnées données.\nL'unité doit se trouver dans la portée de la position.\nLes blocs solides qui ne sont pas des bâtiments auront le type [accent]@solid[].
|
||||||
|
lenum.within = Vérifie si l'unité est près de la position.
|
||||||
|
lenum.boost = Active/Désactive le boost.
|
||||||
@@ -4,10 +4,10 @@ contributors = 번역가와 기여자
|
|||||||
discord = Mindustry Discord 서버에 가입하세요!
|
discord = Mindustry Discord 서버에 가입하세요!
|
||||||
link.discord.description = Mindustry Discord 공식 대화방
|
link.discord.description = Mindustry Discord 공식 대화방
|
||||||
link.reddit.description = Mindustry 서브레딧
|
link.reddit.description = Mindustry 서브레딧
|
||||||
link.github.description = Mindustry 개발 홈페이지
|
link.github.description = Mindustry 소스코드
|
||||||
link.changelog.description = 업데이트 내용 목록
|
link.changelog.description = 업데이트 내용 목록
|
||||||
link.dev-builds.description = 불안정한 개발 버전
|
link.dev-builds.description = 불안정한 개발 버전
|
||||||
link.trello.description = 출시 예정인 기능을 한다고 게시한 공식 Trello 보드
|
link.trello.description = 출시 예정 기능 계획을 게시한 공식 Trello 보드
|
||||||
link.itch.io.description = PC 다운로드가 있는 itch.io 페이지
|
link.itch.io.description = PC 다운로드가 있는 itch.io 페이지
|
||||||
link.google-play.description = Google Play 스토어 목록
|
link.google-play.description = Google Play 스토어 목록
|
||||||
link.f-droid.description = F-Droid 카탈로그 목록
|
link.f-droid.description = F-Droid 카탈로그 목록
|
||||||
@@ -22,7 +22,7 @@ gameover.disconnect = 연결 끊기
|
|||||||
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
||||||
gameover.waiting = [accent]다음 맵 기다리는 중...
|
gameover.waiting = [accent]다음 맵 기다리는 중...
|
||||||
highscore = [accent]새로운 최고 점수!
|
highscore = [accent]새로운 최고 점수!
|
||||||
copied = 복사
|
copied = 복사됨.
|
||||||
indev.notready = 이 부분은 아직 준비되지 않았습니다.
|
indev.notready = 이 부분은 아직 준비되지 않았습니다.
|
||||||
indev.campaign = [accent]당신은 캠페인의 끝에 도달했습니다![]\n\n이것으로 캠페인에 있는 대부분의 콘텐츠는 끝났으며, 행성 간 여행은 향후 업데이트에 추가될 예정입니다.
|
indev.campaign = [accent]당신은 캠페인의 끝에 도달했습니다![]\n\n이것으로 캠페인에 있는 대부분의 콘텐츠는 끝났으며, 행성 간 여행은 향후 업데이트에 추가될 예정입니다.
|
||||||
|
|
||||||
@@ -41,10 +41,11 @@ be.ignore = 무시
|
|||||||
be.noupdates = 업데이트가 없습니다.
|
be.noupdates = 업데이트가 없습니다.
|
||||||
be.check = 업데이트 확인
|
be.check = 업데이트 확인
|
||||||
|
|
||||||
mod.featured.dialog.title = 모드 탐색 (WIP)
|
mods.browser = 모드 탐색기
|
||||||
mods.browser.selected = 선택된 모드
|
mods.browser.selected = 선택된 모드
|
||||||
mods.browser.add = 모드 설치
|
mods.browser.add = 설치
|
||||||
mods.github.open = 깃허브 사이트 열기
|
mods.browser.reinstall = 재설치
|
||||||
|
mods.github.open = 레포지토리 보기
|
||||||
mods.browser.sortdate = 최근 업데이트
|
mods.browser.sortdate = 최근 업데이트
|
||||||
mods.browser.sortstars = 추천(스타) 수
|
mods.browser.sortstars = 추천(스타) 수
|
||||||
|
|
||||||
@@ -56,7 +57,7 @@ schematic.exists = 해당 이름의 설계도가 이미 존재합니다.
|
|||||||
schematic.import = 설계도 가져오기
|
schematic.import = 설계도 가져오기
|
||||||
schematic.exportfile = 파일 내보내기
|
schematic.exportfile = 파일 내보내기
|
||||||
schematic.importfile = 파일 가져오기
|
schematic.importfile = 파일 가져오기
|
||||||
schematic.browseworkshop = 창작마당 검색
|
schematic.browseworkshop = 창작마당에 검색
|
||||||
schematic.copy = 클립 보드에 복사
|
schematic.copy = 클립 보드에 복사
|
||||||
schematic.copy.import = 클립 보드에서 가져오기
|
schematic.copy.import = 클립 보드에서 가져오기
|
||||||
schematic.shareworkshop = 창작마당에 공유
|
schematic.shareworkshop = 창작마당에 공유
|
||||||
@@ -118,8 +119,10 @@ mods.none = [lightgray]모드를 찾을 수 없습니다!
|
|||||||
mods.guide = 모드 제작 가이드
|
mods.guide = 모드 제작 가이드
|
||||||
mods.report = 버그 제보하기
|
mods.report = 버그 제보하기
|
||||||
mods.openfolder = 폴더 열기
|
mods.openfolder = 폴더 열기
|
||||||
|
mods.viewcontent = 콘텐츠 보기
|
||||||
mods.reload = 새로 고침
|
mods.reload = 새로 고침
|
||||||
mods.reloadexit = 게임이 종료된 후 모드를 불러올 것입니다.
|
mods.reloadexit = 게임이 종료된 후 모드를 불러올 것입니다.
|
||||||
|
mod.installed = [[설치됨]
|
||||||
mod.display = [gray]모드:[orange] {0}
|
mod.display = [gray]모드:[orange] {0}
|
||||||
mod.enabled = [lightgray]활성화됨
|
mod.enabled = [lightgray]활성화됨
|
||||||
mod.disabled = [scarlet]비활성화됨
|
mod.disabled = [scarlet]비활성화됨
|
||||||
@@ -127,7 +130,7 @@ mod.disable = 비활성화
|
|||||||
mod.content = 콘텐츠:
|
mod.content = 콘텐츠:
|
||||||
mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다.
|
mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다.
|
||||||
mod.requiresversion = [scarlet]필요한 최소 게임 버전: [accent]{0}
|
mod.requiresversion = [scarlet]필요한 최소 게임 버전: [accent]{0}
|
||||||
mod.outdated = [scarlet]V6 버전과 호환되지 않음 (minGameVersion이 105 이하인 모드는 사용할 수 없습니다.)
|
mod.outdated = [scarlet]V6 버전과 호환되지 않음 (minGameVersion: 105 이상이 아님)
|
||||||
mod.missingdependencies = [scarlet]누락된 필요 모드: {0}
|
mod.missingdependencies = [scarlet]누락된 필요 모드: {0}
|
||||||
mod.erroredcontent = [scarlet]콘텐츠 오류
|
mod.erroredcontent = [scarlet]콘텐츠 오류
|
||||||
mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함.
|
mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함.
|
||||||
@@ -139,8 +142,8 @@ mod.reloadrequired = [scarlet]재시작 필요
|
|||||||
mod.import = 모드 가져오기
|
mod.import = 모드 가져오기
|
||||||
mod.import.file = 파일 가져오기
|
mod.import.file = 파일 가져오기
|
||||||
mod.import.github = Github 에서 모드 가져오기
|
mod.import.github = Github 에서 모드 가져오기
|
||||||
mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 모드 개발자에게서 얻은 모드만을 사용해야 합니다!
|
mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 개발자에게서 얻은 모드만을 사용해야 합니다!
|
||||||
mod.item.remove = 이 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요.
|
mod.item.remove = 이 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요.
|
||||||
mod.remove.confirm = 이 모드가 삭제될 것입니다.
|
mod.remove.confirm = 이 모드가 삭제될 것입니다.
|
||||||
mod.author = [lightgray]제작자:[] {0}
|
mod.author = [lightgray]제작자:[] {0}
|
||||||
mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 현재 기기에 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러오시겠습니까?\n[lightgray]모드들:\n{0}
|
mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 현재 기기에 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러오시겠습니까?\n[lightgray]모드들:\n{0}
|
||||||
@@ -150,7 +153,7 @@ mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하
|
|||||||
|
|
||||||
about.button = 정보
|
about.button = 정보
|
||||||
name = 닉네임 :
|
name = 닉네임 :
|
||||||
noname = 먼저 [accent]닉네임[]을 설정하세요.
|
noname = 먼저 [accent]플레이어 이름[]을 설정하세요.
|
||||||
planetmap = 행성 지도
|
planetmap = 행성 지도
|
||||||
launchcore = 코어 출격
|
launchcore = 코어 출격
|
||||||
filename = 파일 이름:
|
filename = 파일 이름:
|
||||||
@@ -173,17 +176,17 @@ server.closing = [accent]서버를 닫는 중...
|
|||||||
server.kicked.kick = 서버에서 추방되었습니다!
|
server.kicked.kick = 서버에서 추방되었습니다!
|
||||||
server.kicked.whitelist = 당신은 이 서버의 화이트리스트에 등록되어 있지 않습니다.
|
server.kicked.whitelist = 당신은 이 서버의 화이트리스트에 등록되어 있지 않습니다.
|
||||||
server.kicked.serverClose = 서버 닫힘.
|
server.kicked.serverClose = 서버 닫힘.
|
||||||
server.kicked.vote = 당신은 투표로 추방되었습니다. 안녕히 가세요!
|
server.kicked.vote = 당신은 투표로 추방되었습니다. 안녕히 가세요.
|
||||||
server.kicked.clientOutdated = 구버전 클라이언트입니다! 게임을 업데이트하세요!
|
server.kicked.clientOutdated = 구버전 클라이언트입니다! 게임을 업데이트하세요!
|
||||||
server.kicked.serverOutdated = 구버전 서버입니다! 호스트에게 업데이트를 요청하세요!
|
server.kicked.serverOutdated = 구버전 서버입니다! 호스트에게 업데이트를 요청하세요!
|
||||||
server.kicked.banned = 당신은 이 서버에서 영구적으로 차단되었습니다.
|
server.kicked.banned = 당신은 이 서버에서 영구적으로 차단되었습니다.
|
||||||
server.kicked.typeMismatch = 이 서버는 현재 빌드 유형과 호환되지 않습니다.
|
server.kicked.typeMismatch = 이 서버는 현재 빌드와 호환되지 않습니다.
|
||||||
server.kicked.playerLimit = 서버의 인원이 꽉 찼습니다. 빈 슬롯이 생길 때까지 기다려주세요.
|
server.kicked.playerLimit = 서버의 인원이 꽉 찼습니다. 빈 슬롯이 생길 때까지 기다려주세요.
|
||||||
server.kicked.recentKick = 최근에 추방되었습니다.\n추방 쿨타임이 끝날 때까지 기다리세요.
|
server.kicked.recentKick = 최근에 추방되었습니다.\n추방 쿨타임이 끝날 때까지 기다리세요.
|
||||||
server.kicked.nameInUse = 이 서버에 해당 이름을 가진 사람이 있습니다.
|
server.kicked.nameInUse = 이 서버에 해당 이름을 가진 사람이 있습니다.
|
||||||
server.kicked.nameEmpty = 설정된 닉네임이 없습니다.
|
server.kicked.nameEmpty = 설정된 닉네임이 없습니다.
|
||||||
server.kicked.idInUse = 당신은 이미 이 서버에 있습니다! 두 개의 계정으로 연결하는 건 허용되지 않습니다.
|
server.kicked.idInUse = 당신은 이미 이 서버에 있습니다! 두 개의 계정으로 연결하는 건 허용되지 않습니다.
|
||||||
server.kicked.customClient = 이 서버는 사용자 정의 빌드를 지원하지 않습니다. 공식 버전을 다운로드 하세요.
|
server.kicked.customClient = 이 서버는 사용자 정의 빌드를 지원하지 않습니다. 공식 버전을 내려받으세요.
|
||||||
server.kicked.gameover = 게임 오버!
|
server.kicked.gameover = 게임 오버!
|
||||||
server.kicked.serverRestarting = 서버가 다시 시작되고 있습니다.
|
server.kicked.serverRestarting = 서버가 다시 시작되고 있습니다.
|
||||||
server.versions = 당신의 버전 : [accent] {0}[]\n서버 버전 : [accent] {1}[]
|
server.versions = 당신의 버전 : [accent] {0}[]\n서버 버전 : [accent] {1}[]
|
||||||
@@ -206,7 +209,7 @@ servers.remote = 원격 서버
|
|||||||
servers.global = 커뮤니티 서버
|
servers.global = 커뮤니티 서버
|
||||||
|
|
||||||
servers.disclaimer = 커뮤니티 서버는 개발자가 소유하거나 제어하지 [accent]않습니다[].\n\n서버들은 전연령대에 적합하지 않은 사용자 지정 콘텐츠를 보유할 수도 있습니다.
|
servers.disclaimer = 커뮤니티 서버는 개발자가 소유하거나 제어하지 [accent]않습니다[].\n\n서버들은 전연령대에 적합하지 않은 사용자 지정 콘텐츠를 보유할 수도 있습니다.
|
||||||
servers.showhidden = 서버 숨기기 / 보이기
|
servers.showhidden = 숨겨진 서버 보이기/숨기기
|
||||||
server.shown = 서버 숨기기
|
server.shown = 서버 숨기기
|
||||||
server.hidden = 서버 보이기
|
server.hidden = 서버 보이기
|
||||||
|
|
||||||
@@ -219,7 +222,7 @@ trace.modclient = 사용자 지정 클라이언트: [accent]{0}
|
|||||||
invalidid = 잘못된 클라이언트 ID입니다! 버그 보고서를 보내주세요.
|
invalidid = 잘못된 클라이언트 ID입니다! 버그 보고서를 보내주세요.
|
||||||
server.bans = 차단 목록
|
server.bans = 차단 목록
|
||||||
server.bans.none = 차단된 플레이어를 찾을 수 없습니다!
|
server.bans.none = 차단된 플레이어를 찾을 수 없습니다!
|
||||||
server.admins = 관리자들
|
server.admins = 관리자
|
||||||
server.admins.none = 관리자를 찾을 수 없습니다!
|
server.admins.none = 관리자를 찾을 수 없습니다!
|
||||||
server.add = 서버 추가
|
server.add = 서버 추가
|
||||||
server.delete = 정말로 이 서버를 삭제하시겠습니까?
|
server.delete = 정말로 이 서버를 삭제하시겠습니까?
|
||||||
@@ -305,11 +308,12 @@ loading = [accent]불러오는중...
|
|||||||
reloading = [accent]모드 새로고침하는중...
|
reloading = [accent]모드 새로고침하는중...
|
||||||
saving = [accent]저장중...
|
saving = [accent]저장중...
|
||||||
respawn = [accent][[{0}][] 키를 눌러 코어에서 부활
|
respawn = [accent][[{0}][] 키를 눌러 코어에서 부활
|
||||||
cancelbuilding = [accent][[{0}][] 를 눌러 건설 계획을 초기화
|
cancelbuilding = [accent][[{0}][] 키를 눌러 건설 계획을 초기화
|
||||||
selectschematic = [accent][[{0}][] 를 눌러 선택+복사
|
selectschematic = [accent][[{0}][] 키를 눌러 선택+복사
|
||||||
pausebuilding = [accent][[{0}][] 를 눌러 건설을 일시중지
|
pausebuilding = [accent][[{0}][] 키를 눌러 건설을 일시중지
|
||||||
resumebuilding = [scarlet][[{0}][] 를 눌러 건설을 재개
|
resumebuilding = [scarlet][[{0}][] 키를 눌러 건설을 재개
|
||||||
showui = [accent][[{0}][] 키를 눌러 UI를 활성화
|
enablebuilding = [scarlet][[{0}][] 키를 눌러 건설을 활성
|
||||||
|
showui = UI가 숨겨졌습니다. [accent][[{0}][] 키를 눌러 UI를 활성화하세요.
|
||||||
wave = [accent]{0} 단계
|
wave = [accent]{0} 단계
|
||||||
wave.cap = [accent]단계 {0}/{1}
|
wave.cap = [accent]단계 {0}/{1}
|
||||||
wave.waiting = 다음 단계까지[lightgray] {0}초
|
wave.waiting = 다음 단계까지[lightgray] {0}초
|
||||||
@@ -341,7 +345,7 @@ workshop.info = 아이템 정보
|
|||||||
changelog = 변경점 (선택 사항):
|
changelog = 변경점 (선택 사항):
|
||||||
eula = 스팀 EULA
|
eula = 스팀 EULA
|
||||||
missing = 이 아이템은 삭제되거나 이동되었습니다.\n[lightgray]창작마당 목록이 자동으로 연결 해제되었습니다.
|
missing = 이 아이템은 삭제되거나 이동되었습니다.\n[lightgray]창작마당 목록이 자동으로 연결 해제되었습니다.
|
||||||
publishing = [accent]업로드 중...
|
publishing = [accent]게시 중...
|
||||||
publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EULA에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다!
|
publish.confirm = 이것을 게시하시겠습니까?[lightgray]창작마당 EULA에 동의해야 합니다. 그렇지 않으면 아이템이 표시되지 않습니다!
|
||||||
publish.error = 아이템 게시 오류: {0}
|
publish.error = 아이템 게시 오류: {0}
|
||||||
steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0}
|
steam.error = 스팀 서비스를 초기화하지 못했습니다.\n오류: {0}
|
||||||
@@ -375,7 +379,7 @@ waves.edit = 편집
|
|||||||
waves.copy = 클립보드로 복사
|
waves.copy = 클립보드로 복사
|
||||||
waves.load = 클립보드에서 불러오기
|
waves.load = 클립보드에서 불러오기
|
||||||
waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다.
|
waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다.
|
||||||
waves.copied = 단계 복사됨
|
waves.copied = 단계 복사됨.
|
||||||
waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다.
|
waves.none = 적 단계가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 단계 데이터로 설정됩니다.
|
||||||
|
|
||||||
#these are intentionally in lower case
|
#these are intentionally in lower case
|
||||||
@@ -384,8 +388,8 @@ wavemode.totals = 총
|
|||||||
wavemode.health = 체력
|
wavemode.health = 체력
|
||||||
|
|
||||||
editor.default = [lightgray]<기본값>
|
editor.default = [lightgray]<기본값>
|
||||||
details = 설명
|
details = 설명...
|
||||||
edit = 편집
|
edit = 편집...
|
||||||
editor.name = 이름:
|
editor.name = 이름:
|
||||||
editor.spawn = 유닛 생성
|
editor.spawn = 유닛 생성
|
||||||
editor.removeunit = 유닛 삭제
|
editor.removeunit = 유닛 삭제
|
||||||
@@ -415,7 +419,7 @@ editor.importfile = 파일 가져오기
|
|||||||
editor.importfile.description = 외부 맵 파일 가져오기
|
editor.importfile.description = 외부 맵 파일 가져오기
|
||||||
editor.importimage = 사진 파일 가져오기
|
editor.importimage = 사진 파일 가져오기
|
||||||
editor.importimage.description = 외부 맵 사진 파일 가져오기
|
editor.importimage.description = 외부 맵 사진 파일 가져오기
|
||||||
editor.export = 내보내기
|
editor.export = 내보내기...
|
||||||
editor.exportfile = 파일 내보내기
|
editor.exportfile = 파일 내보내기
|
||||||
editor.exportfile.description = 맵 파일 내보내기
|
editor.exportfile.description = 맵 파일 내보내기
|
||||||
editor.exportimage = 지형 이미지 내보내기
|
editor.exportimage = 지형 이미지 내보내기
|
||||||
@@ -448,15 +452,15 @@ toolmode.drawteams.description = 블록 대신 선택한 팀으로 블록 팀을
|
|||||||
filters.empty = [lightgray]필터가 없습니다! 아래 버튼을 눌러 하나를 추가하세요.
|
filters.empty = [lightgray]필터가 없습니다! 아래 버튼을 눌러 하나를 추가하세요.
|
||||||
filter.distort = 왜곡
|
filter.distort = 왜곡
|
||||||
filter.noise = 노이즈
|
filter.noise = 노이즈
|
||||||
filter.enemyspawn = 적 소환지점 제한
|
filter.enemyspawn = 적 소환지점 선택
|
||||||
filter.spawnpath = 자동생성된 적 이동경로 폭
|
filter.spawnpath = 자동생성된 적 이동경로 폭
|
||||||
filter.corespawn = 코어 1개 제한
|
filter.corespawn = 코어 선택
|
||||||
filter.median = 중앙값
|
filter.median = 중앙값
|
||||||
filter.oremedian = 자원 중앙값
|
filter.oremedian = 광물 중앙값
|
||||||
filter.blend = 블렌드
|
filter.blend = 가장자리
|
||||||
filter.defaultores = 기본 자원
|
filter.defaultores = 기본 광물
|
||||||
filter.ore = 자원
|
filter.ore = 광물
|
||||||
filter.rivernoise = 협곡 노이즈
|
filter.rivernoise = 강 노이즈
|
||||||
filter.mirror = 거울
|
filter.mirror = 거울
|
||||||
filter.clear = 초기화
|
filter.clear = 초기화
|
||||||
filter.option.ignore = 무시
|
filter.option.ignore = 무시
|
||||||
@@ -465,19 +469,19 @@ filter.terrain = 지형
|
|||||||
filter.option.scale = 크기
|
filter.option.scale = 크기
|
||||||
filter.option.chance = 배치 빈도
|
filter.option.chance = 배치 빈도
|
||||||
filter.option.mag = 크기
|
filter.option.mag = 크기
|
||||||
filter.option.threshold = 경계선
|
filter.option.threshold = 한계점
|
||||||
filter.option.circle-scale = 원 크기
|
filter.option.circle-scale = 원 크기
|
||||||
filter.option.octaves = 옥타브
|
filter.option.octaves = 옥타브
|
||||||
filter.option.falloff = 경사
|
filter.option.falloff = 경사
|
||||||
filter.option.angle = 각도
|
filter.option.angle = 각도
|
||||||
filter.option.amount = 개수
|
filter.option.amount = 개수
|
||||||
filter.option.block = 블록
|
filter.option.block = 블록
|
||||||
filter.option.floor = 배치할 타일
|
filter.option.floor = 타일
|
||||||
filter.option.flooronto = 대상 타일
|
filter.option.flooronto = 대상 타일
|
||||||
filter.option.target = 대상 타일
|
filter.option.target = 대상
|
||||||
filter.option.wall = 벽
|
filter.option.wall = 벽
|
||||||
filter.option.ore = 자원
|
filter.option.ore = 광물
|
||||||
filter.option.floor2 = 2층 바닥
|
filter.option.floor2 = 2번째 타일
|
||||||
filter.option.threshold2 = 2번째 경계선
|
filter.option.threshold2 = 2번째 경계선
|
||||||
filter.option.radius = 반경
|
filter.option.radius = 반경
|
||||||
filter.option.percentile = 백분율
|
filter.option.percentile = 백분율
|
||||||
@@ -488,7 +492,7 @@ menu = 메뉴
|
|||||||
play = 플레이
|
play = 플레이
|
||||||
campaign = 캠페인
|
campaign = 캠페인
|
||||||
load = 불러오기
|
load = 불러오기
|
||||||
save = 저장
|
save = 저장하기
|
||||||
fps = FPS: {0}
|
fps = FPS: {0}
|
||||||
ping = Ping: {0}ms
|
ping = Ping: {0}ms
|
||||||
memory = Mem: {0}mb
|
memory = Mem: {0}mb
|
||||||
@@ -519,7 +523,7 @@ loadout = 출격
|
|||||||
resources = 자원
|
resources = 자원
|
||||||
bannedblocks = 금지된 블록들
|
bannedblocks = 금지된 블록들
|
||||||
addall = 모두 추가
|
addall = 모두 추가
|
||||||
launch.from = 점령 코어 송신 지역 : [accent]{0}
|
launch.from = 출격 출발지 : [accent]{0}
|
||||||
launch.destination = 목적지: {0}
|
launch.destination = 목적지: {0}
|
||||||
configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다.
|
configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다.
|
||||||
add = 추가...
|
add = 추가...
|
||||||
@@ -534,7 +538,7 @@ error.alreadyconnected = 이미 접속 중입니다.
|
|||||||
error.mapnotfound = 맵 파일을 찾을 수 없습니다!
|
error.mapnotfound = 맵 파일을 찾을 수 없습니다!
|
||||||
error.io = 네트워크 I/O 오류.
|
error.io = 네트워크 I/O 오류.
|
||||||
error.any = 알 수 없는 네트워크 오류.
|
error.any = 알 수 없는 네트워크 오류.
|
||||||
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
||||||
|
|
||||||
weather.rain.name = 비
|
weather.rain.name = 비
|
||||||
weather.snow.name = 눈
|
weather.snow.name = 눈
|
||||||
@@ -544,27 +548,27 @@ weather.fog.name = 안개
|
|||||||
|
|
||||||
sectors.unexplored = [lightgray]미개척지
|
sectors.unexplored = [lightgray]미개척지
|
||||||
sectors.resources = 자원:
|
sectors.resources = 자원:
|
||||||
sectors.production = 분당 자원 생산량:
|
sectors.production = 생산량:
|
||||||
sectors.export = 분당 자원 수출량:
|
sectors.export = 수출량:
|
||||||
sectors.time = 지역 진행 시간:
|
sectors.time = 진행 시간:
|
||||||
sectors.threat = 지역 위험도:
|
sectors.threat = 위험도:
|
||||||
sectors.wave = 진행 중 단계:
|
sectors.wave = 단계:
|
||||||
sectors.stored = 저장된 자원 목록:
|
sectors.stored = 저장량:
|
||||||
sectors.resume = 재개
|
sectors.resume = 재개
|
||||||
sectors.launch = 출격
|
sectors.launch = 출격
|
||||||
sectors.select = 선택
|
sectors.select = 선택
|
||||||
sectors.nonelaunch = [lightgray]없음 (sun)
|
sectors.nonelaunch = [lightgray]없음 (sun)
|
||||||
sectors.rename = 구역 이름 변경
|
sectors.rename = 구역 이름 변경
|
||||||
sectors.enemybase = [scarlet]적 기지
|
sectors.enemybase = [scarlet]적 기지
|
||||||
sectors.vulnerable = [scarlet]취약
|
sectors.vulnerable = [scarlet]취약함
|
||||||
sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% 손상됨.
|
sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% 손상됨.
|
||||||
sectors.survives = [accent]{0} 단계 이상 버티세요.
|
sectors.survives = [accent]{0} 단계 이상 버티세요.
|
||||||
sectors.go = 지역 진입
|
sectors.go =진입
|
||||||
sector.curcapture = 점령지
|
sector.curcapture = 지역 점령됨
|
||||||
sector.curlost = 잃은 지역
|
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] 지역을 잃었습니다!
|
||||||
#note: the missing space in the line below is intentional
|
#note: the missing space in the line below is intentional
|
||||||
sector.captured = [accent]{0}[white] 지역을 점령했습니다!
|
sector.captured = [accent]{0}[white] 지역을 점령했습니다!
|
||||||
|
|
||||||
@@ -580,7 +584,7 @@ planet.serpulo.name = 세르플로
|
|||||||
planet.sun.name = 태양
|
planet.sun.name = 태양
|
||||||
|
|
||||||
sector.impact0078.name = 폐허 : Impact 0078
|
sector.impact0078.name = 폐허 : Impact 0078
|
||||||
sector.groundZero.name = Zero 전초기지
|
sector.groundZero.name = 전초기지
|
||||||
sector.craters.name = 크레이터
|
sector.craters.name = 크레이터
|
||||||
sector.frozenForest.name = 얼어붙은 숲
|
sector.frozenForest.name = 얼어붙은 숲
|
||||||
sector.ruinousShores.name = 파괴된 해안가
|
sector.ruinousShores.name = 파괴된 해안가
|
||||||
@@ -602,12 +606,12 @@ sector.saltFlats.description = 이 소금 사막은 매우 척박하여 자원
|
|||||||
sector.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 다시 점령해 강화 유리를 제작하고 물을 끌어올려 포탑과 드릴에 공급하여 더 좋은 효율로 방어선을 강화하십시오.
|
sector.craters.description = 물이 가득한 이 크레이터에는 옛 전쟁의 유물들이 쌓여있습니다.\n이곳을 다시 점령해 강화 유리를 제작하고 물을 끌어올려 포탑과 드릴에 공급하여 더 좋은 효율로 방어선을 강화하십시오.
|
||||||
sector.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한 뒤, 잃어버린 기술을 다시 회수하십시오.
|
sector.ruinousShores.description = 이 지역은 과거 해안방어기지로 사용되었습니다.\n그러나 지금은 기본구조물만 남아있으니 이 지역을 어서 신속히 수리하여 외부로 세력을 확장한 뒤, 잃어버린 기술을 다시 회수하십시오.
|
||||||
sector.stainedMountains.description = 더 안쪽에는 포자에 오염된 산맥이 있지만, 이곳은 아직 포자에 오염되지 않았습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n적들은 이곳에서 더 강력합니다. 더 강한 유닛들이 나올 때까지 시간을 낭비하지 마십시오.
|
sector.stainedMountains.description = 더 안쪽에는 포자에 오염된 산맥이 있지만, 이곳은 아직 포자에 오염되지 않았습니다.\n이 지역에서 티타늄을 채굴하고 이것을 어떻게 사용하는지 배우십시오.\n\n적들은 이곳에서 더 강력합니다. 더 강한 유닛들이 나올 때까지 시간을 낭비하지 마십시오.
|
||||||
sector.overgrowth.description = 이곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이 곳에 전초기지를 설립했습니다. 디거를 생산해 적의 코어를 박살 내고 우리가 잃어버린 것들을 되돌려받으십시오!
|
sector.overgrowth.description = 이곳은 포자들의 근원과 가까이에 있는 과성장 지대입니다. 적이 이곳에 전초기지를 설립했습니다. 대거를 생산해 적의 코어를 박살 내고 우리가 잃어버린 것들을 되돌려받으십시오!
|
||||||
sector.tarFields.description = 산지와 사막 사이에 있는 석유 생산지의 외곽 지역이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이지만 이곳에는 위험한 적군들이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 생산기술을 익히는 것이 도움이 될 것입니다.
|
sector.tarFields.description = 산지와 사막 사이에 있는 석유 생산지의 외곽 지역이며, 사용 가능한 타르가 매장되어 있는 희귀한 지역 중 하나입니다. 버려진 지역이지만 이곳에는 위험한 적군들이 있습니다. 그들을 과소평가하지 마십시오.\n\n[lightgray]석유 생산기술을 익히는 것이 도움이 될 것입니다.
|
||||||
sector.desolateRift.description = 극도로 위험한 지역입니다. 자원은 풍부하지만, 사용 가능한 공간은 거의 없습니다. 코어 파괴의 위험성이 높으니 가능한 한 빨리 떠나십시오. 또한, 적의 공격 딜레이가 길다고 안심하지 마십시오.
|
sector.desolateRift.description = 극도로 위험한 지역입니다. 자원은 풍부하지만, 사용 가능한 공간은 거의 없습니다. 코어 파괴의 위험성이 높으니 가능한 한 빨리 떠나십시오. 또한, 적의 공격 딜레이가 길다고 안심하지 마십시오.
|
||||||
sector.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 위해 운영되었던 시설입니다. 지금은 그저 폐허로 전락했으며, 다수의 적이 배치된 지역입니다. 그들은 끊임없이 당신을 공격할 것입니다.\n\n[lightgray]토륨의 다양한 사용법을 연구하고 익히십시오.
|
sector.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를 위해 운영되었던 시설입니다. 지금은 그저 폐허로 전락했으며, 다수의 적이 배치된 지역입니다. 그들은 끊임없이 당신을 공격할 것입니다.\n\n[lightgray]토륨의 다양한 사용법을 연구하고 익히십시오.
|
||||||
sector.fungalPass.description = 높은 산과 낮은 땅 사이의 전환 지역. 작은 적 정찰 기지가 여기에 있습니다.\n그것들을 파괴하세요.\n대거와 크롤러 유닛을 사용하여 두 개의 코어를 파괴하세요.
|
sector.fungalPass.description = 높은 산과 낮은 땅 사이의 전환 지역. 작은 적 정찰 기지가 여기에 있습니다.\n그것들을 파괴하세요.\n대거와 크롤러 유닛을 사용하여 두 개의 코어를 파괴하세요.
|
||||||
sector.biomassFacility.description = 포자의 시작이 되는 지역입니다. 이 시설은 포자를 연구하고 그것들을 가장 처음 생산했습니다.\n이 시설에 기록된 기술을 배우고, 연료와 플라스터늄을 생산하기 위해 포자를 배양하세요. \n\n[lightgray]이 시설이 붕괴된 후에, 시설 내에 배양되던 포자들이 외부로 방출되었습니다. 이로 인해 생태계 교란종인 포자가 지역 생태계에서 번식하게 되었고, 그 무엇도 이 무자비하고 작은 침략자에게 대항할 수 없었습니다.
|
sector.biomassFacility.description = 포자의 시작이 되는 지역입니다. 이 시설은 포자를 연구하고 그것들을 가장 처음 생산했습니다.\n이 시설에 기록된 기술을 배우고, 연료와 플라스터늄을 생산하기 위해 포자를 배양하세요. \n\n[lightgray]이 시설이 붕괴한 후에, 시설 내에 배양되던 포자들이 외부로 방출되었습니다. 이로 인해 생태계 교란종인 포자가 지역 생태계에서 번식하게 되었고, 그 무엇도 이 무자비하고 작은 침략자에게 대항할 수 없었습니다.
|
||||||
sector.windsweptIslands.description = 육지에서 멀리 떨어진 이곳에는 작은 군도가 있습니다. 이 지역을 조사해보면 한 때 [accent]플라스터늄[]을 생산한 흔적이 남아있습니다.\n\n몰려오는 적 해군을 막으며, 섬에 기지를 건설하고, 공장들을 연구하십시오.
|
sector.windsweptIslands.description = 육지에서 멀리 떨어진 이곳에는 작은 군도가 있습니다. 이 지역을 조사해보면 한 때 [accent]플라스터늄[]을 생산한 흔적이 남아있습니다.\n\n몰려오는 적 해군을 막으며, 섬에 기지를 건설하고, 공장들을 연구하십시오.
|
||||||
sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내기 위한 용도로 건설한 보급기지입니다.\n\n강력한 적들이 지키고 있거나, 침공해올 예정인 지역을 효과적으로 침공/수호하기 위해서는 우리도 이 수송 기술이 필요합니다. 적의 기지를 파괴하고, 그들의 수송 기술을 약탈하십시오.
|
sector.extractionOutpost.description = 적이 다른 지역에 자원을 보내기 위한 용도로 건설한 보급기지입니다.\n\n강력한 적들이 지키고 있거나, 침공해올 예정인 지역을 효과적으로 침공/수호하기 위해서는 우리도 이 수송 기술이 필요합니다. 적의 기지를 파괴하고, 그들의 수송 기술을 약탈하십시오.
|
||||||
sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
|
sector.impact0078.description = 이곳에는 시스템에 처음 진입한 우주 수송선의 잔해가 있습니다.\n\n우주선이 파괴된 잔해에서 최대한 많은 자원을 회수하고, 손상되지 않은 그들의 기술을 획득하세요.
|
||||||
@@ -615,9 +619,9 @@ sector.planetaryTerminal.description = 이 행성에서의 마지막 전투를
|
|||||||
|
|
||||||
settings.language = 언어
|
settings.language = 언어
|
||||||
settings.data = 게임 데이터
|
settings.data = 게임 데이터
|
||||||
settings.reset = 설정 초기화
|
settings.reset = 기본값으로 초기화
|
||||||
settings.rebind = 조작키 설정
|
settings.rebind = 설정
|
||||||
settings.resetKey = 조작키 설정 초기화
|
settings.resetKey = 초기화
|
||||||
settings.controls = 조작
|
settings.controls = 조작
|
||||||
settings.game = 게임
|
settings.game = 게임
|
||||||
settings.sound = 소리
|
settings.sound = 소리
|
||||||
@@ -633,14 +637,14 @@ settings.clearcampaignsaves = 캠페인 맵 초기화
|
|||||||
settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠습니까?
|
settings.clearcampaignsaves.confirm = 정말로 캠페인을 초기화하시겠습니까?
|
||||||
paused = [accent]< 일시정지 >
|
paused = [accent]< 일시정지 >
|
||||||
clear = 초기화
|
clear = 초기화
|
||||||
banned = [scarlet]차단됨
|
banned = [scarlet]금지됨
|
||||||
yes = O
|
yes = O
|
||||||
no = X
|
no = X
|
||||||
info.title = 정보
|
info.title = 정보
|
||||||
error.title = [scarlet]오류가 발생했습니다.
|
error.title = [scarlet]오류가 발생했습니다
|
||||||
error.crashtitle = 오류가 발생했습니다.
|
error.crashtitle = 오류가 발생했습니다
|
||||||
unit.nobuild = [scarlet]건설 불가
|
unit.nobuild = [scarlet]건설 불가
|
||||||
lastaccessed = [lightgray]마지막 조작: {0}
|
lastaccessed = [lightgray]마지막 접근: {0}
|
||||||
block.unknown = [lightgray]???
|
block.unknown = [lightgray]???
|
||||||
|
|
||||||
stat.description = 특성
|
stat.description = 특성
|
||||||
@@ -649,52 +653,54 @@ stat.output = 출력
|
|||||||
stat.booster = 가속
|
stat.booster = 가속
|
||||||
stat.tiles = 필요한 타일
|
stat.tiles = 필요한 타일
|
||||||
stat.affinities = 친화력
|
stat.affinities = 친화력
|
||||||
stat.powercapacity = 전력량
|
stat.powercapacity = 전력 용량
|
||||||
stat.powershot = 전력량/발
|
stat.powershot = 전력/발
|
||||||
stat.damage = 공격력
|
stat.damage = 피해량
|
||||||
stat.targetsair = 공중 공격
|
stat.targetsair = 공중 조준
|
||||||
stat.targetsground = 지상 공격
|
stat.targetsground = 지상 조준
|
||||||
stat.itemsmoved = 이동 속도
|
stat.itemsmoved = 이동 속도
|
||||||
stat.launchtime = 발사 간격
|
stat.launchtime = 출격 간격
|
||||||
stat.shootrange = 사거리
|
stat.shootrange = 사거리
|
||||||
stat.size = 크기
|
stat.size = 크기
|
||||||
stat.displaysize = 화면 크기
|
stat.displaysize = 화면 크기
|
||||||
stat.liquidcapacity = 액체 수용량
|
stat.liquidcapacity = 액체 용량
|
||||||
stat.powerrange = 전선 길이
|
stat.powerrange = 전선 길이
|
||||||
stat.linkrange = 감지 길이
|
stat.linkrange = 연결 길이
|
||||||
stat.instructions = 연산 속도
|
stat.instructions = 연산 속도
|
||||||
stat.powerconnections = 최대 연결 개수
|
stat.powerconnections = 최대 연결
|
||||||
stat.poweruse = 전력 요구량
|
stat.poweruse = 전력 요구량
|
||||||
stat.powerdamage = 전력량/피해량
|
stat.powerdamage = 전력/피해량
|
||||||
stat.itemcapacity = 자원 수용량
|
stat.itemcapacity = 자원 용량
|
||||||
stat.memorycapacity = 최대 변수 개수
|
stat.memorycapacity = 변수 용량
|
||||||
stat.basepowergeneration = 기본 발전량
|
stat.basepowergeneration = 기본 전력 발전량
|
||||||
stat.productiontime = 소요 시간
|
stat.productiontime = 소요 시간
|
||||||
stat.repairtime = 건물 완전 복구 시간
|
stat.repairtime = 건물 완전 수리 시간
|
||||||
stat.weapons = 무기
|
stat.weapons = 무기
|
||||||
stat.bullet = 탄환
|
stat.bullet = 탄환
|
||||||
stat.speedincrease = 속도 증가
|
stat.speedincrease = 속도 증가
|
||||||
stat.range = 사거리
|
stat.range = 사거리
|
||||||
stat.drilltier = 채굴 가능 자원
|
stat.drilltier = 채굴 가능
|
||||||
stat.drillspeed = 기본 채굴 속도
|
stat.drillspeed = 기본 채굴 속도
|
||||||
stat.boosteffect = 버프 효과
|
stat.boosteffect = 버프 효과
|
||||||
stat.maxunits = 최대 유닛 수
|
stat.maxunits = 최대 유닛 수
|
||||||
stat.health = 체력
|
stat.health = 체력
|
||||||
|
stat.armor = 방어력
|
||||||
stat.buildtime = 건설 시간
|
stat.buildtime = 건설 시간
|
||||||
stat.maxconsecutive = 최대 체인 길이
|
stat.maxconsecutive = 최대 체인
|
||||||
stat.buildcost = 건설 비용
|
stat.buildcost = 건설 비용
|
||||||
stat.inaccuracy = 오차각
|
stat.inaccuracy = 오차각
|
||||||
stat.shots = 발사 당 탄
|
#stat.shots = 발사 수 (안쓰임)
|
||||||
stat.reload = 발/초
|
stat.reload = 초당 발사 수
|
||||||
stat.ammo = 탄약
|
stat.ammo = 탄약
|
||||||
stat.shieldhealth = 보호막 체력
|
stat.shieldhealth = 보호막 체력
|
||||||
stat.cooldowntime = 쿨타임
|
stat.cooldowntime = 쿨타임
|
||||||
stat.explosiveness = 폭발성
|
stat.explosiveness = 폭발성
|
||||||
stat.basedeflectchance = 기본 반사 확률
|
stat.basedeflectchance = 기본 반사 확률
|
||||||
stat.lightningchance = 전격 확률
|
stat.lightningchance = 전격 확률
|
||||||
stat.lightningdamage = 전격 공격량
|
stat.lightningdamage = 전격 피해량
|
||||||
stat.flammability = 휘발성
|
stat.flammability = 인화성
|
||||||
stat.radioactivity = 방사성
|
stat.radioactivity = 방사성
|
||||||
|
stat.charge = 과충전율
|
||||||
stat.heatcapacity = 열 용량
|
stat.heatcapacity = 열 용량
|
||||||
stat.viscosity = 점성
|
stat.viscosity = 점성
|
||||||
stat.temperature = 온도
|
stat.temperature = 온도
|
||||||
@@ -702,10 +708,10 @@ stat.speed = 속도
|
|||||||
stat.buildspeed = 건설 속도
|
stat.buildspeed = 건설 속도
|
||||||
stat.minespeed = 채굴 속도
|
stat.minespeed = 채굴 속도
|
||||||
stat.minetier = 채굴 티어
|
stat.minetier = 채굴 티어
|
||||||
stat.payloadcapacity = 화물 수용량
|
stat.payloadcapacity = 화물 용량
|
||||||
stat.commandlimit = 지휘 한계
|
stat.commandlimit = 지휘 한계
|
||||||
stat.abilities = 능력
|
stat.abilities = 능력
|
||||||
stat.canboost = 부스터
|
stat.canboost = 이륙 가능
|
||||||
stat.flying = 비행
|
stat.flying = 비행
|
||||||
stat.ammouse = 탄약 사용
|
stat.ammouse = 탄약 사용
|
||||||
|
|
||||||
@@ -716,9 +722,9 @@ ability.unitspawn = {0} 공장
|
|||||||
ability.shieldregenfield = 방어막 복구 필드
|
ability.shieldregenfield = 방어막 복구 필드
|
||||||
ability.movelightning = 가속 전격
|
ability.movelightning = 가속 전격
|
||||||
|
|
||||||
bar.drilltierreq = 더 좋은 드릴이 필요
|
bar.drilltierreq = 더 좋은 드릴 필요
|
||||||
bar.noresources = 자원 부족
|
bar.noresources = 자원 부족
|
||||||
bar.corereq = 코어 필요
|
bar.corereq = 기본 코어 필요
|
||||||
bar.drillspeed = 드릴 속도: {0}/s
|
bar.drillspeed = 드릴 속도: {0}/s
|
||||||
bar.pumpspeed = 펌프 속도: {0}/s
|
bar.pumpspeed = 펌프 속도: {0}/s
|
||||||
bar.efficiency = 효율: {0}%
|
bar.efficiency = 효율: {0}%
|
||||||
@@ -734,14 +740,14 @@ bar.unitcap = {0} {1}/{2}
|
|||||||
bar.liquid = 액체
|
bar.liquid = 액체
|
||||||
bar.heat = 발열
|
bar.heat = 발열
|
||||||
bar.power = 전력
|
bar.power = 전력
|
||||||
bar.progress = 생산 진행도
|
bar.progress = 건설 진행도
|
||||||
bar.input = 입력
|
bar.input = 입력
|
||||||
bar.output = 출력
|
bar.output = 출력
|
||||||
|
|
||||||
units.processorcontrol = [lightgray]프로세서 제어 중
|
units.processorcontrol = [lightgray]프로세서 제어됨
|
||||||
|
|
||||||
bullet.damage = [stat]{0}[lightgray] 데미지
|
bullet.damage = [stat]{0}[lightgray] 피해량
|
||||||
bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~ [stat] {1}[lightgray] 타일
|
bullet.splashdamage = [stat]{0}[lightgray] 범위 피해량 ~ [stat] {1}[lightgray] 타일
|
||||||
bullet.incendiary = [stat]방화
|
bullet.incendiary = [stat]방화
|
||||||
bullet.sapping = [stat]흡혈
|
bullet.sapping = [stat]흡혈
|
||||||
bullet.homing = [stat]유도
|
bullet.homing = [stat]유도
|
||||||
@@ -749,7 +755,7 @@ bullet.shock = [stat]전격
|
|||||||
bullet.frag = [stat]파편
|
bullet.frag = [stat]파편
|
||||||
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량
|
bullet.buildingdamage = [stat]{0}%[lightgray] 건물 피해량
|
||||||
bullet.knockback = [stat]{0}[lightgray] 넉백
|
bullet.knockback = [stat]{0}[lightgray] 넉백
|
||||||
bullet.pierce = [stat]{0}[lightgray]배 관통
|
bullet.pierce = [stat]{0}[lightgray]번 관통
|
||||||
bullet.infinitepierce = [stat]관통
|
bullet.infinitepierce = [stat]관통
|
||||||
bullet.healpercent = [stat]{0}[lightgray]% 회복
|
bullet.healpercent = [stat]{0}[lightgray]% 회복
|
||||||
bullet.freezing = [stat]빙결
|
bullet.freezing = [stat]빙결
|
||||||
@@ -761,7 +767,7 @@ unit.blocks = 블록
|
|||||||
unit.blockssquared = 블록²
|
unit.blockssquared = 블록²
|
||||||
unit.powersecond = 전력/초
|
unit.powersecond = 전력/초
|
||||||
unit.liquidsecond = 액체/초
|
unit.liquidsecond = 액체/초
|
||||||
unit.itemssecond = 개/초
|
unit.itemssecond = 자원/초
|
||||||
unit.liquidunits = 액체
|
unit.liquidunits = 액체
|
||||||
unit.powerunits = 전력
|
unit.powerunits = 전력
|
||||||
unit.degrees = 도
|
unit.degrees = 도
|
||||||
@@ -777,19 +783,20 @@ unit.thousands = k
|
|||||||
unit.millions = m
|
unit.millions = m
|
||||||
unit.billions = b
|
unit.billions = b
|
||||||
unit.pershot = /발
|
unit.pershot = /발
|
||||||
category.purpose = 기능 / 목적
|
category.purpose = 목적
|
||||||
category.general = 일반
|
category.general = 일반
|
||||||
category.power = 전력
|
category.power = 전력
|
||||||
category.liquids = 액체
|
category.liquids = 액체
|
||||||
category.items = 자원
|
category.items = 자원
|
||||||
category.crafting = 입력/출력
|
category.crafting = 입력/출력
|
||||||
category.function = 기능
|
category.function = 기능
|
||||||
category.optional = 보조 자원
|
category.optional = 선택적 향상
|
||||||
setting.landscape.name = 가로화면 잠금
|
setting.landscape.name = 가로화면 잠금
|
||||||
setting.shadows.name = 그림자
|
setting.shadows.name = 그림자
|
||||||
setting.blockreplace.name = 자동 블록 제안
|
setting.blockreplace.name = 자동 블록 제안
|
||||||
setting.linear.name = 선형 필터링
|
setting.linear.name = 선형 필터링
|
||||||
setting.hints.name = 힌트
|
setting.hints.name = 힌트 표시
|
||||||
|
setting.logichints.name = 로직 힌트 표시
|
||||||
setting.flow.name = 자원 흐름량 표시
|
setting.flow.name = 자원 흐름량 표시
|
||||||
setting.backgroundpause.name = 백그라운드에서 일시정지
|
setting.backgroundpause.name = 백그라운드에서 일시정지
|
||||||
setting.buildautopause.name = 건설 자동 일시정지
|
setting.buildautopause.name = 건설 자동 일시정지
|
||||||
@@ -813,14 +820,14 @@ setting.difficulty.hard = 혼돈
|
|||||||
setting.difficulty.insane = 박멸
|
setting.difficulty.insane = 박멸
|
||||||
setting.difficulty.name = 난이도:
|
setting.difficulty.name = 난이도:
|
||||||
setting.screenshake.name = 화면 흔들림
|
setting.screenshake.name = 화면 흔들림
|
||||||
setting.effects.name = 효과 보임
|
setting.effects.name = 효과 표시
|
||||||
setting.destroyedblocks.name = 파괴된 블록 표시
|
setting.destroyedblocks.name = 파괴된 블록 표시
|
||||||
setting.blockstatus.name = 블록 상태 표시
|
setting.blockstatus.name = 블록 상태 표시
|
||||||
setting.conveyorpathfinding.name = 컨베이어를 배치할 때 자동으로 경로 찾기
|
setting.conveyorpathfinding.name = 컨베이어 배치 길찾기
|
||||||
setting.sensitivity.name = 컨트롤러 감도
|
setting.sensitivity.name = 컨트롤러 감도
|
||||||
setting.saveinterval.name = 저장 간격
|
setting.saveinterval.name = 저장 간격
|
||||||
setting.seconds = {0}초
|
setting.seconds = {0}초
|
||||||
setting.milliseconds = {0}ms
|
setting.milliseconds = {0} 밀리초
|
||||||
setting.fullscreen.name = 전체 화면
|
setting.fullscreen.name = 전체 화면
|
||||||
setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다)
|
setting.borderlesswindow.name = 테두리 없는 창 모드[lightgray] (재시작이 필요할 수 있습니다)
|
||||||
setting.fps.name = FPS와 핑 표시
|
setting.fps.name = FPS와 핑 표시
|
||||||
@@ -838,7 +845,7 @@ setting.sfxvol.name = 효과음 크기
|
|||||||
setting.mutesound.name = 소리 끄기
|
setting.mutesound.name = 소리 끄기
|
||||||
setting.crashreport.name = 익명으로 오류 보고서 자동 전송
|
setting.crashreport.name = 익명으로 오류 보고서 자동 전송
|
||||||
setting.savecreate.name = 자동 저장 활성화
|
setting.savecreate.name = 자동 저장 활성화
|
||||||
setting.publichost.name = 멀티플레이 공용 서버로 표시
|
setting.publichost.name = 공용 서버로 표시
|
||||||
setting.playerlimit.name = 플레이어 제한
|
setting.playerlimit.name = 플레이어 제한
|
||||||
setting.chatopacity.name = 채팅창 투명도
|
setting.chatopacity.name = 채팅창 투명도
|
||||||
setting.lasersopacity.name = 전선 투명도
|
setting.lasersopacity.name = 전선 투명도
|
||||||
@@ -858,7 +865,7 @@ category.view.name = 보기
|
|||||||
category.multiplayer.name = 멀티플레이어
|
category.multiplayer.name = 멀티플레이어
|
||||||
category.blocks.name = 블록 선택
|
category.blocks.name = 블록 선택
|
||||||
command.attack = 공격
|
command.attack = 공격
|
||||||
command.rally = 순찰
|
command.rally = 집결
|
||||||
command.retreat = 후퇴
|
command.retreat = 후퇴
|
||||||
command.idle = 대기
|
command.idle = 대기
|
||||||
placement.blockselectkeys = \n[lightgray]단축키: [{0},
|
placement.blockselectkeys = \n[lightgray]단축키: [{0},
|
||||||
@@ -874,13 +881,13 @@ keybind.move_x.name = X축 이동
|
|||||||
keybind.move_y.name = Y축 이동
|
keybind.move_y.name = Y축 이동
|
||||||
keybind.mouse_move.name = 커서를 따라서 이동
|
keybind.mouse_move.name = 커서를 따라서 이동
|
||||||
keybind.pan.name = 펜 보기
|
keybind.pan.name = 펜 보기
|
||||||
keybind.boost.name = 비행
|
keybind.boost.name = 이륙
|
||||||
keybind.schematic_select.name = 영역 설정
|
keybind.schematic_select.name = 영역 설정
|
||||||
keybind.schematic_menu.name = 설계도 메뉴
|
keybind.schematic_menu.name = 설계도 메뉴
|
||||||
keybind.schematic_flip_x.name = 설계도 X축 뒤집기
|
keybind.schematic_flip_x.name = 설계도 X축 뒤집기
|
||||||
keybind.schematic_flip_y.name = 설계도 Y축 뒤집기
|
keybind.schematic_flip_y.name = 설계도 Y축 뒤집기
|
||||||
keybind.category_prev.name = 이전 목록
|
keybind.category_prev.name = 이전 카테고리
|
||||||
keybind.category_next.name = 다음 목록
|
keybind.category_next.name = 다음 카테고리
|
||||||
keybind.block_select_left.name = 블록 왼쪽 선택
|
keybind.block_select_left.name = 블록 왼쪽 선택
|
||||||
keybind.block_select_right.name = 블록 오른쪽 선택
|
keybind.block_select_right.name = 블록 오른쪽 선택
|
||||||
keybind.block_select_up.name = 블록 위쪽 선택
|
keybind.block_select_up.name = 블록 위쪽 선택
|
||||||
@@ -905,7 +912,7 @@ keybind.pickupCargo.name = 화물 집기
|
|||||||
keybind.dropCargo.name = 화물 내려놓기
|
keybind.dropCargo.name = 화물 내려놓기
|
||||||
keybind.command.name = 명령
|
keybind.command.name = 명령
|
||||||
keybind.shoot.name = 사격
|
keybind.shoot.name = 사격
|
||||||
keybind.zoom.name = 확대
|
keybind.zoom.name = 확대/축소
|
||||||
keybind.menu.name = 메뉴
|
keybind.menu.name = 메뉴
|
||||||
keybind.pause.name = 일시중지
|
keybind.pause.name = 일시중지
|
||||||
keybind.pause_building.name = 건설 일시정지/재개
|
keybind.pause_building.name = 건설 일시정지/재개
|
||||||
@@ -922,13 +929,13 @@ keybind.chat_history_prev.name = 이전 채팅 기록
|
|||||||
keybind.chat_history_next.name = 다음 채팅 기록
|
keybind.chat_history_next.name = 다음 채팅 기록
|
||||||
keybind.chat_scroll.name = 채팅 스크롤
|
keybind.chat_scroll.name = 채팅 스크롤
|
||||||
keybind.chat_mode = 대화 대상 변경
|
keybind.chat_mode = 대화 대상 변경
|
||||||
keybind.drop_unit.name = 유닛 떨구기
|
keybind.drop_unit.name = 유닛 내려놓기
|
||||||
keybind.zoom_minimap.name = 미니맵 확대
|
keybind.zoom_minimap.name = 미니맵 확대
|
||||||
mode.help.title = 모드 설명
|
mode.help.title = 모드 설명
|
||||||
mode.survival.name = 생존
|
mode.survival.name = 생존
|
||||||
mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적의 스폰지점이 필요합니다.
|
mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적의 스폰지점이 필요합니다.
|
||||||
mode.sandbox.name = 샌드박스
|
mode.sandbox.name = 샌드박스
|
||||||
mode.sandbox.description = 무한한 자원이 있으며, 단계 타이머가 없습니다.
|
mode.sandbox.description = 무한한 자원이 있으며, 시간 제한이 없습니다.
|
||||||
mode.editor.name = 편집기
|
mode.editor.name = 편집기
|
||||||
mode.pvp.name = PvP
|
mode.pvp.name = PvP
|
||||||
mode.pvp.description = 다른 플레이어와 현장에서 싸우십시오.\n[gray]플레이하려면 맵에 다른 색상의 코어가 2개 이상 있어야 합니다.
|
mode.pvp.description = 다른 플레이어와 현장에서 싸우십시오.\n[gray]플레이하려면 맵에 다른 색상의 코어가 2개 이상 있어야 합니다.
|
||||||
@@ -941,7 +948,7 @@ rules.reactorexplosions = 원자로 폭발 허용
|
|||||||
rules.coreincinerates = 코어 방화 비허용
|
rules.coreincinerates = 코어 방화 비허용
|
||||||
rules.schematic = 설계도 허용
|
rules.schematic = 설계도 허용
|
||||||
rules.wavetimer = 시간 제한이 있는 단계
|
rules.wavetimer = 시간 제한이 있는 단계
|
||||||
rules.waves = 일반 단계
|
rules.waves = 단계
|
||||||
rules.attack = 공격 모드
|
rules.attack = 공격 모드
|
||||||
rules.buildai = AI 건설
|
rules.buildai = AI 건설
|
||||||
rules.enemyCheat = 무한 AI (빨간팀) 자원
|
rules.enemyCheat = 무한 AI (빨간팀) 자원
|
||||||
@@ -950,26 +957,28 @@ rules.blockdamagemultiplier = 블록 공격력 배수
|
|||||||
rules.unitbuildspeedmultiplier = 유닛 생산 속도 배수
|
rules.unitbuildspeedmultiplier = 유닛 생산 속도 배수
|
||||||
rules.unithealthmultiplier = 유닛 체력 배수
|
rules.unithealthmultiplier = 유닛 체력 배수
|
||||||
rules.unitdamagemultiplier = 유닛 공격력 배수
|
rules.unitdamagemultiplier = 유닛 공격력 배수
|
||||||
|
rules.unitcapvariable = 코어 유닛 제한 추가
|
||||||
|
rules.unitcap = 기본 유닛 제한
|
||||||
rules.enemycorebuildradius = 적 코어 건설 금지구역 범위:[lightgray] (타일)
|
rules.enemycorebuildradius = 적 코어 건설 금지구역 범위:[lightgray] (타일)
|
||||||
rules.wavespacing = 단계 간격:[lightgray] (초)
|
rules.wavespacing = 단계 간격:[lightgray] (초)
|
||||||
rules.buildcostmultiplier = 건설 자원소모 배수
|
rules.buildcostmultiplier = 건설 비용 배수
|
||||||
rules.buildspeedmultiplier = 건설 속도 배수
|
rules.buildspeedmultiplier = 건설 속도 배수
|
||||||
rules.deconstructrefundmultiplier = 해체 환불 배수
|
rules.deconstructrefundmultiplier = 철거 환불 배수
|
||||||
rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기
|
rules.waitForWaveToEnd = 한 단계가 끝날때까지 대기
|
||||||
rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일)
|
rules.dropzoneradius = 스폰 구역 범위: [lightgray] (타일)
|
||||||
rules.unitammo = 탄약 필요
|
rules.unitammo = 유닛 탄약 필요
|
||||||
rules.title.waves = 단계
|
rules.title.waves = 단계
|
||||||
rules.title.resourcesbuilding = 자원 & 건축
|
rules.title.resourcesbuilding = 자원 & 건축
|
||||||
rules.title.enemy = 적
|
rules.title.enemy = 적
|
||||||
rules.title.unit = 유닛
|
rules.title.unit = 유닛
|
||||||
rules.title.experimental = 실험적인 기능
|
rules.title.experimental = 실험적인 기능
|
||||||
rules.title.environment = 환경
|
rules.title.environment = 환경
|
||||||
rules.lighting = 조명
|
rules.lighting = 조명 표시
|
||||||
rules.enemyLights = 상대에게 조명 표시
|
rules.enemyLights = 상대에게 조명 표시
|
||||||
rules.fire = 방화
|
rules.fire = 방화 허용
|
||||||
rules.explosions = 블록/유닛 폭발 데미지
|
rules.explosions = 블록/유닛 폭발 데미지
|
||||||
rules.ambientlight = 자연 조명 표시
|
rules.ambientlight = 자연 조명 표시
|
||||||
rules.weather = 날씨
|
rules.weather = 날씨 추가
|
||||||
rules.weather.frequency = 빈도:
|
rules.weather.frequency = 빈도:
|
||||||
rules.weather.always = 항상
|
rules.weather.always = 항상
|
||||||
rules.weather.duration = 지속 시간:
|
rules.weather.duration = 지속 시간:
|
||||||
@@ -1038,8 +1047,8 @@ unit.corvus.name = 코르버스
|
|||||||
block.resupply-point.name = 보급 지점
|
block.resupply-point.name = 보급 지점
|
||||||
block.parallax.name = 패럴랙스
|
block.parallax.name = 패럴랙스
|
||||||
block.cliff.name = 언덕
|
block.cliff.name = 언덕
|
||||||
block.sand-boulder.name = 사암
|
block.sand-boulder.name = 사암 바위
|
||||||
block.basalt-boulder.name = 현무암
|
block.basalt-boulder.name = 현무암 바위
|
||||||
block.grass.name = 잔디
|
block.grass.name = 잔디
|
||||||
block.slag.name = 용암
|
block.slag.name = 용암
|
||||||
block.space.name = 우주
|
block.space.name = 우주
|
||||||
@@ -1264,19 +1273,19 @@ team.purple.name = 보라색 팀
|
|||||||
|
|
||||||
hint.skip = 힌트 넘기기
|
hint.skip = 힌트 넘기기
|
||||||
hint.desktopMove = [accent][[WASD][] 키를 이용해 자신의 유닛을 조종하세요.
|
hint.desktopMove = [accent][[WASD][] 키를 이용해 자신의 유닛을 조종하세요.
|
||||||
hint.zoom = [accent]마우스 스크롤[]를 사용해 확대 또는 축소가 가능합니다.
|
hint.zoom = [accent]마우스 스크롤[]을 사용해 확대 또는 축소가 가능합니다.
|
||||||
hint.mine = \uf8c4 주변의 구리광석을 수동으로 채굴하려면 광석을 [accent]누르십시오[]. (추가설명)마우스가 있을 경우 마우스 오른쪽 클릭을 하면 채굴 중단이 가능합니다.
|
hint.mine =\uf8c4 주변의 구리 광석을 수동으로 채굴하려면 광석을 [accent]누르십시오[]. (추가 설명) 마우스가 있으면 마우스 오른쪽 클릭을 하면 채굴 중단이 가능합니다.
|
||||||
hint.desktopShoot = [accent][[마우스 왼클릭][]으로 발사할수 있습니다.
|
hint.desktopShoot = [accent][[마우스 좌클릭][]으로 발사할 수 있습니다.
|
||||||
hint.depositItems = 자원을 코어로 옮기려면, 당신의 기체의 자원을 코어로 끌어놓으세요.
|
hint.depositItems = 자원을 코어로 옮기려면, 기체의 자원을 코어로 끌어놓으세요.
|
||||||
hint.respawn = 당신의 기체를 떠나려면 [accent][[V][]를 누르십시오.
|
hint.respawn = 기체를 떠나려면 [accent][[V][]를 누르십시오.
|
||||||
hint.respawn.mobile = 당신은 유닛 혹은 포탑을 조종할 수 있습니다. 당신의 기체를 떠나려면 [accent]왼쪽 위에 있는 아바타를 누르십시오.[]
|
hint.respawn.mobile = 유닛 혹은 포탑을 조종할 수 있습니다. 기체를 떠나려면 [accent]왼쪽 위에 있는 아바타를 누르십시오.[]
|
||||||
hint.desktopPause = 게임을 일시 정지/재시작하기 위해 [accent][[Space][]를 누르십시오.
|
hint.desktopPause = 게임을 일시 정지/재시작하기 위해 [accent][[Space][]를 누르십시오.
|
||||||
hint.placeDrill = 드릴을 설치하려면 오른쪽 아래의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[]을 선택해서 구리 광석 위를 누르십시오.
|
hint.placeDrill = 드릴을 설치하려면 오른쪽 아래의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[]을 선택해서 구리 광석 위를 누르십시오.
|
||||||
hint.placeDrill.mobile = 오른쪽 아래 메뉴의 \ue85e [accent]드릴[]을 선택하고, \uf870 [accent]드릴[] 를 선택해서 구리 광석 위를 누르십시오.\n\n설치를 완료하려면 오른쪽 아래의 \ue800 [accent]완료 버튼[]을 누르십시오.
|
hint.placeDrill.mobile = 오른쪽 아래 메뉴의 \ue85e [accent] 드릴[]을 선택하고, \uf870 [accent]드릴[]을 선택해서 구리 광석 위를 누르십시오.\n\n설치를 완료하려면 오른쪽 아래의 \ue800 [accent]완료 버튼[]을 누르십시오.
|
||||||
hint.placeConveyor = 컨베이어는 자원을 드릴에서 다른 블록으로 이동시켜줍니다. \ue814 [accent]분배[] 카테고리에서 \uf896 [accent]컨베이어[]를 선택하십시오.\n\n클릭하거나 드래그로 다수의 컨베이어를 설치할 수 있습니다.\n클릭하고 놓지 않은 채로 마우스 [accent]휠을 돌리면 돌아갑니다.
|
hint.placeConveyor = 컨베이어는 자원을 드릴에서 다른 블록으로 이동시켜줍니다. \ue814 [accent]분배[] 카테고리에서 \uf896 [accent]컨베이어[]를 선택하십시오.\n\n클릭하거나 드래그로 다수의 컨베이어를 설치할 수 있습니다.\n클릭하고 놓지 않은 채로 마우스 [accent]휠을 돌리면 돌아갑니다.
|
||||||
hint.placeConveyor.mobile = 컨베이어는 자원을 드릴에서 다른 블록으로 이동시켜줍니다. \ue814 [accent]분배[] 카테고리에서 \uf896 [accent]컨베이어[]를 선택하십시오.\n\n여러 개의 컨베이어를 놓으려면 손가락으로 누른 채로 끌어서 설치 범위를 지정하십시오.
|
hint.placeConveyor.mobile = 컨베이어는 자원을 드릴에서 다른 블록으로 이동시켜줍니다. \ue814 [accent]분배[] 카테고리에서 \uf896 [accent]컨베이어[]를 선택하십시오.\n\n여러 개의 컨베이어를 놓으려면 손가락으로 누른 채로 끌어서 설치 범위를 지정하십시오.
|
||||||
hint.placeTurret = 적에게서 당신의 기지를 막아내려면 \uf861 [accent]포탑[]를 설치하십시오.\n\n포탑 탄약 필요 - 지금은 \uf838 구리가 필요합니다.\n컨베이어를 사용해 드릴에 구리를 공급하십시오.
|
hint.placeTurret = 적에게서 기지를 막아내려면 \uf861 [accent]포탑[]를 설치하십시오.\n\n포탑 탄약 필요 - 지금은 \uf838 구리가 필요합니다.\n컨베이어를 사용해 드릴에 구리를 공급하십시오.
|
||||||
hint.breaking = 블록을 부수려면 [accent]오른클릭[]이나 드래그를 하십시오.
|
hint.breaking = 블록을 부수려면 [accent]우클릭[]이나 드래그를 하십시오.
|
||||||
hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오.
|
hint.breaking.mobile = 블록을 부수려면 오른쪽 아래의 \ue817 [accent]망치[]를 눌러 해체 모드를 활성화하십시오.\n\n손가락으로 누른 채로 끌어서 해체 범위를 지정하십시오.
|
||||||
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
|
hint.research = 새 기술을 연구하려면 \ue875 [accent]연구[]버튼을 누르십시오.
|
||||||
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
|
hint.research.mobile = 새 기술을 연구하려면 \ue88c [accent]메뉴[] 아래의 \ue875 [accent]연구[]버튼을 누르십시오.
|
||||||
@@ -1287,7 +1296,7 @@ hint.launch.mobile = 충분한 자원을 모았으면, 오른쪽 아래의 \ue88
|
|||||||
hint.schematicSelect = 블록을 복사하고 붙여넣으려면 [accent][[F][]를 누른 채로 끌어서 구역을 지정하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다.
|
hint.schematicSelect = 블록을 복사하고 붙여넣으려면 [accent][[F][]를 누른 채로 끌어서 구역을 지정하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다.
|
||||||
hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다.
|
hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다.
|
||||||
hint.conveyorPathfind.mobile = \ue844 [accent]diagonal mode[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다.
|
hint.conveyorPathfind.mobile = \ue844 [accent]diagonal mode[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다.
|
||||||
hint.boost = 당신의 유닛과 같이 장애물을 넘어가려면 [accent][[L-Shift][]을 누르고 이동하십시오. \n\n 적은 수의 지상 유닛만 날 수 있습니다.
|
hint.boost = 유닛과 같이 장애물을 넘어가려면 [accent][[L-Shift][]을 누르고 이동하십시오. \n\n 적은 수의 지상 유닛만 날 수 있습니다.
|
||||||
hint.command = 주변의 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent][[G][]를 누르십시오. \n\n 지상 유닛을 데리고 다니기 위해서는 먼저 다른 지상 유닛을 조종하고 있어야 합니다.
|
hint.command = 주변의 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent][[G][]를 누르십시오. \n\n 지상 유닛을 데리고 다니기 위해서는 먼저 다른 지상 유닛을 조종하고 있어야 합니다.
|
||||||
hint.command.mobile = 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent]빠르게 두 번 누르십시오[].
|
hint.command.mobile = 아군 유닛을 데리고 다니려면 비슷한 단계의 유닛 무리 주변에서 [accent]빠르게 두 번 누르십시오[].
|
||||||
hint.payloadPickup = 작은 블록이나 유닛을 집으려면 [accent][[[]를 누르십시오.
|
hint.payloadPickup = 작은 블록이나 유닛을 집으려면 [accent][[[]를 누르십시오.
|
||||||
@@ -1297,10 +1306,10 @@ hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 [accent]화
|
|||||||
hint.waveFire = [accent]Wave[]포탑에 탄약으로 물을 넣으면 주변의 불을 자동으로 꺼줍니다.
|
hint.waveFire = [accent]Wave[]포탑에 탄약으로 물을 넣으면 주변의 불을 자동으로 꺼줍니다.
|
||||||
hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]Power Nodes[]를 사용하십시오.
|
hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]Power Nodes[]를 사용하십시오.
|
||||||
hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오.
|
hint.guardian = [accent]수호자[] 유닛들은 방어력을 가집니다. [accent]구리[]와 [accent]납[] 같은 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n그런 수호자를 없애려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오.
|
||||||
hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오.
|
hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치함[]으로써 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지도 확인하십시오.
|
||||||
hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다.
|
hint.presetLaunch = [accent]얼어붙은 숲[]과 같은 회색[accent]캠페인 지역[]은 어디에서나 출격해서 올 수 있습니다. 주변 지역을 점령하지 않아도 됩니다.\n\n이와 같은 [accent]네임드 지역[]들은 [accent]선택적[]입니다.
|
||||||
hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다.
|
hint.coreIncinerate = 코어가 자원으로 가득 찬 후에 받는 모든 자원들은 [accent]소각[]될 것입니다.
|
||||||
hint.coopCampaign = [accent]협동 캠페인[]을 할 떄, 현재 맵에서 생산된 자원들은 [accent]당신의 캠페인 지역으로[]도 보내집니다.\n\n호스트가 새로 해금한 모든 것들도 가져갑니다.
|
hint.coopCampaign = [accent]협동 캠페인[]을 할 때, 현재 맵에서 생산된 자원들은 [accent]캠페인 지역[]으로도 보내집니다.\n\n호스트가 새로 해금한 모든 것들도 가져갑니다.
|
||||||
|
|
||||||
item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다.
|
item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다.
|
||||||
item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다.
|
item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포합니다. 별다른 보강재 없이는 구조적 문제 때문에 내구성이 비교적 약합니다.
|
||||||
@@ -1317,9 +1326,9 @@ 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 = 최첨단 전자 제품과 자가 수리 기술에 사용되는 거의 무중력에 가까운 물질입니다.
|
||||||
item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금.
|
item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금.
|
||||||
item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다.
|
item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물과 연료로 전환하는 데 사용됩니다.
|
||||||
item.spore-pod.details = 포자. 유기적인 생명체로 판단된다. 타 유기체에 치명적인 독가스를 내뿜는다. 침입성이 매우 강하다. 특정 조건에서 강력한 인화성을 보입니다.
|
item.spore-pod.details = 포자. 유기적인 생명체로 판단된다. 타 유기체에 치명적인 독가스를 내뿜는다. 침입성이 매우 강하다. 특정 조건에서 강력한 인화성을 보입니다.
|
||||||
item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다.
|
item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다.
|
||||||
item.pyratite.description = 소이 무기에서 사용되는 가연성 매우 높은 물질.
|
item.pyratite.description = 소이 무기에서 사용되는 가연성 매우 높은 물질.
|
||||||
@@ -1329,14 +1338,14 @@ 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 = 아군 간의 소통을 위한 메시지를 저장합니다.
|
||||||
block.graphite-press.description = 석탄을 흑연으로 압축합니다.
|
block.graphite-press.description = 석탄을 흑연으로 압축합니다.
|
||||||
block.multi-press.description = 석탄을 흑연으로 압축합니다. 냉각수로써 물이 필요합니다.
|
block.multi-press.description = 석탄을 흑연으로 압축합니다. 냉각수로써 물이 필요합니다.
|
||||||
block.silicon-smelter.description = 석탄과 모래로부터 실리콘을 정제합니다.
|
block.silicon-smelter.description = 석탄과 모래로부터 실리콘을 정제합니다.
|
||||||
block.kiln.description = 모래와 납을 강화 유리로 재련합니다.
|
block.kiln.description = 모래와 납을 강화 유리로 제련합니다.
|
||||||
block.plastanium-compressor.description = 석유와 티타늄으로 플라스터늄을 생산합니다.
|
block.plastanium-compressor.description = 석유와 티타늄으로 플라스터늄을 생산합니다.
|
||||||
block.phase-weaver.description = 토륨과 모래로 메타를 합성합니다.
|
block.phase-weaver.description = 토륨과 모래로 메타를 합성합니다.
|
||||||
block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리를 결합하여 설금을 생산합니다.
|
block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리를 결합하여 설금을 생산합니다.
|
||||||
@@ -1349,7 +1358,7 @@ block.spore-press.description = 포자를 석유로 압축합니다.
|
|||||||
block.pulverizer.description = 고철을 갈아 모래로 만듭니다.
|
block.pulverizer.description = 고철을 갈아 모래로 만듭니다.
|
||||||
block.coal-centrifuge.description = 석유에서 석탄을 추출합니다.
|
block.coal-centrifuge.description = 석유에서 석탄을 추출합니다.
|
||||||
block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다.
|
block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다.
|
||||||
block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용.
|
block.power-void.description = 입력된 모든 전력을 무효로 합니다. 샌드박스 전용.
|
||||||
block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용.
|
block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용.
|
||||||
block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용.
|
block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용.
|
||||||
block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용.
|
block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용.
|
||||||
@@ -1363,8 +1372,8 @@ block.plastanium-wall.description = 전격 공격을 흡수하고 전력 노드
|
|||||||
block.plastanium-wall-large.description = 전격 공격을 흡수하고 전력 노드의 자동 연결을 차단하는 특수 유형의 벽.\n여러 타일을 차지합니다.
|
block.plastanium-wall-large.description = 전격 공격을 흡수하고 전력 노드의 자동 연결을 차단하는 특수 유형의 벽.\n여러 타일을 차지합니다.
|
||||||
block.thorium-wall.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.
|
block.thorium-wall.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.
|
||||||
block.thorium-wall-large.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.\n여러 타일을 차지합니다.
|
block.thorium-wall-large.description = 강력한 방어 블록.\n적으로부터 적절한 보호를 할 수 있습니다.\n여러 타일을 차지합니다.
|
||||||
block.phase-wall.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사시킵니다.
|
block.phase-wall.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사합니다.
|
||||||
block.phase-wall-large.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사시킵니다.\n여러 타일을 차지합니다.
|
block.phase-wall-large.description = 특수 메타기반 반사 화합물로 코팅된 벽. 총알 대부분을 반사합니다.\n여러 타일을 차지합니다.
|
||||||
block.surge-wall.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.
|
block.surge-wall.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.
|
||||||
block.surge-wall-large.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.\n여러 타일을 차지합니다.
|
block.surge-wall-large.description = 내구성이 매우 강한 방어 블록.\n총탄이 날아오면 충전량을 높여 무작위로 방출합니다.\n여러 타일을 차지합니다.
|
||||||
block.door.description = 작은 문. 탭 하여 열거나 닫을 수 있습니다.
|
block.door.description = 작은 문. 탭 하여 열거나 닫을 수 있습니다.
|
||||||
@@ -1388,13 +1397,13 @@ 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 = 가장 강력한 펌프.
|
||||||
block.conduit.description = 기본 액체 운송 블록. 액체를 앞으로 이동시킵니다. 펌프 및 기타 파이프와 함께 사용됩니다.
|
block.conduit.description = 기본 액체 운송 블록. 액체를 앞으로 이동시킵니다. 펌프 및 기타 파이프와 함께 사용됩니다.
|
||||||
block.pulse-conduit.description = 고급 액체 운송 블록. 액체를 더 빠르게 운반하고 표준 파이프보다 더 많이 저장합니다.
|
block.pulse-conduit.description = 고급 액체 운송 블록. 액체를 더 빠르게 운반하고 표준 파이프보다 더 많이 저장합니다.
|
||||||
block.plated-conduit.description = 펄스 파이프와 같은 속도로 이동하지만 더 높은 방어력을 가지고 있습니다. 측면에서 액체들을 받아들이지 않습니다.\n액체가 누설하지 않습니다.
|
block.plated-conduit.description = 펄스 파이프와 같은 속도로 이동하지만 더 높은 방어력을 가지고 있습니다. 측면에서 액체들을 받아들이지 않습니다.\n액체가 누설하지 않습니다.
|
||||||
block.liquid-router.description = 한 방향에서 액체를 받아 최대 3개의 다른 방향으로 동일하게 출력합니다. 일정량의 액체를 저장할 수도 있으며 한 소스에서 여러 대상으로 액체를 분할하는 데 유용합니다.
|
block.liquid-router.description = 한 방향에서 액체를 받아 최대 3개의 다른 방향으로 같이 출력합니다. 일정량의 액체를 저장할 수도 있으며 한 소스에서 여러 대상으로 액체를 나누는 데 유용합니다.
|
||||||
block.liquid-tank.description = 대량의 액체를 저장합니다. 재료가 일정하지 않은 상황에서 버퍼를 생성하거나 중요한 블록을 냉각하기 위한 보호 장치로 사용하세요.
|
block.liquid-tank.description = 대량의 액체를 저장합니다. 재료가 일정하지 않은 상황에서 버퍼를 생성하거나 중요한 블록을 냉각하기 위한 보호 장치로 사용하세요.
|
||||||
block.liquid-junction.description = 두 개의 교차 파이프를 위한 다리 역할을 합니다. 다른 액체를 다른 위치로 운반하는 두 개의 다른 파이프가 있는 상황에서 유용합니다.
|
block.liquid-junction.description = 두 개의 교차 파이프를 위한 다리 역할을 합니다. 다른 액체를 다른 위치로 운반하는 두 개의 다른 파이프가 있는 상황에서 유용합니다.
|
||||||
block.bridge-conduit.description = 고급 액체 운송 블록. 지형이나 건물을 넘어 최대 3개 타일 위로 액체를 운반할 수 있습니다.
|
block.bridge-conduit.description = 고급 액체 운송 블록. 지형이나 건물을 넘어 최대 3개 타일 위로 액체를 운반할 수 있습니다.
|
||||||
@@ -1403,7 +1412,7 @@ block.power-node.description = 연결된 노드에 전력을 전송합니다.
|
|||||||
block.power-node-large.description = 더 넓은 범위의 고급 전력 노드.
|
block.power-node-large.description = 더 넓은 범위의 고급 전력 노드.
|
||||||
block.surge-tower.description = 사용 가능한 연결 수가 적은 장거리 전력 노드.
|
block.surge-tower.description = 사용 가능한 연결 수가 적은 장거리 전력 노드.
|
||||||
block.diode.description = 배터리 전력은 이 블록을 통해 한 방향으로만 흐를 수 있지만, 출력 방향 배터리의 전력이 더 적은 경우에만 가능합니다.
|
block.diode.description = 배터리 전력은 이 블록을 통해 한 방향으로만 흐를 수 있지만, 출력 방향 배터리의 전력이 더 적은 경우에만 가능합니다.
|
||||||
block.battery.description = 전기가 넘쳐날 때 전력을 저장할 수 있습니다. 전력에 적자가 발생할 때 전력을 출력합니다.
|
block.battery.description = 전력이 넘쳐날 때 저장할 수 있습니다. 전력에 적자가 발생할 때 전력을 출력합니다.
|
||||||
block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다.
|
block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다.
|
||||||
block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소 시켜 전력을 생산합니다.
|
block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소 시켜 전력을 생산합니다.
|
||||||
block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다.
|
block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다.
|
||||||
@@ -1416,7 +1425,7 @@ 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 = 최상위 드릴. 많은 양의 전력이 필요합니다.
|
||||||
block.water-extractor.description = 지하수를 추출합니다. 물을 구하기 어려운 곳에서 사용합니다.
|
block.water-extractor.description = 지하수를 추출합니다. 물을 구하기 어려운 곳에서 사용합니다.
|
||||||
block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 포자로 배양합니다.
|
block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 포자로 배양합니다.
|
||||||
@@ -1430,33 +1439,33 @@ block.core-nucleus.description = 기지의 핵심입니다. 방어력이 매우
|
|||||||
block.core-nucleus.details = 세 번째, 궁극의 버전.
|
block.core-nucleus.details = 세 번째, 궁극의 버전.
|
||||||
block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다.
|
block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다.
|
||||||
block.container.description = 각 유형의 자원을 소량 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다.
|
block.container.description = 각 유형의 자원을 소량 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다.
|
||||||
block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다.
|
block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있습니다.
|
||||||
block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다.
|
block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다.
|
||||||
block.duo.description = 적에게 탄환을 교대하며 발사합니다.
|
block.duo.description = 적에게 탄환을 교대하며 발사합니다.
|
||||||
block.scatter.description = 적군에게 납, 고철, 또는 강화 유리 조각 덩어리를 발사합니다.
|
block.scatter.description = 적군에게 납, 고철, 또는 강화 유리 조각 덩어리를 발사합니다.
|
||||||
block.scorch.description = 주변의 모든 지상 적을 불태웁니다. 근거리에서 매우 효과적입니다.
|
block.scorch.description = 주변의 모든 지상 적을 불태웁니다. 근거리에서 매우 효과적입니다.
|
||||||
block.hail.description = 장거리에 걸쳐 지상 적에게 작은 포탄을 발사합니다.
|
block.hail.description = 장거리에 걸쳐 지상 적에게 작은 포탄을 발사합니다.
|
||||||
block.wave.description = 적에게 액체 줄기를 발사합니다. 물이 공급되면 자동으로 화재를 진압합니다.
|
block.wave.description = 적에게 액체 줄기를 발사합니다. 물이 공급되면 자동으로 화재를 진압합니다.
|
||||||
block.lancer.description = 지상 목표물에게 강력한 에너지 빔을 충전하여 발사합니다.
|
block.lancer.description = 지상 목표물에 강력한 에너지 빔을 충전하여 발사합니다.
|
||||||
block.arc.description = 지상 목표물에게 전격 아크를 발사합니다.
|
block.arc.description = 지상 목표물에 전격 아크를 발사합니다.
|
||||||
block.swarmer.description = 적에게 유도탄을 발사합니다.
|
block.swarmer.description = 적에게 유도탄을 발사합니다.
|
||||||
block.salvo.description = 적에게 총알을 빠르게 일제히 발사합니다.
|
block.salvo.description = 적에게 총알을 빠르게 일제히 발사합니다.
|
||||||
block.fuse.description = 주변 적에게 3개의 단거리 관통 레이저를 발사합니다.
|
block.fuse.description = 주변 적에게 3개의 단거리 관통 레이저를 발사합니다.
|
||||||
block.ripple.description = 장거리에 걸쳐 지상 적에게 포탄 무리를 발사합니다.
|
block.ripple.description = 장거리에 걸쳐 지상 적에게 포탄 무리를 발사합니다.
|
||||||
block.cyclone.description = 근처 적에게 폭발 파편 덩어리를 발사합니다.
|
block.cyclone.description = 근처 적에게 폭발 파편 덩어리를 발사합니다.
|
||||||
block.spectre.description = 공중 및 지상 목표물에게 큰 관통 철갑탄을 발사합니다.
|
block.spectre.description = 공중 및 지상 목표물에 큰 관통 철갑탄을 발사합니다.
|
||||||
block.meltdown.description = 주변 적에게 지속적인 레이저 빔을 충전하여 발사합니다. 냉각 액체가 있어야 작동합니다.
|
block.meltdown.description = 주변 적에게 지속적인 레이저 빔을 충전하여 발사합니다. 냉각 액체가 있어야 작동합니다.
|
||||||
block.foreshadow.description = 장거리에 걸친 거대한 단일 목표 저격탄을 발사합니다.
|
block.foreshadow.description = 장거리에 걸친 거대한 단일 목표 저격탄을 발사합니다.
|
||||||
block.repair-point.description = 인근에 가장 가까운 유닛을 지속적으로 치료합니다.
|
block.repair-point.description = 인근에 가장 가까운 유닛을 지속해서 치료합니다.
|
||||||
block.segment.description = 날아오는 발사체를 요격합니다. 큰 발사체에겐 조준하지 않습니다.
|
block.segment.description = 날아오는 발사체를 요격합니다. 큰 발사체엔 조준하지 않습니다.
|
||||||
block.parallax.description = 공중 목표물을 끌어오는 견인 광선을 발사하며, 견인 과정에서 데미지를 줍니다.
|
block.parallax.description = 공중 목표물을 끌어오는 견인 광선을 발사하며, 견인 과정에서 데미지를 줍니다.
|
||||||
block.tsunami.description = 적에게 강력한 액체 줄기를 발사합니다. 물이 공급되면 자동으로 주변의 화재를 진압합니다.
|
block.tsunami.description = 적에게 강력한 액체 줄기를 발사합니다. 물이 공급되면 자동으로 주변의 화재를 진압합니다.
|
||||||
block.silicon-crucible.description = 추가적으로 파이라타이트를 사용하여 더 높은 온도에서 석탄과 모래를 제련합니다. 뜨거운 곳에서 더 효율적입니다.
|
block.silicon-crucible.description = 추가로 파이라타이트를 사용하여 더 높은 온도에서 석탄과 모래를 제련합니다. 뜨거운 곳에서 더 효율적입니다.
|
||||||
block.disassembler.description = 광재를 낮은 확률로 미량의 희귀한 광물들로 분리합니다. 토륨을 생산할 수 있습니다.
|
block.disassembler.description = 광재를 낮은 확률로 미량의 희귀한 광물들로 분리합니다. 토륨을 생산할 수 있습니다.
|
||||||
block.overdrive-dome.description = 인근 블록들을 과부하시킵니다. 작동하기 위해 실리콘과 메타가 필요합니다.
|
block.overdrive-dome.description = 인근 블록들을 과부하시킵니다. 작동하기 위해 실리콘과 메타가 필요합니다.
|
||||||
block.payload-conveyor.description = 유닛이나 공장같이 큰 화물들을 운반합니다.
|
block.payload-conveyor.description = 유닛이나 공장같이 큰 화물들을 운반합니다.
|
||||||
block.payload-router.description = 3가지 방향으로 번갈아서 화물들을 운반합니다.
|
block.payload-router.description = 3가지 방향으로 번갈아서 화물들을 운반합니다.
|
||||||
block.command-center.description = 4개의 명령어들로 유닛 행동을 제어합니다.
|
block.command-center.description = 4개의 명령어로 유닛 행동을 제어합니다.
|
||||||
block.ground-factory.description = 지상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
|
block.ground-factory.description = 지상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
|
||||||
block.air-factory.description = 공중 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
|
block.air-factory.description = 공중 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
|
||||||
block.naval-factory.description = 해상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
|
block.naval-factory.description = 해상 유닛들을 생산합니다. 생산된 유닛들은 바로 사용될 수 있고, 또는 강화를 위해 재구성기에 들어가질 수 있습니다.
|
||||||
@@ -1507,3 +1516,127 @@ unit.omura.description = 적에게 장거리 관통 레일건을 발사합니다
|
|||||||
unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다.
|
unit.alpha.description = 적으로부터 코어: 조각을 방어합니다. 구조물을 짓습니다.
|
||||||
unit.beta.description = 적으로부터 코어: 기반을 방어합니다. 구조물을 짓습니다.
|
unit.beta.description = 적으로부터 코어: 기반을 방어합니다. 구조물을 짓습니다.
|
||||||
unit.gamma.description = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다.
|
unit.gamma.description = 적으로부터 코어: 핵심을 방어합니다. 구조물을 짓습니다.
|
||||||
|
|
||||||
|
lst.read = 연결된 메모리 셀에서 숫자 읽기
|
||||||
|
lst.write = 연결된 메모리 셀에 숫자 쓰기
|
||||||
|
lst.print = 프린트 버퍼에 텍스트 추가하기\n[accent]Print Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다.
|
||||||
|
lst.draw = 드로잉 버퍼에 실행문 추가하기\n[accent]Draw Flush[]가 사용되기 전까진 아무것도 보여주지 않습니다.
|
||||||
|
lst.drawflush = 대기중인 [accent]Draw[]실행문을 디스플레이에 출력하기
|
||||||
|
lst.printflush = 대기중인 [accent]Print[]실행문을 메시지 블록에 출력하기
|
||||||
|
lst.getlink = 순서별로 프로세서 연결 가져오기. 0부터 시작
|
||||||
|
lst.control = 건물 조종하기
|
||||||
|
lst.radar = 건물 주변의 유닛 검색하기
|
||||||
|
lst.sensor = 건물 또는 유닛의 정보 얻기
|
||||||
|
lst.set = 변수 선언/할당하기
|
||||||
|
lst.operation = 1~2개의 변수로 연산하기
|
||||||
|
lst.end = 실행줄의 가장 위로 점프하기
|
||||||
|
lst.jump = 조건부로 다른 실행문으로 점프하기
|
||||||
|
lst.unitbind = type 옆에 있는 유닛을 지정하고, [accent]@unit[]에 저장하기
|
||||||
|
lst.unitcontrol = 현재 지정된 유닛을 조종하기
|
||||||
|
lst.unitradar = 현재 지정된 유닛 주변의 유닛 검색하기
|
||||||
|
lst.unitlocate = 특정 유형의 위치/건물을 지도상에서 찾기\n지정된 유닛이 필요합니다.
|
||||||
|
|
||||||
|
lenum.type = 건물/유닛의 타입\n예로 분배기는 [accent]@router[]를 반환할 것입니다.\n문자열이 아니라.
|
||||||
|
lenum.shoot = 특정 위치에 발사
|
||||||
|
lenum.shootp = 목표물 속도를 예측하여 발사
|
||||||
|
lenum.configure = 필터의 아이템같은 건물의 설정
|
||||||
|
lenum.enabled = 블록의 활성 여부
|
||||||
|
lenum.color = 조명 색 설정
|
||||||
|
|
||||||
|
lenum.always = 항상 참
|
||||||
|
lenum.idiv = 정수 나누기
|
||||||
|
lenum.div = 나누기\n0으로 나누면 [accent]null[]을 반환합니다.
|
||||||
|
lenum.mod = 나머지
|
||||||
|
lenum.equal = 동치 비교. 형변환 가능\nNull이 아닌 객체가 숫자와 비교할려면 1이 되고, Null이면 0이 됩니다.
|
||||||
|
lenum.notequal = 동치 부정. 형변환 가능
|
||||||
|
lenum.strictequal = 엄격한 동치 비교. 형변환 불가능\n[accent]null[]를 확인하는데 쓸 수 있습니다.
|
||||||
|
lenum.shl = 왼쪽으로 비트 이동
|
||||||
|
lenum.shr = 오른쪽으로 비트 이동
|
||||||
|
lenum.or = 비트연산자 OR
|
||||||
|
lenum.land = 논리연산자 AND
|
||||||
|
lenum.and = 비트연산자 AND
|
||||||
|
lenum.not = 비트연산자 NOT
|
||||||
|
lenum.xor = 비트연산자 XOR
|
||||||
|
|
||||||
|
lenum.min = 두 수의 최솟값
|
||||||
|
lenum.max = 두 수의 최댓값
|
||||||
|
lenum.angle = 벡터의 각(도)
|
||||||
|
lenum.len = 벡터의 길이
|
||||||
|
lenum.sin = 사인(도)
|
||||||
|
lenum.cos = 코사인(도)
|
||||||
|
lenum.tan = 탄젠트(도)
|
||||||
|
#not a typo, look up 'range notation'
|
||||||
|
lenum.rand = 범위 내 난수[0 ~ 값)
|
||||||
|
lenum.log = 자연 로그(진수)
|
||||||
|
lenum.log10 = 상수 로그
|
||||||
|
lenum.noise = 2D 심플렉스 노이즈
|
||||||
|
lenum.abs = 절댓값
|
||||||
|
lenum.sqrt = 제곱근
|
||||||
|
|
||||||
|
lenum.any = 유닛
|
||||||
|
lenum.ally = 아군 유닛
|
||||||
|
lenum.attacker = 무기를 가진 유닛
|
||||||
|
lenum.enemy = 적 유닛
|
||||||
|
lenum.boss = 수호자 유닛
|
||||||
|
lenum.flying = 공중 유닛
|
||||||
|
lenum.ground = 지상 유닛
|
||||||
|
lenum.player = 플레이어에 의해 조종된 유닛
|
||||||
|
|
||||||
|
lenum.ore = 광석 매장지
|
||||||
|
lenum.damaged = 손상된 아군 건물
|
||||||
|
lenum.spawn = 적 스폰 지점\n코어 또는 지점일 수 있음.
|
||||||
|
lenum.building = 특정 건물 집단에 속한 건물
|
||||||
|
|
||||||
|
lenum.core = 코어
|
||||||
|
lenum.storage = 창고같은 저장 건물
|
||||||
|
lenum.generator = 전력을 생산하는 건물
|
||||||
|
lenum.factory = 자원을 변환하는 건물
|
||||||
|
lenum.repair = 수리 지점
|
||||||
|
lenum.rally = 지휘소
|
||||||
|
lenum.battery = 배터리
|
||||||
|
lenum.resupply = 보급 지점.\n[accent]"유닛 탄약 필요"[]가 활성화되었을 때만 유의미합니다.
|
||||||
|
lenum.reactor = 핵융합로/토륨 원자로
|
||||||
|
lenum.turret = 포탑ㅁ
|
||||||
|
|
||||||
|
sensor.in = 감지할 건물/유닛
|
||||||
|
|
||||||
|
radar.from = 감지를 할 건물\n감지 범위는 건물의 감지 범위에 의해 제한됩니다.
|
||||||
|
radar.target = 유닛 감지 필터
|
||||||
|
radar.and = 추가 필터
|
||||||
|
radar.order = 정렬 순서. 0은 반전
|
||||||
|
radar.sort = 결과를 정렬할 측정 수단
|
||||||
|
radar.output = 찾은 유닛을 대입할 변수
|
||||||
|
|
||||||
|
unitradar.target = 유닛 감지 필터
|
||||||
|
unitradar.and = 추가 필터
|
||||||
|
unitradar.order = 정렬 순서. 0은 반전
|
||||||
|
unitradar.sort = 결과를 정렬할 측정 수단
|
||||||
|
unitradar.output = 찾은 유닛을 대입할 변수
|
||||||
|
|
||||||
|
control.of = 조종할 건물
|
||||||
|
control.unit = 조준할 유닛/건물
|
||||||
|
control.shoot = 발사 여부
|
||||||
|
|
||||||
|
unitlocate.enemy = 적 건물 포함 여부
|
||||||
|
unitlocate.found = 대상 발견 여부
|
||||||
|
unitlocate.building = 찾은 건물을 대입할 변수
|
||||||
|
unitlocate.outx = X좌표
|
||||||
|
unitlocate.outy = Y좌표
|
||||||
|
unitlocate.group = 찾을 건물 집단
|
||||||
|
|
||||||
|
lenum.stop = 이동/채광/건설 중단
|
||||||
|
lenum.move = 특정 위치로 이동
|
||||||
|
lenum.approach = 특정 위치로 반지름만큼 접근
|
||||||
|
lenum.pathfind = 적 스폰 지점으로 길찾기
|
||||||
|
lenum.target = 특정 위치에 발사
|
||||||
|
lenum.targetp = 목표물 속도를 예측하여 발사
|
||||||
|
lenum.itemdrop = 아이템 투하
|
||||||
|
lenum.itemtake = 건물에서 아이템 수송
|
||||||
|
lenum.paydrop = 현재 화물 투하
|
||||||
|
lenum.paytake = 현재 위치에서 화물 수송
|
||||||
|
lenum.flag = 깃발 수 설정
|
||||||
|
lenum.mine = 특정 위치에서 채광
|
||||||
|
lenum.build = 구조물 건설
|
||||||
|
lenum.getblock = 특정 좌표의 빌딩과 블록을 반환합니다.\n위치는 유닛의 인지 범위 내여야 합니다.\n자연 지형은 [accent]@solid[]의 타입을 가집니다.
|
||||||
|
lenum.within = 좌표 주변 유닛 발견 여부
|
||||||
|
lenum.boost = 이륙 시작/중단
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ be.check = Verifică updateurile
|
|||||||
|
|
||||||
mods.browser = Browser de Moduri
|
mods.browser = Browser de Moduri
|
||||||
mods.browser.selected = Mod selectat
|
mods.browser.selected = Mod selectat
|
||||||
mods.browser.add = Instalează
|
mods.browser.add = Instalare
|
||||||
mods.browser.reinstall = Reinstalează
|
mods.browser.reinstall = Reinstal.
|
||||||
mods.github.open = Github
|
mods.github.open = Github
|
||||||
mods.browser.sortdate = Cele mai recente
|
mods.browser.sortdate = Cele mai recente
|
||||||
mods.browser.sortstars = Cele mai multe stele
|
mods.browser.sortstars = Cele mai multe stele
|
||||||
@@ -113,7 +113,7 @@ committingchanges = Se Încarcă Schimbările
|
|||||||
done = Gata
|
done = Gata
|
||||||
feature.unsupported = Dispozitivul tău nu suportă această funcție.
|
feature.unsupported = Dispozitivul tău nu suportă această funcție.
|
||||||
|
|
||||||
mods.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportează orice probleme apărute pe Githubul Mindustry.
|
mods.initfailed = [red]⚠[] Instanța Mindustry precedentă a eșuat la inițializare. De obicei se întâmplă din cauza unui mod care nu se acționează cum trebuie.\n\nPt a preveni un lanț de crashuri continue, [red]toate modurile au fost dezactivate.[]\n\nPoți dezactiva asta din [accent]Setări->Joc->Dezactivează Modurile în Cazul unui Crash la Pornire[].
|
||||||
mods = Moduri
|
mods = Moduri
|
||||||
mods.none = [lightgray]Nu s-au găsit moduri!
|
mods.none = [lightgray]Nu s-au găsit moduri!
|
||||||
mods.guide = Ghid de Modding
|
mods.guide = Ghid de Modding
|
||||||
@@ -312,6 +312,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
|
||||||
|
enablebuilding = [scarlet][[{0}][] pt a construi
|
||||||
showui = Interfață ascunsă.\nApasă [accent][[{0}][] pt a vedea interfața.
|
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}
|
||||||
@@ -683,6 +684,7 @@ stat.drillspeed = Viteză Burghiu (Bază)
|
|||||||
stat.boosteffect = Efect de Îmbunătățire
|
stat.boosteffect = Efect de Îmbunătățire
|
||||||
stat.maxunits = Maxim Unități Active
|
stat.maxunits = Maxim Unități Active
|
||||||
stat.health = Viață
|
stat.health = Viață
|
||||||
|
stat.armor = Armură
|
||||||
stat.buildtime = Timp Construcție
|
stat.buildtime = Timp Construcție
|
||||||
stat.maxconsecutive = Maxim Consecutive
|
stat.maxconsecutive = Maxim Consecutive
|
||||||
stat.buildcost = Cost Construcție
|
stat.buildcost = Cost Construcție
|
||||||
@@ -794,9 +796,11 @@ setting.shadows.name = Umbre
|
|||||||
setting.blockreplace.name = Sugestii Plasare Automats
|
setting.blockreplace.name = Sugestii Plasare Automats
|
||||||
setting.linear.name = Filtrare Liniară
|
setting.linear.name = Filtrare Liniară
|
||||||
setting.hints.name = Indicii
|
setting.hints.name = Indicii
|
||||||
|
setting.logichints.name = Indicii Procesoare Logice
|
||||||
setting.flow.name = Afișează Rata de Curgere a lichidelor
|
setting.flow.name = Afișează Rata de Curgere a lichidelor
|
||||||
setting.buildautopause.name = Autopauză de la Construit
|
setting.buildautopause.name = Autopauză de la Construit
|
||||||
setting.backgroundpause.name = Pune Pauză în Fundal
|
setting.backgroundpause.name = Pune Pauză în Fundal
|
||||||
|
setting.modcrashdisable = Dezactivează Modurile în Cazul unui Crash la Pornire
|
||||||
setting.animatedwater.name = Suprafețe Animate
|
setting.animatedwater.name = Suprafețe Animate
|
||||||
setting.animatedshields.name = Scuturi Animate
|
setting.animatedshields.name = Scuturi Animate
|
||||||
setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[]
|
setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[]
|
||||||
@@ -954,6 +958,8 @@ rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor
|
|||||||
rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților
|
rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților
|
||||||
rules.unithealthmultiplier = Multiplicatorul Vieții Unităților
|
rules.unithealthmultiplier = Multiplicatorul Vieții Unităților
|
||||||
rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților
|
rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților
|
||||||
|
rules.unitcapvariable = Nucleele Contribuie la Limita Unităților
|
||||||
|
rules.unitcap = Limita de Bază a Unităților
|
||||||
rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate)
|
rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate)
|
||||||
rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec)
|
rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec)
|
||||||
rules.buildcostmultiplier = Multiplicatorul Costului Construcției
|
rules.buildcostmultiplier = Multiplicatorul Costului Construcției
|
||||||
@@ -1034,7 +1040,7 @@ unit.omura.name = Omura
|
|||||||
unit.alpha.name = Alpha
|
unit.alpha.name = Alpha
|
||||||
unit.beta.name = Beta
|
unit.beta.name = Beta
|
||||||
unit.gamma.name = Gamma
|
unit.gamma.name = Gamma
|
||||||
unit.scepter.name = Septer
|
unit.scepter.name = Scepter
|
||||||
unit.reign.name = Reign
|
unit.reign.name = Reign
|
||||||
unit.vela.name = Vela
|
unit.vela.name = Vela
|
||||||
unit.corvus.name = Corvus
|
unit.corvus.name = Corvus
|
||||||
@@ -1144,10 +1150,6 @@ block.armored-conveyor.name = Bandă Armată
|
|||||||
block.junction.name = Intersecție
|
block.junction.name = Intersecție
|
||||||
block.router.name = Router
|
block.router.name = Router
|
||||||
block.distributor.name = Distributor
|
block.distributor.name = Distributor
|
||||||
#experimental, pot fi șterse în viitor
|
|
||||||
block.block-forge.name = Forjă de Blocuri
|
|
||||||
block.block-loader.name = Încă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
|
||||||
@@ -1227,7 +1229,7 @@ block.overdrive-projector.name = Proiector de Suprasolicitare
|
|||||||
block.force-projector.name = Proiector de Forță
|
block.force-projector.name = Proiector de Forță
|
||||||
block.arc.name = Arc
|
block.arc.name = Arc
|
||||||
block.rtg-generator.name = Generator RTG
|
block.rtg-generator.name = Generator RTG
|
||||||
block.spectre.name = Specter
|
block.spectre.name = Spectre
|
||||||
block.meltdown.name = Meltdown
|
block.meltdown.name = Meltdown
|
||||||
block.foreshadow.name = Foreshadow
|
block.foreshadow.name = Foreshadow
|
||||||
block.container.name = Container
|
block.container.name = Container
|
||||||
@@ -1248,6 +1250,10 @@ 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.interplanetary-accelerator.name = Accelerator Interplanetar
|
||||||
|
#experimental, pot fi șterse în viitor
|
||||||
|
block.block-forge.name = Forjă de Blocuri
|
||||||
|
block.block-loader.name = Încărcător de Blocuri
|
||||||
|
block.block-unloader.name = Descărcător de Blocuri
|
||||||
|
|
||||||
block.switch.name = Întrerupător
|
block.switch.name = Întrerupător
|
||||||
block.micro-processor.name = Microprocesor
|
block.micro-processor.name = Microprocesor
|
||||||
@@ -1450,6 +1456,7 @@ block.ripple.description = Lovește cu capsule către inamici pe distanțe mari.
|
|||||||
block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere.
|
block.cyclone.description = Trage cu grămezi explozive de material către unitățile inamice din apropiere.
|
||||||
block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere.
|
block.spectre.description = Trage cu gloanțe mari care penetrează scuturile inamicilor din apropiere.
|
||||||
block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera.
|
block.meltdown.description = Se încarcă și trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera.
|
||||||
|
block.foreshadow.description = Trage către o țintă cu un glonț imens pe distanțe lungi.
|
||||||
block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate.
|
block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate.
|
||||||
block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate.
|
block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate.
|
||||||
block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le.
|
block.parallax.description = Trage cu o rază tractoare care atrage aeronavele inamice, deteriorându-le.
|
||||||
@@ -1510,3 +1517,139 @@ unit.omura.description = Trage cu un railgun cu gloanțe care penetrează scutur
|
|||||||
unit.alpha.description = Apără nucleul Shard de inamici. Construiește structuri.
|
unit.alpha.description = Apără nucleul Shard de inamici. Construiește structuri.
|
||||||
unit.beta.description = Apără nucleul Foundation de inamici. Construiește structuri.
|
unit.beta.description = Apără nucleul Foundation de inamici. Construiește structuri.
|
||||||
unit.gamma.description = Apără nucleul Core de inamici. Construiește structuri.
|
unit.gamma.description = Apără nucleul Core de inamici. Construiește structuri.
|
||||||
|
|
||||||
|
lst.read = Citește un număr dintr-o celulă de memorie conectată.
|
||||||
|
lst.write = Scrie un număr într-o celulă de memorie conectată.
|
||||||
|
lst.print = Adaugă text în bufferul de tipărire.\nNu tipărește decât când se execută [accent]Print Flush[].
|
||||||
|
lst.draw = Adaugă o operație în bufferul de desenare.\nNu afișează decât când se execută [accent]Draw Flush[].
|
||||||
|
lst.drawflush = Afișează pe un monitor instrucțiunile [accent]Draw[] aflate în așteptare.
|
||||||
|
lst.printflush = Tipărește într-un bloc Mesaj instrucțiunile [accent]Print[] aflate în așteptare.
|
||||||
|
lst.getlink = Obține o conexiune a procesorului după index. Începe de la 0.
|
||||||
|
lst.control = Controlează o clădire.
|
||||||
|
lst.radar = Localizează unitățile aflate în jurul unei clădiri. Are o anumită rază de acțiune.
|
||||||
|
lst.sensor = Obține date de la o clădire sau unitate.
|
||||||
|
lst.set = Setează o variabilă.
|
||||||
|
lst.operation = Efectuează o operație pe 1-2 variabile.
|
||||||
|
lst.end = Sari la începutul listei de instrucțiuni.
|
||||||
|
lst.jump = Dacă condiția este adevărată, mergi la o altă instrucțiune.
|
||||||
|
lst.unitbind = Controlează următoarea unitate de tipul selectat și reține-o în [accent]@unit[].
|
||||||
|
lst.unitcontrol = Controlează unitatea controlată de procesor.
|
||||||
|
lst.unitradar = Localizează unitățile din jurul unității controlate de procesor.
|
||||||
|
lst.unitlocate = Localizează o poziție/clădire specifică oriunde pe hartă.\nNecesită o unitate controlată de procesor.
|
||||||
|
|
||||||
|
lenum.type = Tipul clădirii/unității.\nde ex.: pt orice Router, va returna [accent]@router[].\nNu e un șir de caractere.
|
||||||
|
lenum.shoot = Lovește către o locație.
|
||||||
|
lenum.shootp = Lovește către o unitate/clădire. Anticipează viteza țintei și a proiectilului.
|
||||||
|
lenum.configure = Configurașia clădirii, de ex. materialul selectat pt Sortator.
|
||||||
|
lenum.enabled = Specifică dacă clădirea este pornită.
|
||||||
|
|
||||||
|
laccess.color = Culoarea iluminatorului.
|
||||||
|
|
||||||
|
graphicstype.clear = Umple monitorul cu o culoare.
|
||||||
|
graphicstype.color = Setează culoarea pt următoarea instrucțiune Draw.
|
||||||
|
graphicstype.stroke = Setează grosimea liniei.
|
||||||
|
graphicstype.line = Desenează un segment de linie.
|
||||||
|
graphicstype.rect = Desenează un dreptunghi.
|
||||||
|
graphicstype.linerect = Desenează conturul unui dreptunghi.
|
||||||
|
graphicstype.poly = Desenează un poligon regulat.
|
||||||
|
graphicstype.linepoly = Desenează conturul unui poligon regulat.
|
||||||
|
graphicstype.triangle = Desenează un triunghi.
|
||||||
|
graphicstype.image = Desenează imaginea unui obiect din joc.\nde ex.: [accent]@router[] sau [accent]@dagger[].
|
||||||
|
|
||||||
|
lenum.always = Mereu adevărat.
|
||||||
|
lenum.idiv = Împărțirea naturală a numerelor (int).
|
||||||
|
lenum.div = Împărțirea.\nReturnează [accent]null[] dacă împarți la 0.
|
||||||
|
lenum.mod = Modulo (restul împărțirii).
|
||||||
|
lenum.equal = Egal. Convertește tipurile variabilelor.\nObiectele nenule comparate cu numere devin 1, cele nule devin 0.
|
||||||
|
lenum.notequal = Nu e egal. Convertește tipurile variabilelor.
|
||||||
|
lenum.strictequal = Egalitate strictă. Nu convertește tipurile variabilelor.\nPoate fi folosit pt a verifica dacă ceva este [accent]null[].
|
||||||
|
lenum.shl = Shift left pe biți.
|
||||||
|
lenum.shr = Shift right pe biți.
|
||||||
|
lenum.or = OR/SAU. Ține cont de biți.
|
||||||
|
lenum.land = Logical AND/ȘI logic. Nu ține cont de biți.
|
||||||
|
lenum.and = AND/ȘI. Ține cont de biți.
|
||||||
|
lenum.not = NOT. Inversează biții.
|
||||||
|
lenum.xor = XOR/disjuncție exclusivă. Ține cont de biți.
|
||||||
|
|
||||||
|
lenum.min = Minimul a două numere.
|
||||||
|
lenum.max = Maximul a două numere.
|
||||||
|
lenum.angle = Unghiul unui vector în grade.
|
||||||
|
lenum.len = Lungimea unui vector.
|
||||||
|
lenum.sin = Sinus în grade.
|
||||||
|
lenum.cos = Cosinus în grade.
|
||||||
|
lenum.tan = Tangentă în grade.
|
||||||
|
#cea de mai jos nu-i o greșeală, caută pe net notarea intervalelor în matematică
|
||||||
|
lenum.rand = Număr aleatoriu în intervalul [0, val).
|
||||||
|
lenum.log = Logaritm natural (ln).
|
||||||
|
lenum.log10 = Logaritm în baza 10.
|
||||||
|
lenum.noise = 2D simplex noise.
|
||||||
|
lenum.abs = Valoarea absolută.
|
||||||
|
lenum.sqrt = Radical/rădăcina pătrată.
|
||||||
|
|
||||||
|
lenum.any = Orice unitate.
|
||||||
|
lenum.ally = Unitate aliată.
|
||||||
|
lenum.attacker = Unitate cu armă.
|
||||||
|
lenum.enemy = Unitate inamică.
|
||||||
|
lenum.boss = Unitate gardian.
|
||||||
|
lenum.flying = Unitate care zboară.
|
||||||
|
lenum.ground = Unitate de artilerie.
|
||||||
|
lenum.player = Unitate controlată de un jucător.
|
||||||
|
|
||||||
|
lenum.ore = Depozit de minereu.
|
||||||
|
lenum.damaged = Clădire aliată deteriorată.
|
||||||
|
lenum.spawn = Punct de lansare inamic.\nPoate fi un nucleu sau o poziție.
|
||||||
|
lenum.building = Clădire dintr-un grup specific.
|
||||||
|
|
||||||
|
lenum.core = Orice nucleu.
|
||||||
|
lenum.storage = Clădire de stocare, de ex. Containerul.
|
||||||
|
lenum.generator = Clădiri care generează electricitate.
|
||||||
|
lenum.factory = Clădiri care transformă resurse.
|
||||||
|
lenum.repair = Puncte de Reparare.
|
||||||
|
lenum.rally = Centre de Comandă.
|
||||||
|
lenum.battery = Orice baterie.
|
||||||
|
lenum.resupply = Puncte de Realimentare.\nRelevant doar când [accent]"Unitățile Necesită Muniție"[] este activată.
|
||||||
|
lenum.reactor = Reactor de Toriu/Impact.
|
||||||
|
lenum.turret = Orice armă.
|
||||||
|
|
||||||
|
sensor.in = Clădirea/unitatea care trebuie detectată.
|
||||||
|
|
||||||
|
radar.from = Clădirea de la care detectăm.\nRaza senzorului e limitată de raza de costrucție.
|
||||||
|
radar.target = Filtru pt unitățile care trebuie detectate.
|
||||||
|
radar.and = Adaugă filtre.
|
||||||
|
radar.order = Ordinea de sortare. 0 pt a inversa ordinea.
|
||||||
|
radar.sort = Modul cum sortăm rezultatele.
|
||||||
|
radar.output = Variabila în care se va scrie unitatea detectată.
|
||||||
|
|
||||||
|
unitradar.target = Filtru pt unitățile care trebuie detectate.
|
||||||
|
unitradar.and = Adaugă filtre.
|
||||||
|
unitradar.order = Ordinea de sortare. 0 pt a inversa ordinea.
|
||||||
|
unitradar.sort = Modul cum sortăm rezultatele.
|
||||||
|
unitradar.output = Variabila în care se reține unitatea detectată.
|
||||||
|
|
||||||
|
control.of = Clădirea de controlat.
|
||||||
|
control.unit = Unitatea/clădirea către care se țintește.
|
||||||
|
control.shoot = Specifică dacă armele trag.
|
||||||
|
|
||||||
|
unitlocate.enemy = Specifică dacă se detectează clădirile inamice.
|
||||||
|
unitlocate.found = Specifică dacă obiectul a fost găsit.
|
||||||
|
unitlocate.building = Clădirea detectată.
|
||||||
|
unitlocate.outx = Coordonata X a obiectului detectat.
|
||||||
|
unitlocate.outy = Coordonata Y a obiectului detectat.
|
||||||
|
unitlocate.group = Grupul clădirilor de detectat.
|
||||||
|
|
||||||
|
lenum.stop = Oprește acțiunea curentă. Nu mișca/mina/construi.
|
||||||
|
lenum.move = Mergi la această poziție.
|
||||||
|
lenum.approach = Apropie-te la o anumită distanță de poziție.
|
||||||
|
lenum.pathfind = Găsește ruta către punctul de lansare inamic. Poate fi un nucleu.
|
||||||
|
lenum.target = Lovește către o poziție.
|
||||||
|
lenum.targetp = Lovește o țintă. Anticipează viteza țintei și a proiectilului.
|
||||||
|
lenum.itemdrop = Descarcă o bucată de material.
|
||||||
|
lenum.itemtake = Ia o bucată de material dintr-o clădire.
|
||||||
|
lenum.paydrop = Descarcă încărcătura curentă.
|
||||||
|
lenum.paytake = Ia o încărcătură de la locația curentă.
|
||||||
|
lenum.flag = Oferă o etichetă numerică unității.
|
||||||
|
lenum.mine = Minează din această locație.
|
||||||
|
lenum.build = Construiește o structură.
|
||||||
|
lenum.getblock = Obține clădirea și tipul clădirii aflate la coordonatele specificate.\nUnitatea trebuie să se afle în raza poziției.\nBlocurile solide care nu sunt clădiri vor avea tipul [accent]@solid[].
|
||||||
|
lenum.within = Verifică dacă unitatea se află în apropierea poziției.
|
||||||
|
lenum.boost = Pornește/oprește propulsorul.
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ cancelbuilding = [accent][[{0}][] для очистки плана
|
|||||||
selectschematic = [accent][[{0}][] выделить и скопировать
|
selectschematic = [accent][[{0}][] выделить и скопировать
|
||||||
pausebuilding = [accent][[{0}][] для приостановки строительства
|
pausebuilding = [accent][[{0}][] для приостановки строительства
|
||||||
resumebuilding = [scarlet][[{0}][] для продолжения строительства
|
resumebuilding = [scarlet][[{0}][] для продолжения строительства
|
||||||
|
enablebuilding = [scarlet][[{0}][] для включения строительства
|
||||||
showui = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса.
|
showui = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса.
|
||||||
wave = [accent]Волна {0}
|
wave = [accent]Волна {0}
|
||||||
wave.cap = [accent]Волна {0}/{1}
|
wave.cap = [accent]Волна {0}/{1}
|
||||||
@@ -683,6 +684,7 @@ stat.drillspeed = Базовая скорость бурения
|
|||||||
stat.boosteffect = Ускоряющий эффект
|
stat.boosteffect = Ускоряющий эффект
|
||||||
stat.maxunits = Максимальное количество активных единиц
|
stat.maxunits = Максимальное количество активных единиц
|
||||||
stat.health = Прочность
|
stat.health = Прочность
|
||||||
|
stat.armor = Броня
|
||||||
stat.buildtime = Время строительства
|
stat.buildtime = Время строительства
|
||||||
stat.maxconsecutive = Макс. последовательность
|
stat.maxconsecutive = Макс. последовательность
|
||||||
stat.buildcost = Стоимость строительства
|
stat.buildcost = Стоимость строительства
|
||||||
@@ -794,6 +796,7 @@ setting.shadows.name = Тени
|
|||||||
setting.blockreplace.name = Автоматическая замена блоков
|
setting.blockreplace.name = Автоматическая замена блоков
|
||||||
setting.linear.name = Линейная фильтрация
|
setting.linear.name = Линейная фильтрация
|
||||||
setting.hints.name = Подсказки
|
setting.hints.name = Подсказки
|
||||||
|
setting.logichints.name = Подсказки для логики
|
||||||
setting.flow.name = Показывать скорость потока ресурсов
|
setting.flow.name = Показывать скорость потока ресурсов
|
||||||
setting.backgroundpause.name = Фоновая пауза
|
setting.backgroundpause.name = Фоновая пауза
|
||||||
setting.buildautopause.name = Автоматическая приостановка строительства
|
setting.buildautopause.name = Автоматическая приостановка строительства
|
||||||
@@ -954,6 +957,8 @@ rules.blockdamagemultiplier = Множитель урона блоков
|
|||||||
rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед.
|
rules.unitbuildspeedmultiplier = Множитель скорости производства боев. ед.
|
||||||
rules.unithealthmultiplier = Множитель здоровья боев. ед.
|
rules.unithealthmultiplier = Множитель здоровья боев. ед.
|
||||||
rules.unitdamagemultiplier = Множитель урона боев. ед.
|
rules.unitdamagemultiplier = Множитель урона боев. ед.
|
||||||
|
rules.unitcapvariable = Ядра увеличивают лимит единиц
|
||||||
|
rules.unitcap = Начальный лимит единиц
|
||||||
rules.enemycorebuildradius = Радиус защиты враж. ядер:[lightgray] (блок.)
|
rules.enemycorebuildradius = Радиус защиты враж. ядер:[lightgray] (блок.)
|
||||||
rules.wavespacing = Интервал волн:[lightgray] (сек)
|
rules.wavespacing = Интервал волн:[lightgray] (сек)
|
||||||
rules.buildcostmultiplier = Множитель затрат на строительство
|
rules.buildcostmultiplier = Множитель затрат на строительство
|
||||||
@@ -1511,3 +1516,128 @@ unit.omura.description = Стреляет дальнобойным пробив
|
|||||||
unit.alpha.description = Защищает ядро «Осколок» от врагов. Основная строительная единица.
|
unit.alpha.description = Защищает ядро «Осколок» от врагов. Основная строительная единица.
|
||||||
unit.beta.description = Защищает ядро «Штаб» от врагов. Основная строительная единица.
|
unit.beta.description = Защищает ядро «Штаб» от врагов. Основная строительная единица.
|
||||||
unit.gamma.description = Защищает ядро «Атом» от врагов. Основная строительная единица.
|
unit.gamma.description = Защищает ядро «Атом» от врагов. Основная строительная единица.
|
||||||
|
|
||||||
|
lst.read = Считывает число из соединённой ячейки памяти.
|
||||||
|
lst.write = Записывает число в соединённую ячейку памяти.
|
||||||
|
lst.print = Добавляет текст в текстовый буфер. Ничего не отображает, пока не будет вызван [accent]Print Flush[].
|
||||||
|
lst.draw = Добавляет операцию в буфер отрисовки. Ничего не отображает, пока не будет вызван [accent]Draw Flush[].
|
||||||
|
lst.drawflush = Сбрасывает буфер [accent]Draw[] операций на дисплей.
|
||||||
|
lst.printflush = Сбрасывает буфер [accent]Print[] операций в блок-сообщение.
|
||||||
|
lst.getlink = Получает соединение процессора по индексу. Начинает с 0.
|
||||||
|
lst.control = Контролирует блок.
|
||||||
|
lst.radar = Обнаруживает единицы вокруг постройки с заданным радиусом.
|
||||||
|
lst.sensor = Получает данные из постройки или единицы.
|
||||||
|
lst.set = Устанавливает переменную.
|
||||||
|
lst.operation = Совершает операцию над 1-2 переменными.
|
||||||
|
lst.end = Переходит к началу стека операций.
|
||||||
|
lst.jump = Условно переходит к другой операции.
|
||||||
|
lst.unitbind = Привязывается к единице определённого типа и сохраняет её в [accent]@unit[].
|
||||||
|
lst.unitcontrol = Управляет привязанной в данный момент единицей.
|
||||||
|
lst.unitradar = Обнаруживает единицы вокруг привязанной в данный момент единицы.
|
||||||
|
lst.unitlocate = Обнаруживает позицию/постройку определённого типа где-либо на карте. Требует привязанную единицу.
|
||||||
|
|
||||||
|
lenum.type = Тип постройки/единицы. \nНапример, для маршрутизатора это будет [accent]@router[].\nНе строка.
|
||||||
|
lenum.shoot = Стрельба в определённую позицию.
|
||||||
|
lenum.shootp = Стрельба в единицу/постройку с расчётом скорости.
|
||||||
|
lenum.configure = Конфигурация постройки, например, предмет сортировки.
|
||||||
|
lenum.enabled = Включён ли блок.
|
||||||
|
|
||||||
|
laccess.color = Цвет осветителя.
|
||||||
|
|
||||||
|
lenum.always = Всегда истина.
|
||||||
|
lenum.idiv = Целочисленное деление.
|
||||||
|
lenum.div = Деление.\nВозвращает [accent]null[] при делении на ноль.
|
||||||
|
lenum.mod = Остаток от деления.
|
||||||
|
lenum.equal = Равно. Приводит типы.\nНе-null объекты, по сравнению с числами, становятся 1, иначе — 0.
|
||||||
|
lenum.notequal = Не равно. Приводит типы.
|
||||||
|
lenum.strictequal = Строгое равенство. Не приводит типы.\nМожет быть использовано для проверки на [accent]null[].
|
||||||
|
lenum.shl = Побитовый сдвиг влево.
|
||||||
|
lenum.shr = Побитовый сдвиг вправо.
|
||||||
|
lenum.or = Побитовое ИЛИ.
|
||||||
|
lenum.land = Булевое И.
|
||||||
|
lenum.and = Побитовое И.
|
||||||
|
lenum.not = Побитовое НЕ.
|
||||||
|
lenum.xor = Побитовое исключающее ИЛИ.
|
||||||
|
|
||||||
|
lenum.min = Минимальное из двух чисел.
|
||||||
|
lenum.max = Максимальное из двух чисел.
|
||||||
|
lenum.angle = Угол вектора в градусах.
|
||||||
|
lenum.len = Длина вектора.
|
||||||
|
lenum.sin = Синус, в градусах.
|
||||||
|
lenum.cos = Косинус, в градусах.
|
||||||
|
lenum.tan = Тангенс, в градусах.
|
||||||
|
#это не ошибка, поищите 'обозначение диапазонов'
|
||||||
|
lenum.rand = Случайное число в диапазоне [0, значение).
|
||||||
|
lenum.log = Натуральный логарифм (ln).
|
||||||
|
lenum.log10 = Логарифм по основанию 10.
|
||||||
|
lenum.noise = Симплексный шум, 2D.
|
||||||
|
lenum.abs = Абсолютная величина.
|
||||||
|
lenum.sqrt = Квадратный корень.
|
||||||
|
|
||||||
|
lenum.any = Любая единица.
|
||||||
|
lenum.ally = Дружеская единица.
|
||||||
|
lenum.attacker = Единица с оружием.
|
||||||
|
lenum.enemy = Вражеская единица.
|
||||||
|
lenum.boss = Страж.
|
||||||
|
lenum.flying = Летающая единица.
|
||||||
|
lenum.ground = Наземная единица.
|
||||||
|
lenum.player = Единица, управляемая игроком.
|
||||||
|
|
||||||
|
lenum.ore = Источник руды.
|
||||||
|
lenum.damaged = Повреждённая дружеская постройка.
|
||||||
|
lenum.spawn = Точка появления врагов.\nМожет быть ядром или позицией на карте.
|
||||||
|
lenum.building = Постройка определённой группы.
|
||||||
|
|
||||||
|
lenum.core = Любое ядро.
|
||||||
|
lenum.storage = Здание хранения, например, хранилище.
|
||||||
|
lenum.generator = Постройки, вырабатывающие энергию.
|
||||||
|
lenum.factory = Постройки, перерабатывающие предметы.
|
||||||
|
lenum.repair = Ремонтные пункты.
|
||||||
|
lenum.rally = Командный центр.
|
||||||
|
lenum.battery = Любой аккумулятор.
|
||||||
|
lenum.resupply = Пункты снабжения.\nАктуально только при включённом [accent]"Боев. ед. требуют боеприпасы"[].
|
||||||
|
lenum.reactor = Импульсный/ториевый реактор.
|
||||||
|
lenum.turret = Любая турель.
|
||||||
|
|
||||||
|
sensor.in = Постройка/единица для распознавания.
|
||||||
|
|
||||||
|
radar.from = Постройка, от которой распознавать.\nДальность сенсора ограничена дальностью постройки.
|
||||||
|
radar.target = Фильтр для распознавания единиц.
|
||||||
|
radar.and = Дополнительные фильтры.
|
||||||
|
radar.order = Порядок сортировки. 0 для обратного.
|
||||||
|
radar.sort = Показатель для сортировки результатов.
|
||||||
|
radar.output = Переменная для записи конечной единицы.
|
||||||
|
|
||||||
|
unitradar.target = Фильтр для распознавания единиц.
|
||||||
|
unitradar.and = Дополнительные фильтры.
|
||||||
|
unitradar.order = Порядок сортировки. 0 для обратного.
|
||||||
|
unitradar.sort = Показатель для сортировки результатов.
|
||||||
|
unitradar.output = Переменная для записи конечной единицы.
|
||||||
|
|
||||||
|
control.of = Постройка для контролирования.
|
||||||
|
control.unit = Единица/постройка для прицеливания.
|
||||||
|
control.shoot = Стрелять ли.
|
||||||
|
|
||||||
|
unitlocate.enemy = Обнаруживать ли вражеские постройки.
|
||||||
|
unitlocate.found = Найден ли объект.
|
||||||
|
unitlocate.building = Переменная для записи обнаруженной постройки.
|
||||||
|
unitlocate.outx = Вывод X координаты.
|
||||||
|
unitlocate.outy = Вывод Y координаты.
|
||||||
|
unitlocate.group = Группа построек для поиска.
|
||||||
|
|
||||||
|
lenum.stop = Остановка передвижения/копания/стротельства.
|
||||||
|
lenum.move = Перемещение в определённую позицию.
|
||||||
|
lenum.approach = Приближение к позиции с указанным радиусом.
|
||||||
|
lenum.pathfind = Перемещение к точке появления врагов.
|
||||||
|
lenum.target = Стрельба в определённую позицию.
|
||||||
|
lenum.targetp = Стрельба в единицу/постройку с расчётом скорости.
|
||||||
|
lenum.itemdrop = Сбрасывание предметов.
|
||||||
|
lenum.itemtake = Взятие предметов из постройки.
|
||||||
|
lenum.paydrop = Сбрасывание текущего груза.
|
||||||
|
lenum.paytake = Взятие груза на текущей позиции.
|
||||||
|
lenum.flag = Числовой флаг единицы.
|
||||||
|
lenum.mine = Копание в позиции.
|
||||||
|
lenum.build = Строительство структур.
|
||||||
|
lenum.getblock = Распознавание блока и его типа на координатах.\nЕдиница должна находиться в пределах досягаемости.\nТвёрдые не-постройки будут иметь тип [accent]@solid[].
|
||||||
|
lenum.within = Проверка на нахождение единицы рядом с позицией.
|
||||||
|
lenum.boost = Включение/выключение полёта.
|
||||||
|
|||||||
@@ -40,24 +40,24 @@ be.ignore = Bỏ qua
|
|||||||
be.noupdates = Không tìm thấy bản cập nhật mới.
|
be.noupdates = Không tìm thấy bản cập nhật mới.
|
||||||
be.check = Kiểm tra các bản cập nhật.
|
be.check = Kiểm tra các bản cập nhật.
|
||||||
|
|
||||||
schematic = Schematic
|
schematic = Bản thiết kế
|
||||||
schematic.add = Lưu Schematic...
|
schematic.add = Lưu bản thiết kế...
|
||||||
schematics = Schematics
|
schematics = Các bản thiết kế
|
||||||
schematic.replace = Schematics có tên đó đã tồn tại. Thay thế nó?
|
schematic.replace = Bản thiết kế có tên đó đã tồn tại. Thay thế nó?
|
||||||
schematic.exists = Schematics có tên đó đã tồn tại.
|
schematic.exists = Bản thiết kế có tên đó đã tồn tại.
|
||||||
schematic.import = Nhập Schematic...
|
schematic.import = Nhập Bản thiết kế...
|
||||||
schematic.exportfile = Xuất tệp
|
schematic.exportfile = Xuất tệp
|
||||||
schematic.importfile = Nhập tệp
|
schematic.importfile = Nhập tệp
|
||||||
schematic.browseworkshop = Duyệt qua Workshop
|
schematic.browseworkshop = Duyệt qua Workshop
|
||||||
schematic.copy = Sao chép vào bộ nhớ tạm
|
schematic.copy = Sao chép vào bộ nhớ tạm
|
||||||
schematic.copy.import = Nhập từ bộ nhớ tạm
|
schematic.copy.import = Nhập từ bộ nhớ tạm
|
||||||
schematic.shareworkshop = Chia sẻ từ Workshop
|
schematic.shareworkshop = Chia sẻ từ Workshop
|
||||||
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật Schematic
|
schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Lật bản thiết kế
|
||||||
schematic.saved = Đã lưu Schematic.
|
schematic.saved = Đã lưu bản thiết kế.
|
||||||
schematic.delete.confirm = Schematic này sẽ bị xóa hoàn toàn.
|
schematic.delete.confirm = Bản thiết kế này sẽ bị xóa hoàn toàn.
|
||||||
schematic.rename = Đổi tên Schematic
|
schematic.rename = Đổi tên bản thiết kế
|
||||||
schematic.info = {0}x{1}, {2} khối
|
schematic.info = {0}x{1}, {2} khối
|
||||||
schematic.disabled = [scarlet]Tính năng Schematics đã bị tắt[]\nBạn không được sử dụng schematic trong [accent]bản đồ[] hoặc [accent]máy chủ.
|
schematic.disabled = [scarlet]Tính năng bản thiết kế đã bị tắt[]\nBạn không được sử dụng bản thiết kế trong [accent]bản đồ[] hoặc [accent]máy chủ.
|
||||||
|
|
||||||
stats = Thống kê
|
stats = Thống kê
|
||||||
stat.wave = Đợt đã vượt qua:[accent] {0}
|
stat.wave = Đợt đã vượt qua:[accent] {0}
|
||||||
@@ -76,7 +76,7 @@ level.select = Chọn cấp độ
|
|||||||
level.mode = Chế độ:
|
level.mode = Chế độ:
|
||||||
coreattack = < Căn cứ đang bị tấn công! >
|
coreattack = < Căn cứ đang bị tấn công! >
|
||||||
nearpoint = [[ [scarlet]RỜI KHỎI ĐIỂM THẢ NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra
|
nearpoint = [[ [scarlet]RỜI KHỎI ĐIỂM THẢ NGAY LẬP TỨC[] ]\nsự hủy diệt sắp xảy ra
|
||||||
database = Cơ sở dữ liệu căn cứ
|
database = Cơ sở dữ liệu
|
||||||
savegame = Lưu trò chơi
|
savegame = Lưu trò chơi
|
||||||
loadgame = Tải trò chơi
|
loadgame = Tải trò chơi
|
||||||
joingame = Tham gia trò chơi
|
joingame = Tham gia trò chơi
|
||||||
@@ -700,11 +700,11 @@ stat.abilities = Khả năng
|
|||||||
stat.canboost = Nâng cấp
|
stat.canboost = Nâng cấp
|
||||||
stat.flying = Bay
|
stat.flying = Bay
|
||||||
|
|
||||||
ability.forcefield = Force Field
|
ability.forcefield = Tạo khiên
|
||||||
ability.repairfield = Repair Field
|
ability.repairfield = Sửa chữa/Xây dựng
|
||||||
ability.statusfield = Status Field
|
ability.statusfield = Status Field
|
||||||
ability.unitspawn = {0} Factory
|
ability.unitspawn = Sản xuất {0}
|
||||||
ability.shieldregenfield = Shield Regen Field
|
ability.shieldregenfield = Tạo khiên nhỏ
|
||||||
ability.movelightning = Movement Lightning
|
ability.movelightning = Movement Lightning
|
||||||
|
|
||||||
bar.drilltierreq = Cần máy khoan tốt hơn
|
bar.drilltierreq = Cần máy khoan tốt hơn
|
||||||
@@ -735,12 +735,12 @@ bullet.damage = [stat]{0}[lightgray] sát thương
|
|||||||
bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô
|
bullet.splashdamage = [stat]{0}[lightgray] sát thương diện rộng ~[stat] {1}[lightgray] ô
|
||||||
bullet.incendiary = [stat]cháy
|
bullet.incendiary = [stat]cháy
|
||||||
bullet.sapping = [stat]sapping
|
bullet.sapping = [stat]sapping
|
||||||
bullet.homing = [stat]homing
|
bullet.homing = [stat]truy đuổi
|
||||||
bullet.shock = [stat]sốc
|
bullet.shock = [stat]sốc
|
||||||
bullet.frag = [stat]frag
|
bullet.frag = [stat]phá mảnh
|
||||||
bullet.knockback = [stat]{0}[lightgray] bật lùi
|
bullet.knockback = [stat]{0}[lightgray] bật lùi
|
||||||
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
|
bullet.pierce = [stat]{0}[lightgray]x xuyên giáp
|
||||||
bullet.infinitepierce = [stat]pierce
|
bullet.infinitepierce = [stat]xuyên thấu
|
||||||
bullet.healpercent = [stat]{0}[lightgray]% sửa chửa
|
bullet.healpercent = [stat]{0}[lightgray]% sửa chửa
|
||||||
bullet.freezing = [stat]đóng băng
|
bullet.freezing = [stat]đóng băng
|
||||||
bullet.tarred = [stat]tarred
|
bullet.tarred = [stat]tarred
|
||||||
@@ -789,7 +789,7 @@ setting.playerindicators.name = Hướng người chơi
|
|||||||
setting.indicators.name = Hướng kẻ địch
|
setting.indicators.name = Hướng kẻ địch
|
||||||
setting.autotarget.name = Tự động nhắm mục tiêu
|
setting.autotarget.name = Tự động nhắm mục tiêu
|
||||||
setting.keyboard.name = Điều khiển bằng chuột + bàn phím
|
setting.keyboard.name = Điều khiển bằng chuột + bàn phím
|
||||||
setting.touchscreen.name = Điều khiển bằng màng hình cảm ứng
|
setting.touchscreen.name = Điều khiển bằng màn hình cảm ứng
|
||||||
setting.fpscap.name = FPS tối đa
|
setting.fpscap.name = FPS tối đa
|
||||||
setting.fpscap.none = Không giới hạn
|
setting.fpscap.none = Không giới hạn
|
||||||
setting.fpscap.text = {0} FPS
|
setting.fpscap.text = {0} FPS
|
||||||
@@ -810,13 +810,13 @@ setting.sensitivity.name = Độ nhạy điều khiển
|
|||||||
setting.saveinterval.name = Khoảng thời gian lưu
|
setting.saveinterval.name = Khoảng thời gian lưu
|
||||||
setting.seconds = {0} giây
|
setting.seconds = {0} giây
|
||||||
setting.milliseconds = {0} mili giây
|
setting.milliseconds = {0} mili giây
|
||||||
setting.fullscreen.name = Toàn màng hình
|
setting.fullscreen.name = Toàn màn hình
|
||||||
setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại)
|
setting.borderlesswindow.name = Không viền[lightgray] (yêu cầu khởi động lại)
|
||||||
setting.fps.name = Hiển thị FPS & Ping
|
setting.fps.name = Hiển thị FPS & Ping
|
||||||
setting.smoothcamera.name = Chế độ mượt mà
|
setting.smoothcamera.name = Chế độ mượt mà
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.pixelate.name = Đồ họa pixel
|
setting.pixelate.name = Đồ họa pixel
|
||||||
setting.minimap.name = Hiển thị bảng đồ mini
|
setting.minimap.name = Hiển thị bản đồ mini
|
||||||
setting.coreitems.name = Hiển thị vật phẩm trong căn cứ
|
setting.coreitems.name = Hiển thị vật phẩm trong căn cứ
|
||||||
setting.position.name = Hiển thị vị trí người chơi
|
setting.position.name = Hiển thị vị trí người chơi
|
||||||
setting.musicvol.name = Âm lượng nhạc
|
setting.musicvol.name = Âm lượng nhạc
|
||||||
@@ -855,17 +855,17 @@ keybind.clear_building.name = Xóa công trình
|
|||||||
keybind.press = Nhấn một phím...
|
keybind.press = Nhấn một phím...
|
||||||
keybind.press.axis = Nhấn một tổ hợp phím hoặc một phím...
|
keybind.press.axis = Nhấn một tổ hợp phím hoặc một phím...
|
||||||
keybind.screenshot.name = Chụp ảnh bản đồ
|
keybind.screenshot.name = Chụp ảnh bản đồ
|
||||||
keybind.toggle_power_lines.name = Toggle Power Lasers
|
keybind.toggle_power_lines.name = Ẩn/Hiện đường truyền năng lượng
|
||||||
keybind.toggle_block_status.name = Toggle Block Statuses
|
keybind.toggle_block_status.name = Ẩn/Hiện trạng thái khối
|
||||||
keybind.move_x.name = Di chuyển X
|
keybind.move_x.name = Di chuyển X
|
||||||
keybind.move_y.name = Di chuyển Y
|
keybind.move_y.name = Di chuyển Y
|
||||||
keybind.mouse_move.name = Theo chuột
|
keybind.mouse_move.name = Theo chuột
|
||||||
keybind.pan.name = Xem Pan
|
keybind.pan.name = Di chuyển góc nhìn
|
||||||
keybind.boost.name = Tăng tốc
|
keybind.boost.name = Tăng tốc
|
||||||
keybind.schematic_select.name = Chọn khu vực
|
keybind.schematic_select.name = Chọn khu vực
|
||||||
keybind.schematic_menu.name = Menu Schematic
|
keybind.schematic_menu.name = Menu bản thiết kế
|
||||||
keybind.schematic_flip_x.name = Lật Schematic X
|
keybind.schematic_flip_x.name = Lật bản thiết kế X
|
||||||
keybind.schematic_flip_y.name = Lật Schematic Y
|
keybind.schematic_flip_y.name = Lật bản thiết kế Y
|
||||||
keybind.category_prev.name = Danh mục trước
|
keybind.category_prev.name = Danh mục trước
|
||||||
keybind.category_next.name = Danh mục tiếp theo
|
keybind.category_next.name = Danh mục tiếp theo
|
||||||
keybind.block_select_left.name = Chọn khối trái
|
keybind.block_select_left.name = Chọn khối trái
|
||||||
@@ -903,8 +903,8 @@ keybind.chat.name = Trò chuyện
|
|||||||
keybind.player_list.name = Danh sách người chơi
|
keybind.player_list.name = Danh sách người chơi
|
||||||
keybind.console.name = Bảng điều khiển
|
keybind.console.name = Bảng điều khiển
|
||||||
keybind.rotate.name = Xoay
|
keybind.rotate.name = Xoay
|
||||||
keybind.rotateplaced.name = Xoay hiện có (Giữ)
|
keybind.rotateplaced.name = Xoay khối (Giữ)
|
||||||
keybind.toggle_menus.name = Chuyển đổi Menus
|
keybind.toggle_menus.name = Ẩn/Hiện Menus
|
||||||
keybind.chat_history_prev.name = Lịch sử trò chuyện trước
|
keybind.chat_history_prev.name = Lịch sử trò chuyện trước
|
||||||
keybind.chat_history_next.name = Lịch sử trò chuyện sau
|
keybind.chat_history_next.name = Lịch sử trò chuyện sau
|
||||||
keybind.chat_scroll.name = Cuộn trò chuyện
|
keybind.chat_scroll.name = Cuộn trò chuyện
|
||||||
@@ -924,7 +924,7 @@ mode.custom = Tùy chỉnh luật
|
|||||||
|
|
||||||
rules.infiniteresources = Tài nguyên vô hạn
|
rules.infiniteresources = Tài nguyên vô hạn
|
||||||
rules.reactorexplosions = Nổ lò phản ứng
|
rules.reactorexplosions = Nổ lò phản ứng
|
||||||
rules.schematic = Cho phép dùng schematic
|
rules.schematic = Cho phép dùng bản thiết kế
|
||||||
rules.wavetimer = Đếm ngược đợt
|
rules.wavetimer = Đếm ngược đợt
|
||||||
rules.waves = Đợt
|
rules.waves = Đợt
|
||||||
rules.attack = Chế độ tấn công
|
rules.attack = Chế độ tấn công
|
||||||
@@ -977,7 +977,7 @@ item.surge-alloy.name = Hợp kim
|
|||||||
item.spore-pod.name = Vỏ bào tử
|
item.spore-pod.name = Vỏ bào tử
|
||||||
item.sand.name = Cát
|
item.sand.name = Cát
|
||||||
item.blast-compound.name = Chất nổ
|
item.blast-compound.name = Chất nổ
|
||||||
item.pyratite.name = Tiền chất nổ
|
item.pyratite.name = Nhiệt thạch
|
||||||
item.metaglass.name = Thuỷ tinh
|
item.metaglass.name = Thuỷ tinh
|
||||||
item.scrap.name = Phế liệu
|
item.scrap.name = Phế liệu
|
||||||
liquid.water.name = Nước
|
liquid.water.name = Nước
|
||||||
@@ -1044,7 +1044,7 @@ block.moss.name = Rêu
|
|||||||
block.shrubs.name = Bụi cây
|
block.shrubs.name = Bụi cây
|
||||||
block.spore-moss.name = Rêu bào tử
|
block.spore-moss.name = Rêu bào tử
|
||||||
block.shale-wall.name = Tường đá phiến sét
|
block.shale-wall.name = Tường đá phiến sét
|
||||||
block.scrap-wall.name = Tường sắt vụn
|
block.scrap-wall.name = Tường phế liệu
|
||||||
block.scrap-wall-large.name = Tường phế liệu lớn
|
block.scrap-wall-large.name = Tường phế liệu lớn
|
||||||
block.scrap-wall-huge.name = Tường phế liệu khổng lồ
|
block.scrap-wall-huge.name = Tường phế liệu khổng lồ
|
||||||
block.scrap-wall-gigantic.name = Tường phế liệu siêu khổng lồ
|
block.scrap-wall-gigantic.name = Tường phế liệu siêu khổng lồ
|
||||||
@@ -1105,8 +1105,8 @@ block.copper-wall.name = Tường đồng
|
|||||||
block.copper-wall-large.name = Tường đồng lớn
|
block.copper-wall-large.name = Tường đồng lớn
|
||||||
block.titanium-wall.name = Tường titan
|
block.titanium-wall.name = Tường titan
|
||||||
block.titanium-wall-large.name = Tường titan lớn
|
block.titanium-wall-large.name = Tường titan lớn
|
||||||
block.plastanium-wall.name = Tường Plastanium
|
block.plastanium-wall.name = Tường Nhựa
|
||||||
block.plastanium-wall-large.name = Tường Plastanium lớn
|
block.plastanium-wall-large.name = Tường Nhựa lớn
|
||||||
block.phase-wall.name = Tường Phase
|
block.phase-wall.name = Tường Phase
|
||||||
block.phase-wall-large.name = Tường Phase lớn
|
block.phase-wall-large.name = Tường Phase lớn
|
||||||
block.thorium-wall.name = Tường Thorium
|
block.thorium-wall.name = Tường Thorium
|
||||||
@@ -1122,9 +1122,9 @@ block.conveyor.name = Băng chuyền
|
|||||||
block.titanium-conveyor.name = Băng chuyền titan
|
block.titanium-conveyor.name = Băng chuyền titan
|
||||||
block.plastanium-conveyor.name = Băng chuyền nhựa
|
block.plastanium-conveyor.name = Băng chuyền nhựa
|
||||||
block.armored-conveyor.name = Băng chuyền bọc giáp
|
block.armored-conveyor.name = Băng chuyền bọc giáp
|
||||||
block.junction.name = Junction
|
block.junction.name = Giao điểm
|
||||||
block.router.name = Bộ định tuyến
|
block.router.name = Bộ phân phát
|
||||||
block.distributor.name = Bộ phân phát
|
block.distributor.name = Bộ phân phát lớn
|
||||||
block.sorter.name = Bộ lọc
|
block.sorter.name = Bộ lọc
|
||||||
block.inverted-sorter.name = Bộ lọc ngược
|
block.inverted-sorter.name = Bộ lọc ngược
|
||||||
block.message.name = Thông điệp
|
block.message.name = Thông điệp
|
||||||
@@ -1134,8 +1134,8 @@ block.underflow-gate.name = Cổng tràn ngược
|
|||||||
block.silicon-smelter.name = Máy nấu silicon
|
block.silicon-smelter.name = Máy nấu silicon
|
||||||
block.phase-weaver.name = Máy tạo Phase
|
block.phase-weaver.name = Máy tạo Phase
|
||||||
block.pulverizer.name = Máy nghiền
|
block.pulverizer.name = Máy nghiền
|
||||||
block.cryofluid-mixer.name = Máy sản xuất chất làm mát
|
block.cryofluid-mixer.name = Máy sản xuất chất làm lạnh
|
||||||
block.melter.name = Máy nung chảy
|
block.melter.name = Lò nung chảy
|
||||||
block.incinerator.name = Máy phân hủy
|
block.incinerator.name = Máy phân hủy
|
||||||
block.spore-press.name = Máy nén bào tử
|
block.spore-press.name = Máy nén bào tử
|
||||||
block.separator.name = Máy phân tách
|
block.separator.name = Máy phân tách
|
||||||
@@ -1171,9 +1171,9 @@ block.swarmer.name = Swarmer
|
|||||||
block.salvo.name = Salvo
|
block.salvo.name = Salvo
|
||||||
block.ripple.name = Ripple
|
block.ripple.name = Ripple
|
||||||
block.phase-conveyor.name = Phase Conveyor
|
block.phase-conveyor.name = Phase Conveyor
|
||||||
block.bridge-conveyor.name = Bridge Conveyor
|
block.bridge-conveyor.name = Cầu dẫn
|
||||||
block.plastanium-compressor.name = Máy sản xuất nhựa
|
block.plastanium-compressor.name = Máy sản xuất nhựa
|
||||||
block.pyratite-mixer.name = Máy trộn tiền chất nổ
|
block.pyratite-mixer.name = Máy trộn nhiệt thạch
|
||||||
block.blast-mixer.name = Máy trộn chất nổ
|
block.blast-mixer.name = Máy trộn chất nổ
|
||||||
block.solar-panel.name = Pin mặt trời
|
block.solar-panel.name = Pin mặt trời
|
||||||
block.solar-panel-large.name = Pin mặt trời lớn
|
block.solar-panel-large.name = Pin mặt trời lớn
|
||||||
@@ -1182,10 +1182,10 @@ block.repair-point.name = Điểm sửa chữa
|
|||||||
block.pulse-conduit.name = Ống dẫn titan
|
block.pulse-conduit.name = Ống dẫn titan
|
||||||
block.plated-conduit.name = Ống dẫn bọc giáp
|
block.plated-conduit.name = Ống dẫn bọc giáp
|
||||||
block.phase-conduit.name = Ống dẫn Phase
|
block.phase-conduit.name = Ống dẫn Phase
|
||||||
block.liquid-router.name = Bộ định tuyến chất lỏng
|
block.liquid-router.name = Bộ phân phát chất lỏng
|
||||||
block.liquid-tank.name = Thùng chất lỏng
|
block.liquid-tank.name = Thùng chất lỏng
|
||||||
block.liquid-junction.name = Liquid Junction
|
block.liquid-junction.name = Giao điểm chất lỏng
|
||||||
block.bridge-conduit.name = Bridge Conduit
|
block.bridge-conduit.name = Cầu dẫn chất lỏng
|
||||||
block.rotary-pump.name = Bơm điện
|
block.rotary-pump.name = Bơm điện
|
||||||
block.thorium-reactor.name = Lò phản ứng Thorium
|
block.thorium-reactor.name = Lò phản ứng Thorium
|
||||||
block.mass-driver.name = Máy phóng điện từ
|
block.mass-driver.name = Máy phóng điện từ
|
||||||
@@ -1227,11 +1227,11 @@ block.overdrive-dome.name = Máy tăng tốc lớn
|
|||||||
#experimental, may be removed
|
#experimental, may be removed
|
||||||
block.block-forge.name = Block Forge
|
block.block-forge.name = Block Forge
|
||||||
block.block-loader.name = Block Loader
|
block.block-loader.name = Block Loader
|
||||||
block.block-unloader.name = Block Unloader
|
block.block-unloader.name = Điểm dỡ hàng
|
||||||
block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh
|
block.interplanetary-accelerator.name = Máy gia tốc liên hành tinh
|
||||||
|
|
||||||
block.switch.name = Công tắc
|
block.switch.name = Công tắc
|
||||||
block.micro-processor.name = Bộ xử lí mini
|
block.micro-processor.name = Bộ xử lí nhỏ
|
||||||
block.logic-processor.name = Bộ xử lý
|
block.logic-processor.name = Bộ xử lý
|
||||||
block.hyper-processor.name = Bộ xử lý lớn
|
block.hyper-processor.name = Bộ xử lý lớn
|
||||||
block.logic-display.name = Màn hình
|
block.logic-display.name = Màn hình
|
||||||
@@ -1315,15 +1315,15 @@ block.armored-conveyor.description = Vận chuyển vật phẩm về phía. Kh
|
|||||||
block.illuminator.description = Phát sáng.
|
block.illuminator.description = Phát sáng.
|
||||||
block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội.
|
block.message.description = Lưu trữ tin nhắn giao tiếp giữa đồng đội.
|
||||||
block.graphite-press.description = Nén than thành than chì.
|
block.graphite-press.description = Nén than thành than chì.
|
||||||
block.multi-press.description = Nén than thành than chì. Cần nước làm chất làm mát.
|
block.multi-press.description = Nén than thành than chì. Cần nước làm mát.
|
||||||
block.silicon-smelter.description = Tinh chế silicon từ cát và than.
|
block.silicon-smelter.description = Tinh chế silicon từ cát và than.
|
||||||
block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh.
|
block.kiln.description = Nấu chảy cát và chì thành thuỷ tinh.
|
||||||
block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan.
|
block.plastanium-compressor.description = Sản xuất nhựa từ dầu và titan.
|
||||||
block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát.
|
block.phase-weaver.description = Tổng hợp phase fabric từ thorium và cát.
|
||||||
block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim.
|
block.alloy-smelter.description = Trộn titan, chì, silicon và đồng thành hợp kim.
|
||||||
block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát.
|
block.cryofluid-mixer.description = Trộn nước và bột titan để sản xuất chất làm mát.
|
||||||
block.blast-mixer.description = Tạo ra hợp chất nổ từ tiền chất nổ và vỏ bào tử.
|
block.blast-mixer.description = Tạo ra hợp chất nổ từ nhiệt thạch và vỏ bào tử.
|
||||||
block.pyratite-mixer.description = Trộn than, chì và cát thành tiền chất nổ.
|
block.pyratite-mixer.description = Trộn than, chì và cát thành nhiệt thạch.
|
||||||
block.melter.description = Nung phế liệu thành xỉ.
|
block.melter.description = Nung phế liệu thành xỉ.
|
||||||
block.separator.description = Tách xỉ thành các thành phần khoáng của nó.
|
block.separator.description = Tách xỉ thành các thành phần khoáng của nó.
|
||||||
block.spore-press.description = Nén vỏ bào tử thành dầu.
|
block.spore-press.description = Nén vỏ bào tử thành dầu.
|
||||||
@@ -1389,7 +1389,7 @@ block.battery-large.description = Tích trữ năng lượng khi dư thừa. Xu
|
|||||||
block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dễ cháy như than.
|
block.combustion-generator.description = Tạo ra năng lượng bằng cách đốt các vật liệu dễ cháy như than.
|
||||||
block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nơi nóng.
|
block.thermal-generator.description = Tạo ra năng lượng khi đặt ở những nơi nóng.
|
||||||
block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dễ cháy và chuyển nước thành hơi nước.
|
block.steam-generator.description = Tạo ra năng lượng bằng cách đốt cháy các vật liệu dễ cháy và chuyển nước thành hơi nước.
|
||||||
block.differential-generator.description = Tạo ra một lượng lớn năng lượng. Sử dụng sự chênh lệch nhiệt độ giữa cryofluid và pyratite đang cháy.
|
block.differential-generator.description = Tạo ra một lượng lớn năng lượng. Sử dụng sự chênh lệch nhiệt độ giữa chất làm lạnh và nhiệt thạch đang cháy.
|
||||||
block.rtg-generator.description = Sử dụng nhiệt của các hợp chất phóng xạ đang phân hủy để tạo ra năng lượng với tốc độ chậm.
|
block.rtg-generator.description = Sử dụng nhiệt của các hợp chất phóng xạ đang phân hủy để tạo ra năng lượng với tốc độ chậm.
|
||||||
block.solar-panel.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời.
|
block.solar-panel.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời.
|
||||||
block.solar-panel-large.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. Hiệu quả hơn pin mặt trời tiêu chuẩn.
|
block.solar-panel-large.description = Cung cấp một lượng nhỏ năng lượng từ mặt trời. Hiệu quả hơn pin mặt trời tiêu chuẩn.
|
||||||
@@ -1405,10 +1405,10 @@ block.cultivator.details = Công nghệ được phục hồi. Được sử d
|
|||||||
block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu.
|
block.oil-extractor.description = Sử dụng lượng năng lượng năng lớn, sử dụng cát và nước để khoan dầu.
|
||||||
block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất.
|
block.core-shard.description = Trung tâm của căn cứ. Sau khi bị phá hủy, khu vực này sẽ bị mất.
|
||||||
block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh.
|
block.core-shard.details = Lần thử đầu tiên. Gọn nhẹ. Tự thay thế. Được trang bị tên lửa đẩy dùng một lần. Không được thiết kế để di chuyển giữa các hành tinh.
|
||||||
block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Stores more resources than a Shard.
|
block.core-foundation.description = Trung tâm của căn cứ. Được bọc giáp. Chứa được nhiều tài nguyên hơn Căn cứ: Cơ sỏ.
|
||||||
block.core-foundation.details = The second iteration.
|
block.core-foundation.details = Căn cứ cấp 2.
|
||||||
block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên.
|
block.core-nucleus.description = Lõi của căn cứ. Bọc giáp chắc chắn. Lưu trữ lượng lớn tài nguyên.
|
||||||
block.core-nucleus.details = Lần thử thứ ba và lần thử cuối.
|
block.core-nucleus.details = Căn cứ cấp 3 và cũng là cấp cao nhất.
|
||||||
block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
|
block.vault.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
|
||||||
block.container.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
|
block.container.description = Lưu trữ lượng lớn vật phẩm mỗi loại. Nội dung có thể được lấy ra với điểm dỡ hàng.
|
||||||
block.unloader.description = Lấy các vật phẩm được chọn từ các ô gần đó.
|
block.unloader.description = Lấy các vật phẩm được chọn từ các ô gần đó.
|
||||||
@@ -1421,17 +1421,17 @@ block.wave.description = Phóng một tia chất lỏng vào kẻ địch. Tự
|
|||||||
block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất.
|
block.lancer.description = Tích tụ và phóng tia năng lượng mạnh vào kẻ địch trên mặt đất.
|
||||||
block.arc.description = Phóng tia điện vào kẻ địch trên mặt đất.
|
block.arc.description = Phóng tia điện vào kẻ địch trên mặt đất.
|
||||||
block.swarmer.description = Bắn tên lửa truy đuổi vào kẻ địch.
|
block.swarmer.description = Bắn tên lửa truy đuổi vào kẻ địch.
|
||||||
block.salvo.description = Bắn đạn salvo vào kẻ địch.
|
block.salvo.description = Bắn loạt đạn vào kẻ địch.
|
||||||
block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch.
|
block.fuse.description = Bắn ba đạn xuyên giáp tầm gần vào kẻ địch.
|
||||||
block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa.
|
block.ripple.description = Bắn cụm đạn vào kẻ địch trên mặt đất ở tầm xa.
|
||||||
block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần.
|
block.cyclone.description = Bắn đạn nổ vào kẻ địch ở gần.
|
||||||
block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất.
|
block.spectre.description = Bắn đạn xuyên giáp lớn ở kẻ địch trên không và trên mặt đất.
|
||||||
block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động.
|
block.meltdown.description = Nạp và bắn một tia laser liên tục vào kẻ địch ở gần. Cần có chất làm mát để hoạt động.
|
||||||
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa.
|
block.foreshadow.description = Bắn viên một viên đạn tỉa lớn ở tầm xa.
|
||||||
block.repair-point.description = Liên tục sửa chữa robot ở gần trong phạm vi hoạt động.
|
block.repair-point.description = Liên tục sửa chữa robot ở trong phạm vi hoạt động.
|
||||||
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
|
block.segment.description = Gây hư hại và phá hủy đạn đến. Ngoại trừ tia laser.
|
||||||
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
|
block.parallax.description = Bắn một tia kéo máy bay địch và làm hư hỏng nó trong quá trình kéo.
|
||||||
block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước.
|
block.tsunami.description = Phóng một tia chất lỏng mạnh vào kẻ địch. Tự chữa cháy nếu được cung cấp nước hoặc chất làm mát.
|
||||||
block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng.
|
block.silicon-crucible.description = Tinh chế silicon từ cát và than, sử dụng tiền chất nổ làm nguồn nhiệt phụ. Có hiệu quả cao hơn khi ở nơi nóng.
|
||||||
block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium.
|
block.disassembler.description = Tách xỉ thành các kim loại khác nhau với hiệu suất thấp. Có thể sản xuất thorium.
|
||||||
block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động.
|
block.overdrive-dome.description = Tăng tốc độ làm việc của các công trình lân cận. Sử dụng phase fabric and silicon để hoạt động.
|
||||||
@@ -1447,12 +1447,12 @@ block.exponential-reconstructor.description = Nâng cấp quân của bạn lên
|
|||||||
block.tetrative-reconstructor.description = Nâng cấp quân của bạn nên cấp năm (cuối cùng).
|
block.tetrative-reconstructor.description = Nâng cấp quân của bạn nên cấp năm (cuối cùng).
|
||||||
block.switch.description = Công tắc, trạng thái có thể được đọc và điều khiển với vi xử lí logic.
|
block.switch.description = Công tắc, trạng thái có thể được đọc và điều khiển với vi xử lí logic.
|
||||||
block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình.
|
block.micro-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình.
|
||||||
block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn vi xử lí micro.
|
block.logic-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn bộ xử lí nhỏ.
|
||||||
block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn vi xử lí logic.
|
block.hyper-processor.description = Chạy tập hợp các chỉ dẫn trong một vòng lặp, có thể dùng để điều khiển robot và công trình. Nhanh hơn bộ xử lí.
|
||||||
block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí logic.
|
block.memory-cell.description = Lưu trữ thông tin cho bộ xử lí.
|
||||||
block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí logic. Dung lượng cao.
|
block.memory-bank.description = Lưu trữ thông tin cho bộ xử lí. Dung lượng cao.
|
||||||
block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic.
|
block.logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
|
||||||
block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí logic.
|
block.large-logic-display.description = Hiển thị đồ họa tùy ý từ bộ xử lí.
|
||||||
block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh.
|
block.interplanetary-accelerator.description = Tòa súng từ trường cỡ lớn. Tăng tốc vật phóng đến vận tốc thoát để di chuyển giữa các hành tinh.
|
||||||
|
|
||||||
unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh.
|
unit.dagger.description = Bắn đạn tiêu chuẩn vào tất cả kẻ địch xung quanh.
|
||||||
@@ -1466,7 +1466,7 @@ unit.quasar.description = Bắn tia laser xuyên giáp làm tổn hại kẻ đ
|
|||||||
unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sửa chữa các tòa nhà. Có khả năng bay.
|
unit.vela.description = Bắn tia laser liên tục xuyên giáp làm tổn hại kẻ địch, gây cháy và sửa chữa các tòa nhà. Có khả năng bay.
|
||||||
unit.corvus.description = Bắn đia laser đánh bật kẻ địch và sửa chữa các tòa nhà. Có thể đi qua đa số địa hình.
|
unit.corvus.description = Bắn đia laser đánh bật kẻ địch và sửa chữa các tòa nhà. Có thể đi qua đa số địa hình.
|
||||||
unit.crawler.description = Chạy đến kẻ địch và nổ.
|
unit.crawler.description = Chạy đến kẻ địch và nổ.
|
||||||
unit.atrax.description = Bắn cục xỉ vào kẻ địch trên mặt đất. Có thể đi qua đa số địa hình.
|
unit.atrax.description = Phun xỉ nóng chảy vào kẻ địch trên mặt đất. Có thể đi qua đa số địa hình.
|
||||||
unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tự sửa chữa nó. Có thể đi qua đa số địa hình.
|
unit.spiroct.description = Bắn tia laser vào kẻ địch trên mặt đất và tự sửa chữa nó. Có thể đi qua đa số địa hình.
|
||||||
unit.arkyid.description = Bắn tia laser lớn vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
|
unit.arkyid.description = Bắn tia laser lớn vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
|
||||||
unit.toxopid.description = Bắn chùm đạn điện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
|
unit.toxopid.description = Bắn chùm đạn điện và tia laser xuyên giáp vào kẻ địch trên mặt đất và tự sửa chữa chính nó. Có thể đi qua đa số địa hình.
|
||||||
@@ -1479,12 +1479,12 @@ unit.mono.description = Tự động khai thác đồng và chì, và vận chuy
|
|||||||
unit.poly.description = Tự động xây dựng lại các công trình bị hỏng và hỗ trợ các quân lính khác thi công.
|
unit.poly.description = Tự động xây dựng lại các công trình bị hỏng và hỗ trợ các quân lính khác thi công.
|
||||||
unit.mega.description = Tự động sửa chữa các công trình bị hỏng. Có khả năng mang bộ binh nhỏ.
|
unit.mega.description = Tự động sửa chữa các công trình bị hỏng. Có khả năng mang bộ binh nhỏ.
|
||||||
unit.quad.description = Thả bom to lên kẻ địch, sửa chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bộ binh vừa.
|
unit.quad.description = Thả bom to lên kẻ địch, sửa chữa các tòa nhà và tổn hại kẻ địch. Có khả năng mang bộ binh vừa.
|
||||||
unit.oct.description = Bảo vệ đồng minh với giáp. Có kả năng mang đa số bộ binh.
|
unit.oct.description = Bảo vệ đồng minh với giáp. Có khả năng mang đa số bộ binh.
|
||||||
unit.risso.description = Bắn chùm tên lửa và đạn lên kẻ địch tầm gần.
|
unit.risso.description = Bắn chùm tên lửa và đạn lên kẻ địch tầm gần.
|
||||||
unit.minke.description = Bắn đạn và đạn thường lên kẻ địch tầm gần trên mặt đất.
|
unit.minke.description = Bắn đạn và đạn thường lên kẻ địch tầm gần trên mặt đất.
|
||||||
unit.bryde.description = Bắn đạn tầm xa và tên lửa vào kẻ địch.
|
unit.bryde.description = Bắn đạn tầm xa và tên lửa vào kẻ địch.
|
||||||
unit.sei.description = Bắn chùm tên lửa và đạn xuyên giáp vào kẻ địch.
|
unit.sei.description = Bắn chùm tên lửa và đạn xuyên giáp vào kẻ địch.
|
||||||
unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào kẻ địch. Tạo nên drone báo hiệu.
|
unit.omura.description = Bắn đạn từ trường xuyên giáp tầm xa vào kẻ địch. Tạo nên Flare.
|
||||||
unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng.
|
unit.alpha.description = Bảo vệ căn cứ cơ sở khỏi kẻ thù. Có thể xây dựng.
|
||||||
unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng.
|
unit.beta.description = Bảo vệ căn cứ trụ sở khỏi kẻ thù. Có thể xây dựng.
|
||||||
unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng.
|
unit.gamma.description = Bảo vệ căn cứ trung tâm khỏi kẻ thù. Có thể xây dựng.
|
||||||
|
|||||||
@@ -41,10 +41,11 @@ be.ignore = 忽略
|
|||||||
be.noupdates = 沒有新的更新。
|
be.noupdates = 沒有新的更新。
|
||||||
be.check = 檢查是否有新的更新
|
be.check = 檢查是否有新的更新
|
||||||
|
|
||||||
mod.featured.dialog.title = 模組瀏覽器 (尚未完成)
|
mods.browser = 模組瀏覽器
|
||||||
mods.browser.selected = 已選模組
|
mods.browser.selected = 已選模組
|
||||||
mods.browser.add = 安裝
|
mods.browser.add = 安裝
|
||||||
mods.github.open = 查看
|
mods.github.reinstall = 重新安裝
|
||||||
|
mods.github.open = 查看Github
|
||||||
mods.browser.sortdate = 以最近篩選
|
mods.browser.sortdate = 以最近篩選
|
||||||
mods.browser.sortstars = 以星數篩選
|
mods.browser.sortstars = 以星數篩選
|
||||||
|
|
||||||
@@ -118,9 +119,11 @@ mods.none = [lightgray]找不到模組!
|
|||||||
mods.guide = 模組指南
|
mods.guide = 模組指南
|
||||||
mods.report = 回報錯誤
|
mods.report = 回報錯誤
|
||||||
mods.openfolder = 開啟模組資料夾
|
mods.openfolder = 開啟模組資料夾
|
||||||
|
mods.viewcontent = 查看內容
|
||||||
mods.reload = 重新載入
|
mods.reload = 重新載入
|
||||||
mods.reloadexit = 遊戲將會結束以重新載入模組。
|
mods.reloadexit = 遊戲將會結束以重新載入模組。
|
||||||
mod.display = [gray]模組:[orange]{0}
|
mod.display = [gray]模組:[orange]{0}
|
||||||
|
mod.installed = [[已安裝]
|
||||||
mod.enabled = [lightgray]已啟用
|
mod.enabled = [lightgray]已啟用
|
||||||
mod.disabled = [scarlet]已禁用
|
mod.disabled = [scarlet]已禁用
|
||||||
mod.disable = 禁用
|
mod.disable = 禁用
|
||||||
@@ -309,6 +312,7 @@ cancelbuilding = [accent][[{0}][]清除計畫
|
|||||||
selectschematic = [accent][[{0}][]選擇並複製
|
selectschematic = [accent][[{0}][]選擇並複製
|
||||||
pausebuilding = [accent][[{0}][]暫停建造
|
pausebuilding = [accent][[{0}][]暫停建造
|
||||||
resumebuilding = [scarlet][[{0}][]繼續建造
|
resumebuilding = [scarlet][[{0}][]繼續建造
|
||||||
|
enablebuilding = [scarlet][[{0}][]啟用建造
|
||||||
showui = 已隱藏介面。\n按[accent][[{0}][]顯示介面。
|
showui = 已隱藏介面。\n按[accent][[{0}][]顯示介面。
|
||||||
wave = [accent]第{0}波
|
wave = [accent]第{0}波
|
||||||
wave.cap = [accent]Wave {0}/{1}
|
wave.cap = [accent]Wave {0}/{1}
|
||||||
@@ -422,7 +426,7 @@ editor.exportimage = 匯出地形圖片檔
|
|||||||
editor.exportimage.description = 匯出地形圖片檔
|
editor.exportimage.description = 匯出地形圖片檔
|
||||||
editor.loadimage = 載入圖片
|
editor.loadimage = 載入圖片
|
||||||
editor.saveimage = 儲存圖片
|
editor.saveimage = 儲存圖片
|
||||||
editor.unsaved = [scarlet]尚未儲存變更![]\n您確定要退出嗎?
|
editor.unsaved = 您確定要退出嗎?\n[scarlet](將遺失未儲存的變更)[]
|
||||||
editor.resizemap = 調整地圖大小
|
editor.resizemap = 調整地圖大小
|
||||||
editor.mapname = 地圖名稱:
|
editor.mapname = 地圖名稱:
|
||||||
editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
|
editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
|
||||||
@@ -680,6 +684,7 @@ stat.drillspeed = 基本鑽取速度
|
|||||||
stat.boosteffect = 加速效果
|
stat.boosteffect = 加速效果
|
||||||
stat.maxunits = 最大活躍單位
|
stat.maxunits = 最大活躍單位
|
||||||
stat.health = 耐久度
|
stat.health = 耐久度
|
||||||
|
stat.armor = 裝甲
|
||||||
stat.buildtime = 建設時間
|
stat.buildtime = 建設時間
|
||||||
stat.maxconsecutive = 最大連續
|
stat.maxconsecutive = 最大連續
|
||||||
stat.buildcost = 建造成本
|
stat.buildcost = 建造成本
|
||||||
@@ -791,6 +796,7 @@ setting.shadows.name = 陰影
|
|||||||
setting.blockreplace.name = 方塊建造建議
|
setting.blockreplace.name = 方塊建造建議
|
||||||
setting.linear.name = 線性過濾
|
setting.linear.name = 線性過濾
|
||||||
setting.hints.name = 提示
|
setting.hints.name = 提示
|
||||||
|
setting.logichints.name = 邏輯提示
|
||||||
setting.flow.name = 顯示資源輸送速度
|
setting.flow.name = 顯示資源輸送速度
|
||||||
setting.backgroundpause.name = 背景執行時暫停
|
setting.backgroundpause.name = 背景執行時暫停
|
||||||
setting.buildautopause.name = 自動暫停建築
|
setting.buildautopause.name = 自動暫停建築
|
||||||
@@ -951,6 +957,8 @@ rules.blockdamagemultiplier = 建築物傷害倍數
|
|||||||
rules.unitbuildspeedmultiplier = 單位建設速度倍數
|
rules.unitbuildspeedmultiplier = 單位建設速度倍數
|
||||||
rules.unithealthmultiplier = 單位生命值倍數
|
rules.unithealthmultiplier = 單位生命值倍數
|
||||||
rules.unitdamagemultiplier = 單位傷害倍數
|
rules.unitdamagemultiplier = 單位傷害倍數
|
||||||
|
rules.unitcapvariable = 核心限制單位上限
|
||||||
|
rules.unitcap = 基礎單位上限
|
||||||
rules.enemycorebuildradius = 敵人核心禁止建設半徑︰[lightgray](格)
|
rules.enemycorebuildradius = 敵人核心禁止建設半徑︰[lightgray](格)
|
||||||
rules.wavespacing = 波次間距︰[lightgray](秒)
|
rules.wavespacing = 波次間距︰[lightgray](秒)
|
||||||
rules.buildcostmultiplier = 建設成本倍數
|
rules.buildcostmultiplier = 建設成本倍數
|
||||||
@@ -1508,3 +1516,139 @@ unit.omura.description = 對敵人發射遠程穿透型砲彈。建造曳光戰
|
|||||||
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
|
unit.alpha.description = 抵禦敵軍對核心:碎片的攻擊。建造建築物。
|
||||||
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
|
unit.beta.description = 抵禦敵軍對核心:基地的攻擊。建造建築物。
|
||||||
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。
|
unit.gamma.description = 抵禦敵軍對核心:核子的攻擊。建造建築物。
|
||||||
|
|
||||||
|
lst.read = [accent]讀取[]記憶體中的一項數值
|
||||||
|
lst.write = [accent]寫入[]一項數值到記憶體中
|
||||||
|
lst.print = 將文字加入輸出的暫存中,搭配[accent]Print Flush[]使用
|
||||||
|
lst.draw = 將圖形加入顯示的暫存中,搭配[accent]Draw Flush[]使用
|
||||||
|
lst.drawflush = 將所有暫存的[accent]Draw[]指令推到顯示器上
|
||||||
|
lst.printflush = 將所有暫存的[accent]Print[]指令推到訊息板上
|
||||||
|
lst.getlink = 由連接順序回傳連接的建築,第一個從"0"開始
|
||||||
|
lst.control = 控制一個建築
|
||||||
|
lst.radar = 偵測建築範圍內的單位
|
||||||
|
lst.sensor = 獲取該建築或單位的數據
|
||||||
|
lst.set = 設一個變數
|
||||||
|
lst.operation = 加減乘除和計算機概論
|
||||||
|
lst.end = 跳到第一個重頭開始執行
|
||||||
|
lst.jump = 條件式跳到其他指令執行
|
||||||
|
lst.unitbind = 綁定下一同種單位,存入[accent]@unit[]中.
|
||||||
|
lst.unitcontrol = 控制現在綁定的單位
|
||||||
|
lst.unitradar = 偵測綁定單位附近的單位
|
||||||
|
lst.unitlocate = 尋找整個地圖上特定的位置/建築\n需要綁定的單位
|
||||||
|
|
||||||
|
lenum.type = 建築/單位種類。\n例:操控單位建造光矛砲應使用[accent]@lancer[],而非字串
|
||||||
|
lenum.shoot = 對該位置開火
|
||||||
|
lenum.shootp = 對指定單位/建築開火,具自瞄功能
|
||||||
|
lenum.configure = 建築設定,如分類器、兵器工廠
|
||||||
|
lenum.enabled = 確認該建築是否啟用
|
||||||
|
|
||||||
|
laacess.color = 設定照明燈的顏色
|
||||||
|
|
||||||
|
graphicstype.clear = 重製版面為指定顏色
|
||||||
|
graphicstype.color = 為接下來的圖畫指令設定顏色
|
||||||
|
graphicstype.stroke = 為接下來的圖畫指令設定直線寬度
|
||||||
|
graphicstype.line = 畫一直線
|
||||||
|
graphicstype.rect = 畫實心長方形
|
||||||
|
graphicstype.linerect = 畫空心長方形
|
||||||
|
graphicstype.poly = 畫實心正多邊形
|
||||||
|
graphicstype.linepoly = 畫空心正多邊形
|
||||||
|
graphicstype.triangle = 畫實心三角形
|
||||||
|
graphicstype.image = 繪製內建圖畫\n如: [accent]@router[]或[accent]@dagger[].
|
||||||
|
|
||||||
|
lenum.always = 永遠 true (直接跳).
|
||||||
|
lenum.idiv = 整數除法,無條件捨去.
|
||||||
|
lenum.div = 除法.\n除以零時回傳 [accent]null[]
|
||||||
|
lenum.mod = Modulo,求餘數
|
||||||
|
lenum.equal = 是否相等,不管資料型態。\n非null 物件和數值相比時回傳1
|
||||||
|
lenum.notequal = 不相等,不管資料型態.
|
||||||
|
lenum.strictequal = 嚴格檢查是否相等,會看資料型態。\n可用來檢查[accent]null[]
|
||||||
|
lenum.shl = Bit-shift left.
|
||||||
|
lenum.shr = Bit-shift right.
|
||||||
|
lenum.or = Bitwise OR.
|
||||||
|
lenum.land = Logical AND.
|
||||||
|
lenum.and = Bitwise AND.
|
||||||
|
lenum.not = Bitwise flip.
|
||||||
|
lenum.xor = Bitwise XOR.
|
||||||
|
|
||||||
|
lenum.min = 兩數取小
|
||||||
|
lenum.max = 兩數取大
|
||||||
|
lenum.angle = 向量與x軸夾角
|
||||||
|
lenum.len = 向量長度
|
||||||
|
lenum.sin = 度數Sin值
|
||||||
|
lenum.cos = 度數Cos值
|
||||||
|
lenum.tan = 度數Tan值
|
||||||
|
#not a typo, look up 'range notation'
|
||||||
|
lenum.rand = 產生隨機數值: [0, 值).
|
||||||
|
lenum.log = 自然對數(ln、log_e).
|
||||||
|
lenum.log10 = 高中數學.
|
||||||
|
lenum.noise = 2D simplex noise.
|
||||||
|
lenum.abs = 取絕對值
|
||||||
|
lenum.sqrt = 開根號
|
||||||
|
|
||||||
|
lenum.any = 任何單位
|
||||||
|
lenum.ally = 友方單位
|
||||||
|
lenum.attacker = 具武器的單位
|
||||||
|
lenum.enemy = 敵方單位
|
||||||
|
lenum.boss = 頭目單位
|
||||||
|
lenum.flying = 飛行單位
|
||||||
|
lenum.ground = 陸上單位
|
||||||
|
lenum.player = 玩家單位
|
||||||
|
|
||||||
|
lenum.ore = 尋找礦物
|
||||||
|
lenum.damaged = 尋找受損友方建築
|
||||||
|
lenum.spawn = 敵方重生點\n可以是核心或一個位置
|
||||||
|
lenum.building = 尋找特定建築
|
||||||
|
|
||||||
|
lenum.core = 任何核心
|
||||||
|
lenum.storage = 儲藏建築
|
||||||
|
lenum.generator = 會發電的建築
|
||||||
|
lenum.factory = 生產加工資源的建築,如煉矽場
|
||||||
|
lenum.repair = 維修點
|
||||||
|
lenum.rally = 指揮中心
|
||||||
|
lenum.battery = 電池
|
||||||
|
lenum.resupply = 補給點\n只有在[accent]"單位需要彈藥"[]被啟用時才有效果
|
||||||
|
lenum.reactor = 衝擊/釷反應爐
|
||||||
|
lenum.turret = 任何砲塔
|
||||||
|
|
||||||
|
sensor.in = 想查閱的建築/單位
|
||||||
|
|
||||||
|
radar.from = 作為雷達的建築\n偵測範圍同該建築的範圍
|
||||||
|
radar.target = 搜索條件
|
||||||
|
radar.and = 額外條件
|
||||||
|
radar.order = 輸出順序,1:距離最近、血量最大
|
||||||
|
radar.sort = 篩選方式
|
||||||
|
radar.output = 回傳該單位為變數
|
||||||
|
|
||||||
|
unitradar.target = 搜索條件
|
||||||
|
unitradar.and = 額外條件
|
||||||
|
unitradar.order = 輸出順序,1:距離最近、血量最大
|
||||||
|
unitradar.sort = 篩選方式
|
||||||
|
unitradar.output = 存該單位的變數
|
||||||
|
|
||||||
|
control.of = 要控制的建築
|
||||||
|
control.unit = 指定的建築/單位
|
||||||
|
control.shoot = 是否開火
|
||||||
|
|
||||||
|
unitlocate.enemy = 搜索敵方或友方建築
|
||||||
|
unitlocate.found = 回傳是否找到建築
|
||||||
|
unitlocate.building = 回傳找到的建築為變數
|
||||||
|
unitlocate.outx = 回傳 X 座標
|
||||||
|
unitlocate.outy = 回傳 Y 座標
|
||||||
|
unitlocate.group = 搜索建築種類
|
||||||
|
|
||||||
|
lenum.stop = 停止移動/挖礦/建造
|
||||||
|
lenum.move = 移動到指定位置
|
||||||
|
lenum.approach = 移動到距離指定位置一段距離的地方
|
||||||
|
lenum.pathfind = 由內建AI前往敵方重生點
|
||||||
|
lenum.target = 射擊指定區域
|
||||||
|
lenum.targetp = 帶自瞄射擊指定的目標
|
||||||
|
lenum.itemdrop = 放下物品
|
||||||
|
lenum.itemtake = 從建築拿取物品
|
||||||
|
lenum.paydrop = 放下拾取的負載
|
||||||
|
lenum.paytake = 拾取船身下方的單位/建築
|
||||||
|
lenum.flag = 單位編號(可異)
|
||||||
|
lenum.mine = 挖指定位置的礦物
|
||||||
|
lenum.build = 建造一個建築
|
||||||
|
lenum.getblock = 獲取指定位置的建築種類和該建築\n必須在單位的範圍內\n實體障礙物,如高山會回傳[accent]@solid[]
|
||||||
|
lenum.within = 單位是否在指定範圍內
|
||||||
|
lenum.boost = 使用推進器
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
63730=magmarock|block-magmarock-medium
|
63730=magmarock|block-magmarock-medium
|
||||||
63729=sand|block-sand-medium
|
63729=sand|block-sand-medium
|
||||||
63728=darksand|block-darksand-medium
|
63728=darksand|block-darksand-medium
|
||||||
63727=holostone|block-holostone-medium
|
|
||||||
63726=grass|block-grass-medium
|
63726=grass|block-grass-medium
|
||||||
63725=salt|block-salt-medium
|
63725=salt|block-salt-medium
|
||||||
63724=snow|block-snow-medium
|
63724=snow|block-snow-medium
|
||||||
@@ -285,7 +284,6 @@
|
|||||||
63451=scepter|unit-scepter-medium
|
63451=scepter|unit-scepter-medium
|
||||||
63450=reign|unit-reign-medium
|
63450=reign|unit-reign-medium
|
||||||
63449=dirt|block-dirt-medium
|
63449=dirt|block-dirt-medium
|
||||||
63448=dirtwall|block-dirtwall-medium
|
|
||||||
63447=stone-wall|block-stone-wall-medium
|
63447=stone-wall|block-stone-wall-medium
|
||||||
63446=spore-wall|block-spore-wall-medium
|
63446=spore-wall|block-spore-wall-medium
|
||||||
63445=ice-wall|block-ice-wall-medium
|
63445=ice-wall|block-ice-wall-medium
|
||||||
@@ -295,7 +293,6 @@
|
|||||||
63441=salt-wall|block-salt-wall-medium
|
63441=salt-wall|block-salt-wall-medium
|
||||||
63440=shale-wall|block-shale-wall-medium
|
63440=shale-wall|block-shale-wall-medium
|
||||||
63439=dirt-wall|block-dirt-wall-medium
|
63439=dirt-wall|block-dirt-wall-medium
|
||||||
63438=holostone-wall|block-holostone-wall-medium
|
|
||||||
63437=basalt|block-basalt-medium
|
63437=basalt|block-basalt-medium
|
||||||
63436=dacite|block-dacite-medium
|
63436=dacite|block-dacite-medium
|
||||||
63435=boulder|block-boulder-medium
|
63435=boulder|block-boulder-medium
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -133,6 +133,7 @@ const PlayerLeave = Packages.mindustry.game.EventType.PlayerLeave
|
|||||||
const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect
|
const PlayerConnect = Packages.mindustry.game.EventType.PlayerConnect
|
||||||
const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin
|
const PlayerJoin = Packages.mindustry.game.EventType.PlayerJoin
|
||||||
const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent
|
const UnitChangeEvent = Packages.mindustry.game.EventType.UnitChangeEvent
|
||||||
|
const UnitUnloadEvent = Packages.mindustry.game.EventType.UnitUnloadEvent
|
||||||
const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent
|
const UnitCreateEvent = Packages.mindustry.game.EventType.UnitCreateEvent
|
||||||
const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent
|
const UnitDrownEvent = Packages.mindustry.game.EventType.UnitDrownEvent
|
||||||
const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent
|
const UnitDestroyEvent = Packages.mindustry.game.EventType.UnitDestroyEvent
|
||||||
@@ -161,6 +162,7 @@ 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
|
||||||
const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent
|
const WorldLoadEvent = Packages.mindustry.game.EventType.WorldLoadEvent
|
||||||
|
const FileTreeInitEvent = Packages.mindustry.game.EventType.FileTreeInitEvent
|
||||||
const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent
|
const ClientLoadEvent = Packages.mindustry.game.EventType.ClientLoadEvent
|
||||||
const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent
|
const ContentInitEvent = Packages.mindustry.game.EventType.ContentInitEvent
|
||||||
const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent
|
const BlockInfoEvent = Packages.mindustry.game.EventType.BlockInfoEvent
|
||||||
|
|||||||
Binary file not shown.
@@ -34,6 +34,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setup(){
|
public void setup(){
|
||||||
|
checkLaunch();
|
||||||
loadLogger();
|
loadLogger();
|
||||||
|
|
||||||
loader = new LoadRenderer();
|
loader = new LoadRenderer();
|
||||||
@@ -145,7 +146,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
finished = true;
|
finished = true;
|
||||||
Events.fire(new ClientLoadEvent());
|
Events.fire(new ClientLoadEvent());
|
||||||
super.resize(graphics.getWidth(), graphics.getHeight());
|
super.resize(graphics.getWidth(), graphics.getHeight());
|
||||||
app.post(() -> app.post(() -> app.post(() -> app.post(() -> super.resize(graphics.getWidth(), graphics.getHeight())))));
|
app.post(() -> app.post(() -> app.post(() -> app.post(() -> {
|
||||||
|
super.resize(graphics.getWidth(), graphics.getHeight());
|
||||||
|
|
||||||
|
//mark initialization as complete
|
||||||
|
finishLaunch();
|
||||||
|
}))));
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
asyncCore.begin();
|
asyncCore.begin();
|
||||||
@@ -168,6 +174,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
lastTime = Time.nanos();
|
lastTime = Time.nanos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void exit(){
|
||||||
|
//on graceful exit, finish the launch normally.
|
||||||
|
Vars.finishLaunch();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(){
|
public void init(){
|
||||||
setup();
|
setup();
|
||||||
@@ -182,6 +194,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pause(){
|
public void pause(){
|
||||||
|
//when the user tabs out on mobile, the exit() event doesn't fire reliably - in that case, just assume they're about to kill the app
|
||||||
|
//this isn't 100% reliable but it should work for most cases
|
||||||
|
if(mobile){
|
||||||
|
Vars.finishLaunch();
|
||||||
|
}
|
||||||
if(finished){
|
if(finished){
|
||||||
super.pause();
|
super.pause();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,12 +32,16 @@ import java.util.*;
|
|||||||
import static arc.Core.*;
|
import static arc.Core.*;
|
||||||
|
|
||||||
public class Vars implements Loadable{
|
public class Vars implements Loadable{
|
||||||
|
/** Whether the game failed to launch last time. */
|
||||||
|
public static boolean failedToLaunch = false;
|
||||||
/** Whether to load locales.*/
|
/** Whether to load locales.*/
|
||||||
public static boolean loadLocales = true;
|
public static boolean loadLocales = true;
|
||||||
/** Whether the logger is loaded. */
|
/** Whether the logger is loaded. */
|
||||||
public static boolean loadedLogger = false, loadedFileLogger = false;
|
public static boolean loadedLogger = false, loadedFileLogger = false;
|
||||||
/** Whether to enable various experimental features (e.g. cliffs) */
|
/** Whether to enable various experimental features (e.g. cliffs) */
|
||||||
public static boolean experimental = false;
|
public static boolean experimental = false;
|
||||||
|
/** Name of current Steam player. */
|
||||||
|
public static String steamPlayerName = "";
|
||||||
/** Maximum extra padding around deployment schematics. */
|
/** Maximum extra padding around deployment schematics. */
|
||||||
public static final int maxLoadoutSchematicPad = 5;
|
public static final int maxLoadoutSchematicPad = 5;
|
||||||
/** Maximum schematic size.*/
|
/** Maximum schematic size.*/
|
||||||
@@ -54,16 +58,14 @@ public class Vars implements Loadable{
|
|||||||
public static final String ghApi = "https://api.github.com";
|
public static final String ghApi = "https://api.github.com";
|
||||||
/** URL for discord invite. */
|
/** URL for discord invite. */
|
||||||
public static final String discordURL = "https://discord.gg/mindustry";
|
public static final String discordURL = "https://discord.gg/mindustry";
|
||||||
/** URL for sending crash reports to */
|
/** URL for sending crash reports to. Currently offline. */
|
||||||
public static final String crashReportURL = "http://192.99.169.18/report";
|
public static final String crashReportURL = "http://192.99.169.18/report";
|
||||||
/** URL the links to the wiki's modding guide.*/
|
/** URL the links to the wiki's modding guide.*/
|
||||||
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/";
|
public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/1-modding/";
|
||||||
/** URL to the JSON file containing all the global, public servers. Not queried in BE. */
|
|
||||||
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json";
|
|
||||||
/** URL to the JSON file containing all the BE servers. Only queried in BE. */
|
/** URL to the JSON file containing all the BE servers. Only queried in BE. */
|
||||||
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
|
public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json";
|
||||||
/** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */
|
/** URL to the JSON file containing all the stable servers. */
|
||||||
public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
|
public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json";
|
||||||
/** URL of the github issue report template.*/
|
/** URL of the github issue report template.*/
|
||||||
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
|
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
|
||||||
/** list of built-in servers.*/
|
/** list of built-in servers.*/
|
||||||
@@ -172,6 +174,8 @@ public class Vars implements Loadable{
|
|||||||
public static Fi schematicDirectory;
|
public static Fi schematicDirectory;
|
||||||
/** data subdirectory used for bleeding edge build versions */
|
/** data subdirectory used for bleeding edge build versions */
|
||||||
public static Fi bebuildDirectory;
|
public static Fi bebuildDirectory;
|
||||||
|
/** file used to store launch ID */
|
||||||
|
public static Fi launchIDFile;
|
||||||
/** empty map, indicates no current map */
|
/** empty map, indicates no current map */
|
||||||
public static Map emptyMap;
|
public static Map emptyMap;
|
||||||
/** map file extension */
|
/** map file extension */
|
||||||
@@ -284,6 +288,27 @@ public class Vars implements Loadable{
|
|||||||
maps.load();
|
maps.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Checks if a launch failure occurred.
|
||||||
|
* If this is the case, failedToLaunch is set to true. */
|
||||||
|
public static void checkLaunch(){
|
||||||
|
settings.setAppName(appName);
|
||||||
|
launchIDFile = settings.getDataDirectory().child("launchid.dat");
|
||||||
|
|
||||||
|
if(launchIDFile.exists()){
|
||||||
|
failedToLaunch = true;
|
||||||
|
}else{
|
||||||
|
failedToLaunch = false;
|
||||||
|
launchIDFile.writeString("go away");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Cleans up after a successful launch. */
|
||||||
|
public static void finishLaunch(){
|
||||||
|
if(launchIDFile != null){
|
||||||
|
launchIDFile.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void loadLogger(){
|
public static void loadLogger(){
|
||||||
if(loadedLogger) return;
|
if(loadedLogger) return;
|
||||||
|
|
||||||
|
|||||||
@@ -209,6 +209,16 @@ public class BaseAI{
|
|||||||
}
|
}
|
||||||
Tile wtile = world.tile(realX, realY);
|
Tile wtile = world.tile(realX, realY);
|
||||||
|
|
||||||
|
if(tile.block instanceof PayloadConveyor || tile.block instanceof PayloadAcceptor){
|
||||||
|
//near a building
|
||||||
|
for(Point2 point : Edges.getEdges(tile.block.size)){
|
||||||
|
var t = world.build(tile.x + point.x, tile.y + point.y);
|
||||||
|
if(t != null){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//may intersect AI path
|
//may intersect AI path
|
||||||
tmpTiles.clear();
|
tmpTiles.clear();
|
||||||
if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){
|
if(tile.block.solid && wtile != null && wtile.getLinkedTilesAs(tile.block, tmpTiles).contains(t -> path.contains(t.pos()))){
|
||||||
|
|||||||
@@ -269,7 +269,6 @@ public class BlockIndexer{
|
|||||||
public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred, boolean usePriority){
|
public Building findTile(Team team, float x, float y, float range, Boolf<Building> pred, boolean usePriority){
|
||||||
Building closest = null;
|
Building closest = null;
|
||||||
float dst = 0;
|
float dst = 0;
|
||||||
float range2 = range * range;
|
|
||||||
|
|
||||||
for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){
|
for(int rx = Math.max((int)((x - range) / tilesize / quadrantSize), 0); rx <= (int)((x + range) / tilesize / quadrantSize) && rx < quadWidth(); rx++){
|
||||||
for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){
|
for(int ry = Math.max((int)((y - range) / tilesize / quadrantSize), 0); ry <= (int)((y + range) / tilesize / quadrantSize) && ry < quadHeight(); ry++){
|
||||||
@@ -282,13 +281,13 @@ public class BlockIndexer{
|
|||||||
|
|
||||||
if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue;
|
if(e == null || e.team != team || !pred.get(e) || !e.block.targetable || e.team == Team.derelict) continue;
|
||||||
|
|
||||||
float ndst = e.dst2(x, y);
|
float bdst = e.dst(x, y) - e.hitSize() / 2f;
|
||||||
if(ndst < range2 && (closest == null ||
|
if(bdst < range && (closest == null ||
|
||||||
//this one is closer, and it is at least of equal priority
|
//this one is closer, and it is at least of equal priority
|
||||||
(ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) ||
|
(bdst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) ||
|
||||||
//priority is used, and new block has higher priority regardless of range
|
//priority is used, and new block has higher priority regardless of range
|
||||||
(usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
|
(usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
|
||||||
dst = ndst;
|
dst = bdst;
|
||||||
closest = e;
|
closest = e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,9 +13,12 @@ import mindustry.world.blocks.ConstructBlock.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class BuilderAI extends AIController{
|
public class BuilderAI extends AIController{
|
||||||
float buildRadius = 1500;
|
public static float buildRadius = 1500, retreatDst = 110f, fleeRange = 370f, retreatDelay = Time.toSeconds * 2f;
|
||||||
|
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
@Nullable Unit following;
|
@Nullable Unit following;
|
||||||
|
@Nullable Teamc enemy;
|
||||||
|
float retreatTimer;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateMovement(){
|
public void updateMovement(){
|
||||||
@@ -27,6 +30,7 @@ public class BuilderAI extends AIController{
|
|||||||
unit.updateBuilding = true;
|
unit.updateBuilding = true;
|
||||||
|
|
||||||
if(following != null){
|
if(following != null){
|
||||||
|
retreatTimer = 0f;
|
||||||
//try to follow and mimic someone
|
//try to follow and mimic someone
|
||||||
|
|
||||||
//validate follower
|
//validate follower
|
||||||
@@ -39,9 +43,25 @@ public class BuilderAI extends AIController{
|
|||||||
//set to follower's first build plan, whatever that is
|
//set to follower's first build plan, whatever that is
|
||||||
unit.plans.clear();
|
unit.plans.clear();
|
||||||
unit.plans.addFirst(following.buildPlan());
|
unit.plans.addFirst(following.buildPlan());
|
||||||
|
}else if(unit.buildPlan() == null){
|
||||||
|
//not following anyone or building
|
||||||
|
if(timer.get(timerTarget4, 40)){
|
||||||
|
enemy = target(unit.x, unit.y, fleeRange, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
//fly away from enemy when not doing anything, but only after a delay
|
||||||
|
if((retreatTimer += Time.delta) >= retreatDelay){
|
||||||
|
if(enemy != null){
|
||||||
|
var core = unit.closestCore();
|
||||||
|
if(core != null && !unit.within(core, retreatDst)){
|
||||||
|
moveTo(core, retreatDst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(unit.buildPlan() != null){
|
if(unit.buildPlan() != null){
|
||||||
|
retreatTimer = 0f;
|
||||||
//approach request if building
|
//approach request if building
|
||||||
BuildPlan req = unit.buildPlan();
|
BuildPlan req = unit.buildPlan();
|
||||||
|
|
||||||
|
|||||||
@@ -49,10 +49,10 @@ public class FlyingAI extends AIController{
|
|||||||
float ang = unit.angleTo(target);
|
float ang = unit.angleTo(target);
|
||||||
float diff = Angles.angleDist(ang, unit.rotation());
|
float diff = Angles.angleDist(ang, unit.rotation());
|
||||||
|
|
||||||
if(diff > 100f && vec.len() < circleLength){
|
if(diff > 70f && vec.len() < circleLength){
|
||||||
vec.setAngle(unit.vel().angle());
|
vec.setAngle(unit.vel().angle());
|
||||||
}else{
|
}else{
|
||||||
vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f));
|
vec.setAngle(Angles.moveToward(unit.vel().angle(), vec.angle(), 6f));
|
||||||
}
|
}
|
||||||
|
|
||||||
vec.setLength(unit.speed());
|
vec.setLength(unit.speed());
|
||||||
|
|||||||
@@ -128,6 +128,9 @@ public class LogicAI extends AIController{
|
|||||||
vec.setZero();
|
vec.setZero();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//do not move when infinite vectors are used.
|
||||||
|
if(vec.isNaN() || vec.isInfinite()) return;
|
||||||
|
|
||||||
unit.approach(vec);
|
unit.approach(vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
package mindustry.ai.types;
|
package mindustry.ai.types;
|
||||||
|
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.entities.units.*;
|
import mindustry.entities.units.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.world.blocks.ConstructBlock.*;
|
import mindustry.world.blocks.ConstructBlock.*;
|
||||||
|
|
||||||
public class RepairAI extends AIController{
|
public class RepairAI extends AIController{
|
||||||
|
public static float retreatDst = 160f, fleeRange = 310f, retreatDelay = Time.toSeconds * 3f;
|
||||||
|
|
||||||
|
@Nullable Teamc avoid;
|
||||||
|
float retreatTimer;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateMovement(){
|
protected void updateMovement(){
|
||||||
@@ -29,6 +34,25 @@ public class RepairAI extends AIController{
|
|||||||
|
|
||||||
unit.lookAt(target);
|
unit.lookAt(target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//not repairing
|
||||||
|
if(!(target instanceof Building)){
|
||||||
|
if(timer.get(timerTarget4, 40)){
|
||||||
|
avoid = target(unit.x, unit.y, fleeRange, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if((retreatTimer += Time.delta) >= retreatDelay){
|
||||||
|
//fly away from enemy when not doing anything
|
||||||
|
if(avoid != null){
|
||||||
|
var core = unit.closestCore();
|
||||||
|
if(core != null && !unit.within(core, retreatDst)){
|
||||||
|
moveTo(core, retreatDst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
retreatTimer = 0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package mindustry.ai.types;
|
package mindustry.ai.types;
|
||||||
|
|
||||||
|
import arc.math.geom.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.ai.*;
|
import mindustry.ai.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
@@ -47,7 +48,8 @@ public class SuicideAI extends GroundAI{
|
|||||||
|
|
||||||
//raycast for target
|
//raycast for target
|
||||||
boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> {
|
boolean blocked = Vars.world.raycast(unit.tileX(), unit.tileY(), target.tileX(), target.tileY(), (x, y) -> {
|
||||||
Tile tile = Vars.world.tile(x, y);
|
for(Point2 p : Geometry.d4c){
|
||||||
|
Tile tile = Vars.world.tile(x + p.x, y + p.y);
|
||||||
if(tile != null && tile.build == target) return false;
|
if(tile != null && tile.build == target) return false;
|
||||||
if(tile != null && tile.build != null && tile.build.team != unit.team()){
|
if(tile != null && tile.build != null && tile.build.team != unit.team()){
|
||||||
blockedByBlock = true;
|
blockedByBlock = true;
|
||||||
@@ -55,6 +57,8 @@ public class SuicideAI extends GroundAI{
|
|||||||
}else{
|
}else{
|
||||||
return tile == null || tile.solid();
|
return tile == null || tile.solid();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
//shoot when there's an enemy block in the way
|
//shoot when there's an enemy block in the way
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mindustry.content;
|
package mindustry.content;
|
||||||
|
|
||||||
import arc.*;
|
|
||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.graphics.g2d.*;
|
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
@@ -97,36 +95,9 @@ public class Blocks implements ContentList{
|
|||||||
public void load(){
|
public void load(){
|
||||||
//region environment
|
//region environment
|
||||||
|
|
||||||
air = new Floor("air"){
|
air = new AirBlock("air");
|
||||||
{
|
|
||||||
alwaysReplace = true;
|
|
||||||
hasShadow = false;
|
|
||||||
useColor = false;
|
|
||||||
wall = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override public void drawBase(Tile tile){}
|
spawn = new SpawnBlock("spawn");
|
||||||
@Override public void load(){}
|
|
||||||
@Override public void init(){}
|
|
||||||
@Override public boolean isHidden(){ return true; }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public TextureRegion[] variantRegions(){
|
|
||||||
if(variantRegions == null){
|
|
||||||
variantRegions = new TextureRegion[]{Core.atlas.find("clear")};
|
|
||||||
}
|
|
||||||
return variantRegions;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
spawn = new OverlayFloor("spawn"){
|
|
||||||
{
|
|
||||||
variants = 0;
|
|
||||||
needsSurface = false;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void drawBase(Tile tile){}
|
|
||||||
};
|
|
||||||
|
|
||||||
cliff = new Cliff("cliff"){{
|
cliff = new Cliff("cliff"){{
|
||||||
inEditor = false;
|
inEditor = false;
|
||||||
@@ -2076,6 +2047,7 @@ public class Blocks implements ContentList{
|
|||||||
hasPower = true;
|
hasPower = true;
|
||||||
consumes.power(10f);
|
consumes.power(10f);
|
||||||
buildCostMultiplier = 0.5f;
|
buildCostMultiplier = 0.5f;
|
||||||
|
health = size * size * 80;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
//endregion campaign
|
//endregion campaign
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class Bullets implements ContentList{
|
|||||||
lifetime = 80f;
|
lifetime = 80f;
|
||||||
width = height = 11f;
|
width = height = 11f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f * 0.75f;
|
||||||
splashDamage = 33f;
|
splashDamage = 33f;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ public class Bullets implements ContentList{
|
|||||||
lifetime = 80f;
|
lifetime = 80f;
|
||||||
width = height = 13f;
|
width = height = 13f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
splashDamageRadius = 35f;
|
splashDamageRadius = 35f * 0.75f;
|
||||||
splashDamage = 45f;
|
splashDamage = 45f;
|
||||||
fragBullet = artilleryPlasticFrag;
|
fragBullet = artilleryPlasticFrag;
|
||||||
fragBullets = 10;
|
fragBullets = 10;
|
||||||
@@ -98,7 +98,7 @@ public class Bullets implements ContentList{
|
|||||||
lifetime = 80f;
|
lifetime = 80f;
|
||||||
width = height = 11f;
|
width = height = 11f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f * 0.75f;
|
||||||
splashDamage = 33f;
|
splashDamage = 33f;
|
||||||
reloadMultiplier = 1.2f;
|
reloadMultiplier = 1.2f;
|
||||||
ammoMultiplier = 3f;
|
ammoMultiplier = 3f;
|
||||||
@@ -112,7 +112,7 @@ public class Bullets implements ContentList{
|
|||||||
lifetime = 80f;
|
lifetime = 80f;
|
||||||
width = height = 13f;
|
width = height = 13f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
splashDamageRadius = 25f;
|
splashDamageRadius = 25f * 0.75f;
|
||||||
splashDamage = 35f;
|
splashDamage = 35f;
|
||||||
status = StatusEffects.burning;
|
status = StatusEffects.burning;
|
||||||
frontColor = Pal.lightishOrange;
|
frontColor = Pal.lightishOrange;
|
||||||
@@ -128,7 +128,7 @@ public class Bullets implements ContentList{
|
|||||||
width = height = 14f;
|
width = height = 14f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
ammoMultiplier = 4f;
|
ammoMultiplier = 4f;
|
||||||
splashDamageRadius = 45f;
|
splashDamageRadius = 45f * 0.75f;
|
||||||
splashDamage = 50f;
|
splashDamage = 50f;
|
||||||
backColor = Pal.missileYellowBack;
|
backColor = Pal.missileYellowBack;
|
||||||
frontColor = Pal.missileYellow;
|
frontColor = Pal.missileYellow;
|
||||||
|
|||||||
@@ -1609,6 +1609,12 @@ public class Fx{
|
|||||||
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
|
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
lightBlock = new Effect(60, e -> {
|
||||||
|
color(e.color);
|
||||||
|
alpha(e.fout() * 1);
|
||||||
|
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
|
||||||
|
}),
|
||||||
|
|
||||||
overdriveBlockFull = new Effect(60, e -> {
|
overdriveBlockFull = new Effect(60, e -> {
|
||||||
color(e.color);
|
color(e.color);
|
||||||
alpha(e.fslope() * 0.4f);
|
alpha(e.fslope() * 0.4f);
|
||||||
|
|||||||
@@ -240,8 +240,8 @@ public class UnitTypes implements ContentList{
|
|||||||
fragVelocityMin = 0.4f;
|
fragVelocityMin = 0.4f;
|
||||||
|
|
||||||
hitEffect = Fx.blastExplosion;
|
hitEffect = Fx.blastExplosion;
|
||||||
splashDamage = 18f;
|
splashDamage = 16f;
|
||||||
splashDamageRadius = 30f;
|
splashDamageRadius = 13f;
|
||||||
|
|
||||||
fragBullets = 2;
|
fragBullets = 2;
|
||||||
fragLifeMin = 0f;
|
fragLifeMin = 0f;
|
||||||
@@ -257,7 +257,7 @@ public class UnitTypes implements ContentList{
|
|||||||
lifetime = 20f;
|
lifetime = 20f;
|
||||||
hitEffect = Fx.flakExplosion;
|
hitEffect = Fx.flakExplosion;
|
||||||
splashDamage = 15f;
|
splashDamage = 15f;
|
||||||
splashDamageRadius = 15f;
|
splashDamageRadius = 10f;
|
||||||
}};
|
}};
|
||||||
}};
|
}};
|
||||||
}}
|
}}
|
||||||
@@ -565,9 +565,9 @@ public class UnitTypes implements ContentList{
|
|||||||
hitEffect = Fx.pulverize;
|
hitEffect = Fx.pulverize;
|
||||||
lifetime = 10f;
|
lifetime = 10f;
|
||||||
speed = 1f;
|
speed = 1f;
|
||||||
splashDamageRadius = 70f;
|
splashDamageRadius = 58f;
|
||||||
instantDisappear = true;
|
instantDisappear = true;
|
||||||
splashDamage = 80f;
|
splashDamage = 85f;
|
||||||
killShooter = true;
|
killShooter = true;
|
||||||
hittable = false;
|
hittable = false;
|
||||||
collidesAir = true;
|
collidesAir = true;
|
||||||
@@ -769,7 +769,7 @@ public class UnitTypes implements ContentList{
|
|||||||
width = height = 19f;
|
width = height = 19f;
|
||||||
collidesTiles = true;
|
collidesTiles = true;
|
||||||
ammoMultiplier = 4f;
|
ammoMultiplier = 4f;
|
||||||
splashDamageRadius = 95f;
|
splashDamageRadius = 70f;
|
||||||
splashDamage = 65f;
|
splashDamage = 65f;
|
||||||
backColor = Pal.sapBulletBack;
|
backColor = Pal.sapBulletBack;
|
||||||
frontColor = lightningColor = Pal.sapBullet;
|
frontColor = lightningColor = Pal.sapBullet;
|
||||||
@@ -867,7 +867,7 @@ public class UnitTypes implements ContentList{
|
|||||||
width = height = 25f;
|
width = height = 25f;
|
||||||
collidesTiles = collides = true;
|
collidesTiles = collides = true;
|
||||||
ammoMultiplier = 4f;
|
ammoMultiplier = 4f;
|
||||||
splashDamageRadius = 90f;
|
splashDamageRadius = 80f;
|
||||||
splashDamage = 75f;
|
splashDamage = 75f;
|
||||||
backColor = Pal.sapBulletBack;
|
backColor = Pal.sapBulletBack;
|
||||||
frontColor = lightningColor = Pal.sapBullet;
|
frontColor = lightningColor = Pal.sapBullet;
|
||||||
@@ -888,7 +888,7 @@ public class UnitTypes implements ContentList{
|
|||||||
lifetime = 90f;
|
lifetime = 90f;
|
||||||
width = height = 20f;
|
width = height = 20f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
splashDamageRadius = 80f;
|
splashDamageRadius = 70f;
|
||||||
splashDamage = 40f;
|
splashDamage = 40f;
|
||||||
backColor = Pal.sapBulletBack;
|
backColor = Pal.sapBulletBack;
|
||||||
frontColor = lightningColor = Pal.sapBullet;
|
frontColor = lightningColor = Pal.sapBullet;
|
||||||
@@ -1366,8 +1366,8 @@ public class UnitTypes implements ContentList{
|
|||||||
collides = false;
|
collides = false;
|
||||||
|
|
||||||
healPercent = 15f;
|
healPercent = 15f;
|
||||||
splashDamage = 230f;
|
splashDamage = 220f;
|
||||||
splashDamageRadius = 120f;
|
splashDamageRadius = 80f;
|
||||||
}};
|
}};
|
||||||
}});
|
}});
|
||||||
}};
|
}};
|
||||||
@@ -1537,7 +1537,7 @@ public class UnitTypes implements ContentList{
|
|||||||
width = 15f;
|
width = 15f;
|
||||||
collidesTiles = false;
|
collidesTiles = false;
|
||||||
ammoMultiplier = 4f;
|
ammoMultiplier = 4f;
|
||||||
splashDamageRadius = 60f;
|
splashDamageRadius = 40f;
|
||||||
splashDamage = 80f;
|
splashDamage = 80f;
|
||||||
backColor = Pal.missileYellowBack;
|
backColor = Pal.missileYellowBack;
|
||||||
frontColor = Pal.missileYellow;
|
frontColor = Pal.missileYellow;
|
||||||
@@ -1590,7 +1590,7 @@ public class UnitTypes implements ContentList{
|
|||||||
}};
|
}};
|
||||||
|
|
||||||
sei = new UnitType("sei"){{
|
sei = new UnitType("sei"){{
|
||||||
health = 10200;
|
health = 10500;
|
||||||
armor = 12f;
|
armor = 12f;
|
||||||
|
|
||||||
speed = 0.73f;
|
speed = 0.73f;
|
||||||
|
|||||||
@@ -59,6 +59,15 @@ public class Control implements ApplicationListener, Loadable{
|
|||||||
saves = new Saves();
|
saves = new Saves();
|
||||||
sound = new SoundControl();
|
sound = new SoundControl();
|
||||||
|
|
||||||
|
//show dialog saying that mod loading was skipped.
|
||||||
|
Events.on(ClientLoadEvent.class, e -> {
|
||||||
|
if(Vars.mods.skipModLoading() && Vars.mods.list().any()){
|
||||||
|
Time.runTask(4f, () -> {
|
||||||
|
ui.showInfo("@mods.initfailed");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
Events.on(StateChangeEvent.class, event -> {
|
Events.on(StateChangeEvent.class, event -> {
|
||||||
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
|
if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){
|
||||||
Time.runTask(5f, platform::updateRPC);
|
Time.runTask(5f, platform::updateRPC);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
|
|
||||||
ConnectPacket c = new ConnectPacket();
|
ConnectPacket c = new ConnectPacket();
|
||||||
c.name = player.name;
|
c.name = player.name;
|
||||||
|
c.locale = Core.settings.getString("locale");
|
||||||
c.mods = mods.getModStrings();
|
c.mods = mods.getModStrings();
|
||||||
c.mobile = mobile;
|
c.mobile = mobile;
|
||||||
c.versionType = Version.type;
|
c.versionType = Version.type;
|
||||||
@@ -480,7 +481,7 @@ public class NetClient implements ApplicationListener{
|
|||||||
netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen));
|
netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen));
|
||||||
DataInputStream input = netClient.dataStream;
|
DataInputStream input = netClient.dataStream;
|
||||||
|
|
||||||
byte cores = input.readByte();
|
int cores = input.readInt();
|
||||||
for(int i = 0; i < cores; i++){
|
for(int i = 0; i < cores; i++){
|
||||||
int pos = input.readInt();
|
int pos = input.readInt();
|
||||||
Tile tile = world.tile(pos);
|
Tile tile = world.tile(pos);
|
||||||
|
|||||||
@@ -195,6 +195,10 @@ public class NetServer implements ApplicationListener{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(packet.locale == null){
|
||||||
|
packet.locale = "en_US";
|
||||||
|
}
|
||||||
|
|
||||||
String ip = con.address;
|
String ip = con.address;
|
||||||
|
|
||||||
admins.updatePlayerJoined(uuid, ip, packet.name);
|
admins.updatePlayerJoined(uuid, ip, packet.name);
|
||||||
@@ -215,6 +219,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
player.con.uuid = uuid;
|
player.con.uuid = uuid;
|
||||||
player.con.mobile = packet.mobile;
|
player.con.mobile = packet.mobile;
|
||||||
player.name = packet.name;
|
player.name = packet.name;
|
||||||
|
player.locale = packet.locale;
|
||||||
player.color.set(packet.color).a(1f);
|
player.color.set(packet.color).a(1f);
|
||||||
|
|
||||||
//save admin ID but don't overwrite it
|
//save admin ID but don't overwrite it
|
||||||
@@ -847,7 +852,7 @@ public class NetServer implements ApplicationListener{
|
|||||||
syncStream.reset();
|
syncStream.reset();
|
||||||
int sum = state.teams.present.sum(t -> t.cores.size);
|
int sum = state.teams.present.sum(t -> t.cores.size);
|
||||||
|
|
||||||
dataStream.writeByte(sum);
|
dataStream.writeInt(sum);
|
||||||
|
|
||||||
for(TeamData data : state.teams.present){
|
for(TeamData data : state.teams.present){
|
||||||
for(CoreBuild entity : data.cores){
|
for(CoreBuild entity : data.cores){
|
||||||
|
|||||||
@@ -20,10 +20,9 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
public interface Platform{
|
public interface Platform{
|
||||||
|
|
||||||
/** Dynamically loads a jar file. */
|
/** Dynamically creates a class loader for a jar file. */
|
||||||
default Class<?> loadJar(Fi jar, String mainClass) throws Exception{
|
default ClassLoader loadJar(Fi jar, String mainClass) throws Exception{
|
||||||
URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, getClass().getClassLoader());
|
return new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, getClass().getClassLoader());
|
||||||
return Class.forName(mainClass, true, classLoader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Steam: Update lobby visibility.*/
|
/** Steam: Update lobby visibility.*/
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ public class Renderer implements ApplicationListener{
|
|||||||
@Override
|
@Override
|
||||||
public void update(){
|
public void update(){
|
||||||
Color.white.set(1f, 1f, 1f, 1f);
|
Color.white.set(1f, 1f, 1f, 1f);
|
||||||
Gl.clear(Gl.stencilBufferBit);
|
|
||||||
|
|
||||||
float dest = Mathf.round(targetscale, 0.5f);
|
float dest = Mathf.round(targetscale, 0.5f);
|
||||||
camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f);
|
camerascale = Mathf.lerpDelta(camerascale, dest, 0.1f);
|
||||||
@@ -208,7 +207,7 @@ public class Renderer implements ApplicationListener{
|
|||||||
Draw.draw(Layer.background, this::drawBackground);
|
Draw.draw(Layer.background, this::drawBackground);
|
||||||
Draw.draw(Layer.floor, blocks.floor::drawFloor);
|
Draw.draw(Layer.floor, blocks.floor::drawFloor);
|
||||||
Draw.draw(Layer.block - 1, blocks::drawShadows);
|
Draw.draw(Layer.block - 1, blocks::drawShadows);
|
||||||
Draw.draw(Layer.block, () -> {
|
Draw.draw(Layer.block - 0.09f, () -> {
|
||||||
blocks.floor.beginDraw();
|
blocks.floor.beginDraw();
|
||||||
blocks.floor.drawLayer(CacheLayer.walls);
|
blocks.floor.drawLayer(CacheLayer.walls);
|
||||||
blocks.floor.endDraw();
|
blocks.floor.endDraw();
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ public class UI implements ApplicationListener, Loadable{
|
|||||||
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
|
Dialog.setHideAction(() -> sequence(fadeOut(0.1f)));
|
||||||
|
|
||||||
Tooltips.getInstance().animations = false;
|
Tooltips.getInstance().animations = false;
|
||||||
Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black5).margin(4f).add(text));
|
Tooltips.getInstance().textProvider = text -> new Tooltip(t -> t.background(Styles.black6).margin(4f).add(text));
|
||||||
|
|
||||||
Core.settings.setErrorHandler(e -> {
|
Core.settings.setErrorHandler(e -> {
|
||||||
Log.err(e);
|
Log.err(e);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import arc.*;
|
|||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
|
import arc.math.geom.Geometry.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.struct.ObjectIntMap.*;
|
import arc.struct.ObjectIntMap.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
@@ -554,10 +555,6 @@ public class World{
|
|||||||
return dark;
|
return dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface Raycaster{
|
|
||||||
boolean accept(int x, int y);
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Context implements WorldContext{
|
private class Context implements WorldContext{
|
||||||
|
|
||||||
Context(){
|
Context(){
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import arc.math.geom.*;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.editor.DrawOperation.*;
|
import mindustry.editor.DrawOperation.*;
|
||||||
|
import mindustry.entities.units.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.io.*;
|
import mindustry.io.*;
|
||||||
@@ -259,7 +260,7 @@ public class MapEditor{
|
|||||||
clearOp();
|
clearOp();
|
||||||
|
|
||||||
Tiles previous = world.tiles;
|
Tiles previous = world.tiles;
|
||||||
int offsetX = -(width - width()) / 2, offsetY = -(height - height()) / 2;
|
int offsetX = (width() - width) / 2, offsetY = (height() - height) / 2;
|
||||||
loading = true;
|
loading = true;
|
||||||
|
|
||||||
Tiles tiles = world.resize(width, height);
|
Tiles tiles = world.resize(width, height);
|
||||||
@@ -275,7 +276,17 @@ public class MapEditor{
|
|||||||
if(tile.build != null && tile.isCenter()){
|
if(tile.build != null && tile.isCenter()){
|
||||||
tile.build.x = x * tilesize + tile.block().offset;
|
tile.build.x = x * tilesize + tile.block().offset;
|
||||||
tile.build.y = y * tilesize + tile.block().offset;
|
tile.build.y = y * tilesize + tile.block().offset;
|
||||||
|
|
||||||
|
//shift links to account for map resize
|
||||||
|
Object config = tile.build.config();
|
||||||
|
if(config != null){
|
||||||
|
Object out = BuildPlan.pointConfig(tile.block(), config, p -> p.sub(offsetX, offsetY));
|
||||||
|
if(out != config){
|
||||||
|
tile.build.configureAny(out);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0));
|
tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,10 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
|||||||
}
|
}
|
||||||
|
|
||||||
platform.publish(map);
|
platform.publish(map);
|
||||||
}).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.tags.containsKey("steamid") ? editor.tags.get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop"));
|
}).padTop(-3).size(swidth * 2f + 10, 60f).update(b ->
|
||||||
|
b.setText(editor.tags.containsKey("steamid") ?
|
||||||
|
editor.tags.get("author", "").equals(steamPlayerName) ? "@workshop.listing" : "@view.workshop" :
|
||||||
|
"@editor.publish.workshop"));
|
||||||
|
|
||||||
menu.cont.row();
|
menu.cont.row();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ 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.annotations.Annotations.*;
|
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.core.*;
|
import mindustry.core.*;
|
||||||
import mindustry.game.EventType.*;
|
import mindustry.game.EventType.*;
|
||||||
@@ -25,11 +24,10 @@ public class Damage{
|
|||||||
private static Rect hitrect = new Rect();
|
private static Rect hitrect = new Rect();
|
||||||
private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2();
|
private static Vec2 tr = new Vec2(), seg1 = new Vec2(), seg2 = new Vec2();
|
||||||
private static Seq<Unit> units = new Seq<>();
|
private static Seq<Unit> units = new Seq<>();
|
||||||
private static GridBits bits = new GridBits(30, 30);
|
|
||||||
private static IntQueue propagation = new IntQueue();
|
|
||||||
private static IntSet collidedBlocks = new IntSet();
|
private static IntSet collidedBlocks = new IntSet();
|
||||||
private static Building tmpBuilding;
|
private static Building tmpBuilding;
|
||||||
private static Unit tmpUnit;
|
private static Unit tmpUnit;
|
||||||
|
private static IntFloatMap damages = new IntFloatMap();
|
||||||
|
|
||||||
/** Creates a dynamic explosion based on specified parameters. */
|
/** Creates a dynamic explosion based on specified parameters. */
|
||||||
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){
|
public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage){
|
||||||
@@ -116,7 +114,15 @@ public class Damage{
|
|||||||
* Only enemies of the specified team are damaged.
|
* Only enemies of the specified team are damaged.
|
||||||
*/
|
*/
|
||||||
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){
|
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){
|
||||||
length = findLaserLength(hitter, length);
|
collideLine(hitter, team, effect, x, y, angle, length, large, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Damages entities in a line.
|
||||||
|
* Only enemies of the specified team are damaged.
|
||||||
|
*/
|
||||||
|
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large, boolean laser){
|
||||||
|
if(laser) length = findLaserLength(hitter, length);
|
||||||
|
|
||||||
collidedBlocks.clear();
|
collidedBlocks.clear();
|
||||||
tr.trns(angle, length);
|
tr.trns(angle, length);
|
||||||
@@ -207,9 +213,9 @@ public class Damage{
|
|||||||
public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){
|
public static Healthc linecast(Bullet hitter, float x, float y, float angle, float length){
|
||||||
tr.trns(angle, length);
|
tr.trns(angle, length);
|
||||||
|
|
||||||
if(hitter.type.collidesGround){
|
|
||||||
tmpBuilding = null;
|
tmpBuilding = null;
|
||||||
|
|
||||||
|
if(hitter.type.collidesGround){
|
||||||
world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> {
|
world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> {
|
||||||
Building tile = world.build(cx, cy);
|
Building tile = world.build(cx, cy);
|
||||||
if(tile != null && tile.team != hitter.team){
|
if(tile != null && tile.team != hitter.team){
|
||||||
@@ -218,8 +224,6 @@ public class Damage{
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
if(tmpBuilding != null) return tmpBuilding;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rect.setPosition(x, y).setSize(tr.x, tr.y);
|
rect.setPosition(x, y).setSize(tr.x, tr.y);
|
||||||
@@ -263,6 +267,14 @@ public class Damage{
|
|||||||
|
|
||||||
Units.nearbyEnemies(hitter.team, rect, cons);
|
Units.nearbyEnemies(hitter.team, rect, cons);
|
||||||
|
|
||||||
|
if(tmpBuilding != null && tmpUnit != null){
|
||||||
|
if(Mathf.dst2(x, y, tmpUnit.getX(), tmpUnit.getY()) <= Mathf.dst2(x, y, tmpBuilding.getX(), tmpBuilding.getY())){
|
||||||
|
return tmpUnit;
|
||||||
|
}
|
||||||
|
}else if(tmpBuilding != null){
|
||||||
|
return tmpBuilding;
|
||||||
|
}
|
||||||
|
|
||||||
return tmpUnit;
|
return tmpUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,64 +363,84 @@ public class Damage{
|
|||||||
|
|
||||||
if(ground){
|
if(ground){
|
||||||
if(!complete){
|
if(!complete){
|
||||||
int trad = (int)(radius / tilesize);
|
tileDamage(team, World.toTile(x), World.toTile(y), radius / tilesize, damage);
|
||||||
Tile tile = world.tileWorld(x, y);
|
|
||||||
if(tile != null){
|
|
||||||
tileDamage(team, tile.x, tile.y, trad, damage);
|
|
||||||
}
|
|
||||||
}else{
|
}else{
|
||||||
completeDamage(team, x, y, radius, damage);
|
completeDamage(team, x, y, radius, damage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void tileDamage(Team team, int startx, int starty, int baseRadius, float baseDamage){
|
public static void tileDamage(Team team, int x, int y, float baseRadius, float damage){
|
||||||
//tile damage is posted, so that destroying a block that causes a chain explosion will run in the next frame
|
|
||||||
//this prevents recursive damage calls from messing up temporary variables
|
|
||||||
Core.app.post(() -> {
|
Core.app.post(() -> {
|
||||||
|
|
||||||
bits.clear();
|
var in = world.build(x, y);
|
||||||
propagation.clear();
|
//spawned inside a multiblock. this means that damage needs to be dealt directly.
|
||||||
int bitOffset = bits.width() / 2;
|
//why? because otherwise the building would absorb everything in one cell, which means much less damage than a nearby explosion.
|
||||||
|
//this needs to be compensated
|
||||||
|
if(in != null && in.team != team && in.block.size > 1 && in.health > damage){
|
||||||
|
//deal the damage of an entire side, to be equivalent with maximum 'standard' damage
|
||||||
|
in.damage(damage * Math.min((in.block.size), baseRadius * 0.45f));
|
||||||
|
//no need to continue with the explosion
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
propagation.addFirst(PropCell.get((byte)0, (byte)0, (short)baseDamage));
|
//cap radius to prevent lag
|
||||||
//clamp radius to fit bits
|
float radius = Math.min(baseRadius, 30), rad2 = radius * radius;
|
||||||
int radius = Math.min(baseRadius, bits.width() / 2);
|
int rays = Mathf.ceil(radius * 2 * Mathf.pi);
|
||||||
|
double spacing = Math.PI * 2.0 / rays;
|
||||||
|
damages.clear();
|
||||||
|
|
||||||
while(!propagation.isEmpty()){
|
//raycast from each angle
|
||||||
int prop = propagation.removeLast();
|
for(int i = 0; i <= rays; i++){
|
||||||
int x = PropCell.x(prop);
|
float dealt = 0f;
|
||||||
int y = PropCell.y(prop);
|
int startX = x;
|
||||||
int damage = PropCell.damage(prop);
|
int startY = y;
|
||||||
//manhattan distance used for calculating falloff, results in a diamond pattern
|
int endX = x + (int)(Math.cos(spacing * i) * radius), endY = y + (int)(Math.sin(spacing * i) * radius);
|
||||||
int dst = Math.abs(x) + Math.abs(y);
|
|
||||||
|
|
||||||
int scaledDamage = (int)(damage * (1f - (float)dst / radius));
|
int xDist = Math.abs(endX - startX);
|
||||||
|
int yDist = -Math.abs(endY - startY);
|
||||||
|
int xStep = (startX < endX ? +1 : -1);
|
||||||
|
int yStep = (startY < endY ? +1 : -1);
|
||||||
|
int error = xDist + yDist;
|
||||||
|
|
||||||
bits.set(bitOffset + x, bitOffset + y);
|
while(startX != endX || startY != endY){
|
||||||
Tile tile = world.tile(startx + x, starty + y);
|
var build = world.build(startX, startY);
|
||||||
|
if(build != null && build.team != team){
|
||||||
|
//damage dealt at circle edge
|
||||||
|
float edgeScale = 0.6f;
|
||||||
|
float mult = (1f-(Mathf.dst2(startX, startY, x, y) / rad2) + edgeScale) / (1f + edgeScale);
|
||||||
|
float next = damage * mult - dealt;
|
||||||
|
//register damage dealt
|
||||||
|
int p = Point2.pack(startX, startY);
|
||||||
|
damages.put(p, Math.max(damages.get(p), next));
|
||||||
|
//register as hit
|
||||||
|
dealt += build.health;
|
||||||
|
|
||||||
if(scaledDamage <= 0 || tile == null) continue;
|
if(next - dealt <= 0){
|
||||||
|
break;
|
||||||
//apply damage to entity if needed
|
|
||||||
if(tile.build != null && tile.build.team != team){
|
|
||||||
int health = (int)(tile.build.health / (tile.block().size * tile.block().size));
|
|
||||||
if(tile.build.health > 0){
|
|
||||||
tile.build.damage(scaledDamage);
|
|
||||||
scaledDamage -= health;
|
|
||||||
|
|
||||||
if(scaledDamage <= 0) continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Point2 p : Geometry.d4){
|
if(2 * error - yDist > xDist - 2 * error){
|
||||||
if(!bits.get(bitOffset + x + p.x, bitOffset + y + p.y)){
|
error += yDist;
|
||||||
propagation.addFirst(PropCell.get((byte)(x + p.x), (byte)(y + p.y), (short)scaledDamage));
|
startX += xStep;
|
||||||
|
}else{
|
||||||
|
error += xDist;
|
||||||
|
startY += yStep;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//apply damage
|
||||||
|
for(var e : damages){
|
||||||
|
int cx = Point2.x(e.key), cy = Point2.y(e.key);
|
||||||
|
var build = world.build(cx, cy);
|
||||||
|
if(build != null){
|
||||||
|
build.damage(e.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void completeDamage(Team team, float x, float y, float radius, float damage){
|
private static void completeDamage(Team team, float x, float y, float radius, float damage){
|
||||||
@@ -429,11 +461,4 @@ public class Damage{
|
|||||||
float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff);
|
float scaled = Mathf.lerp(1f - dist / radius, 1f, falloff);
|
||||||
return damage * scaled;
|
return damage * scaled;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Struct
|
|
||||||
static class PropCellStruct{
|
|
||||||
byte x;
|
|
||||||
byte y;
|
|
||||||
short damage;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import arc.math.geom.*;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
|
import mindustry.entities.comp.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.game.Teams.*;
|
import mindustry.game.Teams.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -75,7 +76,7 @@ public class Units{
|
|||||||
if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){
|
if((team == state.rules.waveTeam && !state.rules.pvp) || (state.isCampaign() && team == state.rules.waveTeam)){
|
||||||
return Integer.MAX_VALUE;
|
return Integer.MAX_VALUE;
|
||||||
}
|
}
|
||||||
return state.rules.unitCap + indexer.getExtraUnits(team);
|
return Math.max(0, state.rules.unitCapVariable ? state.rules.unitCap + indexer.getExtraUnits(team) : state.rules.unitCap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/
|
/** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/
|
||||||
@@ -93,7 +94,7 @@ public class Units{
|
|||||||
* @return whether the target is invalid
|
* @return whether the target is invalid
|
||||||
*/
|
*/
|
||||||
public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){
|
public static boolean invalidateTarget(Posc target, Team team, float x, float y, float range){
|
||||||
return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range)) || (target instanceof Teamc && ((Teamc)target).team() == team) || (target instanceof Healthc && !((Healthc)target).isValid());
|
return target == null || (range != Float.MAX_VALUE && !target.within(x, y, range + (target instanceof Sized hb ? hb.hitSize()/2f : 0f))) || (target instanceof Teamc t && t.team() == team) || (target instanceof Healthc h && !h.isValid());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** See {@link #invalidateTarget(Posc, Team, float, float, float)} */
|
/** See {@link #invalidateTarget(Posc, Team, float, float, float)} */
|
||||||
@@ -217,7 +218,7 @@ public class Units{
|
|||||||
cdist = 0f;
|
cdist = 0f;
|
||||||
|
|
||||||
nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> {
|
nearbyEnemies(team, x - range, y - range, range*2f, range*2f, e -> {
|
||||||
if(e.dead() || !predicate.get(e) || !e.within(x, y, range)) return;
|
if(e.dead() || !predicate.get(e) || !e.within(x, y, range + e.hitSize/2f)) return;
|
||||||
|
|
||||||
float cost = sort.cost(e, x, y);
|
float cost = sort.cost(e, x, y);
|
||||||
if(result == null || cost < cdist){
|
if(result == null || cost < cdist){
|
||||||
@@ -292,7 +293,7 @@ public class Units{
|
|||||||
/** Iterates over all units in a circle around this position. */
|
/** Iterates over all units in a circle around this position. */
|
||||||
public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){
|
public static void nearby(Team team, float x, float y, float radius, Cons<Unit> cons){
|
||||||
nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> {
|
nearby(team, x - radius, y - radius, radius*2f, radius*2f, unit -> {
|
||||||
if(unit.within(x, y, radius)){
|
if(unit.within(x, y, radius + unit.hitSize/2f)){
|
||||||
cons.get(unit);
|
cons.get(unit);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ public abstract class BulletType extends Content{
|
|||||||
if(homingPower > 0.0001f && b.time >= homingDelay){
|
if(homingPower > 0.0001f && b.time >= homingDelay){
|
||||||
Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround);
|
Teamc target = Units.closestTarget(b.team, b.x, b.y, homingRange, e -> (e.isGrounded() && collidesGround) || (e.isFlying() && collidesAir), t -> collidesGround);
|
||||||
if(target != null){
|
if(target != null){
|
||||||
b.vel.setAngle(Mathf.slerpDelta(b.rotation(), b.angleTo(target), homingPower));
|
b.vel.setAngle(Angles.moveToward(b.rotation(), b.angleTo(target), homingPower * Time.delta * 50f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import mindustry.gen.*;
|
|||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
|
|
||||||
public class LightningBulletType extends BulletType{
|
public class LightningBulletType extends BulletType{
|
||||||
protected Color lightningColor = Pal.lancerLaser;
|
public Color lightningColor = Pal.lancerLaser;
|
||||||
protected int lightningLength = 25, lightningLengthRand = 0;
|
public int lightningLength = 25, lightningLengthRand = 0;
|
||||||
|
|
||||||
public LightningBulletType(){
|
public LightningBulletType(){
|
||||||
super(0.0001f, 1f);
|
super(0.0001f, 1f);
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class RailBulletType extends BulletType{
|
|||||||
super.init(b);
|
super.init(b);
|
||||||
|
|
||||||
b.fdata = length;
|
b.fdata = length;
|
||||||
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false);
|
Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), length, false, false);
|
||||||
float resultLen = b.fdata;
|
float resultLen = b.fdata;
|
||||||
|
|
||||||
Vec2 nor = Tmp.v1.set(b.vel).nor();
|
Vec2 nor = Tmp.v1.set(b.vel).nor();
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
@EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false)
|
@EntityDef(value = {Buildingc.class}, isFinal = false, genio = false, serialize = false)
|
||||||
@Component(base = true)
|
@Component(base = true)
|
||||||
abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable{
|
abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Senseable, Controllable, Sized{
|
||||||
//region vars and initialization
|
//region vars and initialization
|
||||||
static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6;
|
static final float timeToSleep = 60f * 1, timeToUncontrol = 60f * 6;
|
||||||
static final ObjectSet<Building> tmpTiles = new ObjectSet<>();
|
static final ObjectSet<Building> tmpTiles = new ObjectSet<>();
|
||||||
@@ -558,7 +558,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid);
|
if(ofract < fract) transferLiquid(other, (fract - ofract) * block.liquidCapacity / scaling, liquid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canDumpLiquid(Building to, Liquid liquid){
|
public boolean canDumpLiquid(Building to, Liquid liquid){
|
||||||
@@ -793,6 +792,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
for(Building other : proximity){
|
for(Building other : proximity){
|
||||||
if(other != null && other.power != null
|
if(other != null && other.power != null
|
||||||
|
&& other.team == team
|
||||||
&& !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower)
|
&& !(block.consumesPower && other.block.consumesPower && !block.outputsPower && !other.block.outputsPower)
|
||||||
&& conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){
|
&& conductsTo(other) && other.conductsTo(self()) && !power.links.contains(other.pos())){
|
||||||
out.add(other);
|
out.add(other);
|
||||||
@@ -801,7 +801,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
for(int i = 0; i < power.links.size; i++){
|
for(int i = 0; i < power.links.size; i++){
|
||||||
Tile link = world.tile(power.links.get(i));
|
Tile link = world.tile(power.links.get(i));
|
||||||
if(link != null && link.build != null && link.build.power != null) out.add(link.build);
|
if(link != null && link.build != null && link.build.power != null && link.build.team == team) out.add(link.build);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
@@ -911,7 +911,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
if(net.client()) return;
|
if(net.client()) return;
|
||||||
|
|
||||||
if(block.consumesPower || block.outputsPower){
|
if(block.consumesPower || block.outputsPower){
|
||||||
int range = 10;
|
int range = 12;
|
||||||
tempTiles.clear();
|
tempTiles.clear();
|
||||||
Geometry.circle(tileX(), tileY(), range, (x, y) -> {
|
Geometry.circle(tileX(), tileY(), range, (x, y) -> {
|
||||||
Building other = world.build(x, y);
|
Building other = world.build(x, y);
|
||||||
@@ -1278,6 +1278,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
return tile.build == self() && !dead();
|
return tile.build == self() && !dead();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float hitSize(){
|
||||||
|
return tile.block().size * tilesize;
|
||||||
|
}
|
||||||
|
|
||||||
@Replace
|
@Replace
|
||||||
@Override
|
@Override
|
||||||
public void kill(){
|
public void kill(){
|
||||||
@@ -1307,6 +1312,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
return switch(sensor){
|
return switch(sensor){
|
||||||
case x -> World.conv(x);
|
case x -> World.conv(x);
|
||||||
case y -> World.conv(y);
|
case y -> World.conv(y);
|
||||||
|
//case dead -> !isValid(); //TODO 126
|
||||||
case team -> team.id;
|
case team -> team.id;
|
||||||
case health -> health;
|
case health -> health;
|
||||||
case maxHealth -> maxHealth;
|
case maxHealth -> maxHealth;
|
||||||
@@ -1327,7 +1333,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
case enabled -> enabled ? 1 : 0;
|
case enabled -> enabled ? 1 : 0;
|
||||||
case controlled -> this instanceof ControlBlock c ? c.isControlled() ? 1 : 0 : 0;
|
case controlled -> this instanceof ControlBlock c ? c.isControlled() ? 1 : 0 : 0;
|
||||||
case payloadCount -> getPayload() != null ? 1 : 0;
|
case payloadCount -> getPayload() != null ? 1 : 0;
|
||||||
default -> 0;
|
default -> Float.NaN; //gets converted to null in logic
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1340,14 +1346,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null;
|
case payloadType -> getPayload() instanceof UnitPayload p1 ? p1.unit.type : getPayload() instanceof BuildPayload p2 ? p2.block() : null;
|
||||||
default -> noSensed;
|
default -> noSensed;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double sense(Content content){
|
public double sense(Content content){
|
||||||
if(content instanceof Item && items != null) return items.get((Item)content);
|
if(content instanceof Item i && items != null) return items.get(i);
|
||||||
if(content instanceof Liquid && liquids != null) return liquids.get((Liquid)content);
|
if(content instanceof Liquid l && liquids != null) return liquids.get(l);
|
||||||
return 0;
|
return Float.NaN; //invalid sense
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import mindustry.annotations.Annotations.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
abstract class HitboxComp implements Posc, QuadTreeObject{
|
abstract class HitboxComp implements Posc, Sized, QuadTreeObject{
|
||||||
@Import float x, y;
|
@Import float x, y;
|
||||||
|
|
||||||
transient float lastX, lastY, deltaX, deltaY, hitSize;
|
transient float lastX, lastY, deltaX, deltaY, hitSize;
|
||||||
@@ -28,6 +28,11 @@ abstract class HitboxComp implements Posc, QuadTreeObject{
|
|||||||
updateLastPosition();
|
updateLastPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float hitSize(){
|
||||||
|
return hitSize;
|
||||||
|
}
|
||||||
|
|
||||||
void getCollisions(Cons<QuadTree> consumer){
|
void getCollisions(Cons<QuadTree> consumer){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
|
|||||||
String name = "noname";
|
String name = "noname";
|
||||||
Color color = new Color();
|
Color color = new Color();
|
||||||
|
|
||||||
|
//locale should not be synced.
|
||||||
|
transient String locale = "en";
|
||||||
transient float deathTimer;
|
transient float deathTimer;
|
||||||
transient String lastText = "";
|
transient String lastText = "";
|
||||||
transient float textFadeTime;
|
transient float textFadeTime;
|
||||||
|
|||||||
5
core/src/mindustry/entities/comp/Sized.java
Normal file
5
core/src/mindustry/entities/comp/Sized.java
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package mindustry.entities.comp;
|
||||||
|
|
||||||
|
public interface Sized{
|
||||||
|
float hitSize();
|
||||||
|
}
|
||||||
@@ -128,6 +128,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
case ammoCapacity -> type.ammoCapacity;
|
case ammoCapacity -> type.ammoCapacity;
|
||||||
case x -> World.conv(x);
|
case x -> World.conv(x);
|
||||||
case y -> World.conv(y);
|
case y -> World.conv(y);
|
||||||
|
//case dead -> dead || !isAdded(); //TODO 126
|
||||||
case team -> team.id;
|
case team -> team.id;
|
||||||
case shooting -> isShooting() ? 1 : 0;
|
case shooting -> isShooting() ? 1 : 0;
|
||||||
case range -> range() / tilesize;
|
case range -> range() / tilesize;
|
||||||
@@ -140,7 +141,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
case controlled -> controller instanceof LogicAI || controller instanceof Player ? 1 : 0;
|
case controlled -> controller instanceof LogicAI || controller instanceof Player ? 1 : 0;
|
||||||
case commanded -> controller instanceof FormationAI ? 1 : 0;
|
case commanded -> controller instanceof FormationAI ? 1 : 0;
|
||||||
case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0;
|
case payloadCount -> self() instanceof Payloadc pay ? pay.payloads().size : 0;
|
||||||
default -> 0;
|
default -> Float.NaN;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +163,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
|||||||
@Override
|
@Override
|
||||||
public double sense(Content content){
|
public double sense(Content content){
|
||||||
if(content == stack().item) return stack().amount;
|
if(content == stack().item) return stack().amount;
|
||||||
return 0;
|
return Float.NaN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -25,8 +25,13 @@ public class MultiEffect extends Effect{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(EffectContainer e){
|
public void render(EffectContainer e){
|
||||||
|
int index = 0;
|
||||||
for(Effect f : effects){
|
for(Effect f : effects){
|
||||||
e.scaled(f.lifetime, f::render);
|
int i = ++index;
|
||||||
|
e.scaled(f.lifetime, cont -> {
|
||||||
|
cont.id = e.id + i;
|
||||||
|
f.render(cont);
|
||||||
|
});
|
||||||
clip = Math.max(clip, f.clip);
|
clip = Math.max(clip, f.clip);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
public class AIController implements UnitController{
|
public class AIController implements UnitController{
|
||||||
protected static final Vec2 vec = new Vec2();
|
protected static final Vec2 vec = new Vec2();
|
||||||
protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2;
|
protected static final int timerTarget = 0, timerTarget2 = 1, timerTarget3 = 2, timerTarget4 = 3;
|
||||||
|
|
||||||
protected Unit unit;
|
protected Unit unit;
|
||||||
protected Interval timer = new Interval(4);
|
protected Interval timer = new Interval(4);
|
||||||
@@ -167,7 +167,7 @@ public class AIController implements UnitController{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected boolean retarget(){
|
protected boolean retarget(){
|
||||||
return timer.get(timerTarget, 40);
|
return timer.get(timerTarget, target == null ? 40 : 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
|
protected Teamc findTarget(float x, float y, float range, boolean air, boolean ground){
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ public class Rules{
|
|||||||
public boolean fire = true;
|
public boolean fire = true;
|
||||||
/** Whether units use and require ammo. */
|
/** Whether units use and require ammo. */
|
||||||
public boolean unitAmmo = false;
|
public boolean unitAmmo = false;
|
||||||
|
/** Whether cores add to unit limit */
|
||||||
|
public boolean unitCapVariable = true;
|
||||||
/** How fast unit pads build units. */
|
/** How fast unit pads build units. */
|
||||||
public float unitBuildSpeedMultiplier = 1f;
|
public float unitBuildSpeedMultiplier = 1f;
|
||||||
/** How much damage any other units deal. */
|
/** How much damage any other units deal. */
|
||||||
@@ -63,7 +65,7 @@ public class Rules{
|
|||||||
/** Radius around enemy wave drop zones.*/
|
/** Radius around enemy wave drop zones.*/
|
||||||
public float dropZoneRadius = 300f;
|
public float dropZoneRadius = 300f;
|
||||||
/** Time between waves in ticks. */
|
/** Time between waves in ticks. */
|
||||||
public float waveSpacing = 60 * 60 * 2;
|
public float waveSpacing = 2 * Time.toMinutes;
|
||||||
/** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */
|
/** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */
|
||||||
public int winWave = 0;
|
public int winWave = 0;
|
||||||
/** Base unit cap. Can still be increased by blocks. */
|
/** Base unit cap. Can still be increased by blocks. */
|
||||||
@@ -137,7 +139,7 @@ public class Rules{
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** A simple map for storing TeamRules in an efficient way without hashing. */
|
/** A simple map for storing TeamRules in an efficient way without hashing. */
|
||||||
public static class TeamRules implements Serializable{
|
public static class TeamRules implements JsonSerializable{
|
||||||
final TeamRule[] values = new TeamRule[Team.all.length];
|
final TeamRule[] values = new TeamRule[Team.all.length];
|
||||||
|
|
||||||
public TeamRule get(Team team){
|
public TeamRule get(Team team){
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import static mindustry.Vars.*;
|
|||||||
* weapon equipped, ammo used, and status effects.
|
* weapon equipped, ammo used, and status effects.
|
||||||
* Each spawn group can have multiple sub-groups spawned in different areas of the map.
|
* Each spawn group can have multiple sub-groups spawned in different areas of the map.
|
||||||
*/
|
*/
|
||||||
public class SpawnGroup implements Serializable{
|
public class SpawnGroup implements JsonSerializable{
|
||||||
public static final int never = Integer.MAX_VALUE;
|
public static final int never = Integer.MAX_VALUE;
|
||||||
|
|
||||||
/** The unit type spawned */
|
/** The unit type spawned */
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ public class FloorRenderer implements Disposable{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Draw.flush();
|
||||||
cbatch.setProjection(Core.camera.mat);
|
cbatch.setProjection(Core.camera.mat);
|
||||||
cbatch.beginDraw();
|
cbatch.beginDraw();
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class LoadRenderer implements Disposable{
|
|||||||
bars = new Bar[]{
|
bars = new Bar[]{
|
||||||
new Bar("s_proc#", OS.cores / 16f, OS.cores < 4),
|
new Bar("s_proc#", OS.cores / 16f, OS.cores < 4),
|
||||||
new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false),
|
new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false),
|
||||||
new Bar("g_vtype", graphics.getGLVersion().type == Type.GLES ? 0.5f : 1f, graphics.getGLVersion().type == Type.GLES),
|
new Bar("g_vtype", graphics.getGLVersion().type == GlType.GLES ? 0.5f : 1f, graphics.getGLVersion().type == GlType.GLES),
|
||||||
new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110),
|
new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024 * 1024 * 110),
|
||||||
new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")),
|
new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")),
|
||||||
new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac),
|
new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac),
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import mindustry.type.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class Shaders{
|
public class Shaders{
|
||||||
public static BlockBuild blockbuild;
|
public static BlockBuildShader blockbuild;
|
||||||
public static @Nullable ShieldShader shield;
|
public static @Nullable ShieldShader shield;
|
||||||
public static BuildBeamShader buildBeam;
|
public static BuildBeamShader buildBeam;
|
||||||
public static UnitBuild build;
|
public static UnitBuildShader build;
|
||||||
public static DarknessShader darkness;
|
public static DarknessShader darkness;
|
||||||
public static LightShader light;
|
public static LightShader light;
|
||||||
public static SurfaceShader water, mud, tar, slag, space;
|
public static SurfaceShader water, mud, tar, slag, space;
|
||||||
@@ -31,7 +31,7 @@ public class Shaders{
|
|||||||
|
|
||||||
public static void init(){
|
public static void init(){
|
||||||
mesh = new MeshShader();
|
mesh = new MeshShader();
|
||||||
blockbuild = new BlockBuild();
|
blockbuild = new BlockBuildShader();
|
||||||
try{
|
try{
|
||||||
shield = new ShieldShader();
|
shield = new ShieldShader();
|
||||||
}catch(Throwable t){
|
}catch(Throwable t){
|
||||||
@@ -40,7 +40,7 @@ public class Shaders{
|
|||||||
t.printStackTrace();
|
t.printStackTrace();
|
||||||
}
|
}
|
||||||
buildBeam = new BuildBeamShader();
|
buildBeam = new BuildBeamShader();
|
||||||
build = new UnitBuild();
|
build = new UnitBuildShader();
|
||||||
darkness = new DarknessShader();
|
darkness = new DarknessShader();
|
||||||
light = new LightShader();
|
light = new LightShader();
|
||||||
water = new SurfaceShader("water");
|
water = new SurfaceShader("water");
|
||||||
@@ -142,12 +142,16 @@ public class Shaders{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class UnitBuild extends LoadShader{
|
/** @deprecated transition class for mods; use UnitBuildShader instead. */
|
||||||
|
@Deprecated
|
||||||
|
public static class UnitBuild extends UnitBuildShader{}
|
||||||
|
|
||||||
|
public static class UnitBuildShader extends LoadShader{
|
||||||
public float progress, time;
|
public float progress, time;
|
||||||
public Color color = new Color();
|
public Color color = new Color();
|
||||||
public TextureRegion region;
|
public TextureRegion region;
|
||||||
|
|
||||||
public UnitBuild(){
|
public UnitBuildShader(){
|
||||||
super("unitbuild", "default");
|
super("unitbuild", "default");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,11 +166,11 @@ public class Shaders{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BlockBuild extends LoadShader{
|
public static class BlockBuildShader extends LoadShader{
|
||||||
public float progress;
|
public float progress;
|
||||||
public TextureRegion region = new TextureRegion();
|
public TextureRegion region = new TextureRegion();
|
||||||
|
|
||||||
public BlockBuild(){
|
public BlockBuildShader(){
|
||||||
super("blockbuild", "default");
|
super("blockbuild", "default");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import arc.graphics.g2d.*;
|
|||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.scene.*;
|
import arc.scene.*;
|
||||||
import arc.scene.event.*;
|
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
@@ -46,34 +45,36 @@ public class DesktopInput extends InputHandler{
|
|||||||
/** Mouse pan speed. */
|
/** Mouse pan speed. */
|
||||||
public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f;
|
public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 11f;
|
||||||
|
|
||||||
|
boolean showHint(){
|
||||||
|
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() &&
|
||||||
|
(!isBuilding && !Core.settings.getBool("buildautopause") || player.unit().isBuilding() || !player.dead() && !player.unit().spawnedByCore());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildUI(Group group){
|
public void buildUI(Group group){
|
||||||
//respawn hints
|
//building and 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.color.a = 0f;
|
||||||
|
t.visible(() -> (t.color.a = Mathf.lerpDelta(t.color.a, Mathf.num(showHint()), 0.15f)) > 0.001f);
|
||||||
t.bottom();
|
t.bottom();
|
||||||
t.table(Styles.black6, b -> {
|
t.table(Styles.black6, b -> {
|
||||||
|
StringBuilder str = new StringBuilder();
|
||||||
b.defaults().left();
|
b.defaults().left();
|
||||||
b.label(() -> Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())).style(Styles.outlineLabel);
|
b.label(() -> {
|
||||||
}).margin(6f);
|
if(!showHint()) return str;
|
||||||
});
|
str.setLength(0);
|
||||||
|
if(!isBuilding && !Core.settings.getBool("buildautopause") && !player.unit().isBuilding()){
|
||||||
//building hints
|
str.append(Core.bundle.format("enablebuilding", Core.keybinds.get(Binding.pause_building).key.toString()));
|
||||||
group.fill(t -> {
|
}else if(player.unit().isBuilding()){
|
||||||
t.bottom();
|
str.append(Core.bundle.format(isBuilding ? "pausebuilding" : "resumebuilding", Core.keybinds.get(Binding.pause_building).key.toString()))
|
||||||
t.visible(() -> {
|
.append("\n").append(Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString()))
|
||||||
t.color.a = Mathf.lerpDelta(t.color.a, player.unit().isBuilding() ? 1f : 0f, 0.15f);
|
.append("\n").append(Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString()));
|
||||||
|
}
|
||||||
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() && t.color.a > 0.01f;
|
if(!player.dead() && !player.unit().spawnedByCore()){
|
||||||
});
|
str.append(str.length() != 0 ? "\n" : "").append(Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString()));
|
||||||
t.touchable(() -> t.color.a < 0.1f ? Touchable.disabled : Touchable.childrenOnly);
|
}
|
||||||
t.table(Styles.black6, b -> {
|
return str;
|
||||||
b.defaults().left();
|
}).style(Styles.outlineLabel);
|
||||||
b.label(() -> Core.bundle.format(!isBuilding ? "resumebuilding" : "pausebuilding", Core.keybinds.get(Binding.pause_building).key.toString())).style(Styles.outlineLabel);
|
|
||||||
b.row();
|
|
||||||
b.label(() -> Core.bundle.format("cancelbuilding", Core.keybinds.get(Binding.clear_building).key.toString())).style(Styles.outlineLabel);
|
|
||||||
b.row();
|
|
||||||
b.label(() -> Core.bundle.format("selectschematic", Core.keybinds.get(Binding.schematic_select).key.toString())).style(Styles.outlineLabel);
|
|
||||||
}).margin(10f);
|
}).margin(10f);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public class Placement{
|
|||||||
i ++;
|
i ++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!addedLast) result.add(base.peek());
|
if(!addedLast && !base.isEmpty()) result.add(base.peek());
|
||||||
|
|
||||||
points.clear();
|
points.clear();
|
||||||
points.addAll(result);
|
points.addAll(result);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ public enum ConditionOp{
|
|||||||
lessThanEq("<=", (a, b) -> a <= b),
|
lessThanEq("<=", (a, b) -> a <= b),
|
||||||
greaterThan(">", (a, b) -> a > b),
|
greaterThan(">", (a, b) -> a > b),
|
||||||
greaterThanEq(">=", (a, b) -> a >= b),
|
greaterThanEq(">=", (a, b) -> a >= b),
|
||||||
|
strictEqual("===", (a, b) -> false),
|
||||||
always("always", (a, b) -> true);
|
always("always", (a, b) -> true);
|
||||||
|
|
||||||
public static final ConditionOp[] all = values();
|
public static final ConditionOp[] all = values();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public enum LAccess{
|
|||||||
y,
|
y,
|
||||||
shootX,
|
shootX,
|
||||||
shootY,
|
shootY,
|
||||||
|
//dead, //TODO 126
|
||||||
range,
|
range,
|
||||||
shooting,
|
shooting,
|
||||||
mineX,
|
mineX,
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ public class LAssembler{
|
|||||||
public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>();
|
public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>();
|
||||||
public static final int maxTokenLength = 36;
|
public static final int maxTokenLength = 36;
|
||||||
|
|
||||||
|
private static final StringMap opNameChanges = StringMap.of(
|
||||||
|
"atan2", "angle",
|
||||||
|
"dst", "len"
|
||||||
|
);
|
||||||
|
|
||||||
private int lastVar;
|
private int lastVar;
|
||||||
/** Maps names to variable IDs. */
|
/** Maps names to variable IDs. */
|
||||||
public ObjectMap<String, BVar> vars = new ObjectMap<>();
|
public ObjectMap<String, BVar> vars = new ObjectMap<>();
|
||||||
@@ -28,6 +33,8 @@ public class LAssembler{
|
|||||||
putConst("@unit", null);
|
putConst("@unit", null);
|
||||||
//reference to self
|
//reference to self
|
||||||
putConst("@this", null);
|
putConst("@this", null);
|
||||||
|
//global tick
|
||||||
|
putConst("@tick", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static LAssembler assemble(String data, int maxInstructions){
|
public static LAssembler assemble(String data, int maxInstructions){
|
||||||
@@ -125,6 +132,11 @@ public class LAssembler{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//fix up changed operaiton names
|
||||||
|
if(type.equals("op")){
|
||||||
|
arr[1] = opNameChanges.get(arr[1], arr[1]);
|
||||||
|
}
|
||||||
|
|
||||||
LStatement st = LogicIO.read(arr);
|
LStatement st = LogicIO.read(arr);
|
||||||
|
|
||||||
if(st != null){
|
if(st != null){
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import arc.scene.ui.*;
|
|||||||
import arc.scene.ui.layout.*;
|
import arc.scene.ui.layout.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
@@ -29,10 +30,26 @@ public class LCanvas extends Table{
|
|||||||
StatementElem hovered;
|
StatementElem hovered;
|
||||||
float targetWidth;
|
float targetWidth;
|
||||||
int jumpCount = 0;
|
int jumpCount = 0;
|
||||||
|
Seq<Tooltip> tooltips = new Seq<>();
|
||||||
|
|
||||||
public LCanvas(){
|
public LCanvas(){
|
||||||
canvas = this;
|
canvas = this;
|
||||||
|
|
||||||
|
Core.scene.addListener(new InputListener(){
|
||||||
|
@Override
|
||||||
|
public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
|
||||||
|
//hide tooltips on tap
|
||||||
|
for(var t : tooltips){
|
||||||
|
t.container.toFront();
|
||||||
|
}
|
||||||
|
Core.app.post(() -> {
|
||||||
|
tooltips.each(Tooltip::hide);
|
||||||
|
tooltips.clear();
|
||||||
|
});
|
||||||
|
return super.touchDown(event, x, y, pointer, button);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
rebuild();
|
rebuild();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +58,43 @@ public class LCanvas extends Table{
|
|||||||
return Core.graphics.getWidth() < Scl.scl(900f) * 1.2f;
|
return Core.graphics.getWidth() < Scl.scl(900f) * 1.2f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void tooltip(Cell<?> cell, String key){
|
||||||
|
String lkey = key.toLowerCase().replace(" ", "");
|
||||||
|
if(Core.settings.getBool("logichints", true) && Core.bundle.has(lkey)){
|
||||||
|
var tip = new Tooltip(t -> t.background(Styles.black8).margin(4f).add("[lightgray]" + Core.bundle.get(lkey)).style(Styles.outlineLabel));
|
||||||
|
|
||||||
|
//mobile devices need long-press tooltips
|
||||||
|
if(Vars.mobile){
|
||||||
|
cell.get().addListener(new ElementGestureListener(20, 0.4f, 0.43f, 0.15f){
|
||||||
|
@Override
|
||||||
|
public boolean longPress(Element element, float x, float y){
|
||||||
|
tip.show(element, x, y);
|
||||||
|
canvas.tooltips.add(tip);
|
||||||
|
//prevent touch down for other listeners
|
||||||
|
for(var list : cell.get().getListeners()){
|
||||||
|
if(list instanceof ClickListener cl){
|
||||||
|
cl.cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
cell.get().addListener(tip);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void tooltip(Cell<?> cell, Enum<?> key){
|
||||||
|
String cl = key.getClass().getSimpleName().toLowerCase() + "." + key.name().toLowerCase();
|
||||||
|
if(Core.bundle.has(cl)){
|
||||||
|
tooltip(cell, cl);
|
||||||
|
}else{
|
||||||
|
tooltip(cell, "lenum." + key.name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void rebuild(){
|
public void rebuild(){
|
||||||
targetWidth = useRows() ? 400f : 900f;
|
targetWidth = useRows() ? 400f : 900f;
|
||||||
float s = pane != null ? pane.getScrollPercentY() : 0f;
|
float s = pane != null ? pane.getScrollPercentY() : 0f;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package mindustry.logic;
|
package mindustry.logic;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
import arc.math.geom.*;
|
import arc.math.geom.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
@@ -35,7 +36,8 @@ public class LExecutor{
|
|||||||
varCounter = 0,
|
varCounter = 0,
|
||||||
varTime = 1,
|
varTime = 1,
|
||||||
varUnit = 2,
|
varUnit = 2,
|
||||||
varThis = 3;
|
varThis = 3,
|
||||||
|
varTick = 4;
|
||||||
|
|
||||||
public static final int
|
public static final int
|
||||||
maxGraphicsBuffer = 256,
|
maxGraphicsBuffer = 256,
|
||||||
@@ -60,6 +62,7 @@ public class LExecutor{
|
|||||||
public void runOnce(){
|
public void runOnce(){
|
||||||
//set time
|
//set time
|
||||||
vars[varTime].numval = Time.millis();
|
vars[varTime].numval = Time.millis();
|
||||||
|
vars[varTick].numval = Time.time;
|
||||||
|
|
||||||
//reset to start
|
//reset to start
|
||||||
if(vars[varCounter].numval >= instructions.length || vars[varCounter].numval < 0){
|
if(vars[varCounter].numval >= instructions.length || vars[varCounter].numval < 0){
|
||||||
@@ -98,6 +101,10 @@ public class LExecutor{
|
|||||||
|
|
||||||
//region utility
|
//region utility
|
||||||
|
|
||||||
|
private static boolean invalid(double d){
|
||||||
|
return Double.isNaN(d) || Double.isInfinite(d);
|
||||||
|
}
|
||||||
|
|
||||||
public Var var(int index){
|
public Var var(int index){
|
||||||
//global constants have variable IDs < 0, and they are fetched from the global constants object after being negated
|
//global constants have variable IDs < 0, and they are fetched from the global constants object after being negated
|
||||||
return index < 0 ? constants.get(-index) : vars[index];
|
return index < 0 ? constants.get(-index) : vars[index];
|
||||||
@@ -120,12 +127,12 @@ public class LExecutor{
|
|||||||
|
|
||||||
public double num(int index){
|
public double num(int index){
|
||||||
Var v = var(index);
|
Var v = var(index);
|
||||||
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : v.numval;
|
return v.isobj ? v.objval != null ? 1 : 0 : invalid(v.numval) ? 0 : v.numval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public float numf(int index){
|
public float numf(int index){
|
||||||
Var v = var(index);
|
Var v = var(index);
|
||||||
return v.isobj ? v.objval != null ? 1 : 0 : Double.isNaN(v.numval) || Double.isInfinite(v.numval) ? 0 : (float)v.numval;
|
return v.isobj ? v.objval != null ? 1 : 0 : invalid(v.numval) ? 0 : (float)v.numval;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int numi(int index){
|
public int numi(int index){
|
||||||
@@ -139,10 +146,15 @@ public class LExecutor{
|
|||||||
public void setnum(int index, double value){
|
public void setnum(int index, double value){
|
||||||
Var v = var(index);
|
Var v = var(index);
|
||||||
if(v.constant) return;
|
if(v.constant) return;
|
||||||
v.numval = Double.isNaN(value) || Double.isInfinite(value) ? 0 : value;
|
if(invalid(value)){
|
||||||
|
v.objval = null;
|
||||||
|
v.isobj = true;
|
||||||
|
}else{
|
||||||
|
v.numval = value;
|
||||||
v.objval = null;
|
v.objval = null;
|
||||||
v.isobj = false;
|
v.isobj = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void setobj(int index, Object value){
|
public void setobj(int index, Object value){
|
||||||
Var v = var(index);
|
Var v = var(index);
|
||||||
@@ -326,17 +338,19 @@ public class LExecutor{
|
|||||||
@Nullable
|
@Nullable
|
||||||
public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){
|
public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){
|
||||||
if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){
|
if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){
|
||||||
if(!(unit.controller() instanceof LogicAI)){
|
if(unit.controller() instanceof LogicAI la){
|
||||||
unit.controller(new LogicAI());
|
return la;
|
||||||
((LogicAI)unit.controller()).controller = exec.building(varThis);
|
}else{
|
||||||
|
var la = new LogicAI();
|
||||||
|
la.controller = exec.building(varThis);
|
||||||
|
|
||||||
|
unit.controller(la);
|
||||||
//clear old state
|
//clear old state
|
||||||
unit.mineTile = null;
|
unit.mineTile = null;
|
||||||
unit.clearBuilding();
|
unit.clearBuilding();
|
||||||
|
|
||||||
return (LogicAI)unit.controller();
|
return la;
|
||||||
}
|
}
|
||||||
return (LogicAI)unit.controller();
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -622,21 +636,21 @@ public class LExecutor{
|
|||||||
|
|
||||||
//note that remote units/buildings can be sensed as well
|
//note that remote units/buildings can be sensed as well
|
||||||
if(target instanceof Senseable se){
|
if(target instanceof Senseable se){
|
||||||
if(sense instanceof Content){
|
if(sense instanceof Content co){
|
||||||
exec.setnum(to, se.sense(((Content)sense)));
|
exec.setnum(to, se.sense(co));
|
||||||
}else if(sense instanceof LAccess){
|
}else if(sense instanceof LAccess la){
|
||||||
Object objOut = se.senseObject((LAccess)sense);
|
Object objOut = se.senseObject(la);
|
||||||
|
|
||||||
if(objOut == Senseable.noSensed){
|
if(objOut == Senseable.noSensed){
|
||||||
//numeric output
|
//numeric output
|
||||||
exec.setnum(to, se.sense((LAccess)sense));
|
exec.setnum(to, se.sense(la));
|
||||||
}else{
|
}else{
|
||||||
//object output
|
//object output
|
||||||
exec.setobj(to, objOut);
|
exec.setobj(to, objOut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
exec.setnum(to, 0);
|
exec.setobj(to, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -752,7 +766,7 @@ public class LExecutor{
|
|||||||
v.objval = f.objval;
|
v.objval = f.objval;
|
||||||
v.isobj = true;
|
v.isobj = true;
|
||||||
}else{
|
}else{
|
||||||
v.numval = Double.isNaN(f.numval) || Double.isInfinite(f.numval) ? 0 : f.numval;
|
v.numval = invalid(f.numval) ? 0 : f.numval;
|
||||||
v.isobj = false;
|
v.isobj = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -774,14 +788,17 @@ public class LExecutor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(LExecutor exec){
|
public void run(LExecutor exec){
|
||||||
if(op.unary){
|
if(op == LogicOp.strictEqual){
|
||||||
|
Var v = exec.var(a), v2 = exec.var(b);
|
||||||
|
exec.setnum(dest, v.isobj == v2.isobj && ((v.isobj && v.objval == v2.objval) || (!v.isobj && v.numval == v2.numval)) ? 1 : 0);
|
||||||
|
}else if(op.unary){
|
||||||
exec.setnum(dest, op.function1.get(exec.num(a)));
|
exec.setnum(dest, op.function1.get(exec.num(a)));
|
||||||
}else{
|
}else{
|
||||||
Var va = exec.var(a);
|
Var va = exec.var(a);
|
||||||
Var vb = exec.var(b);
|
Var vb = exec.var(b);
|
||||||
|
|
||||||
if(op.objFunction2 != null && va.isobj && vb.isobj){
|
if(op.objFunction2 != null && va.isobj && vb.isobj){
|
||||||
//use object function if provided, and one of the variables is an object
|
//use object function if both are objects
|
||||||
exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b)));
|
exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b)));
|
||||||
}else{
|
}else{
|
||||||
//otherwise use the numeric function
|
//otherwise use the numeric function
|
||||||
@@ -951,8 +968,10 @@ public class LExecutor{
|
|||||||
Var vb = exec.var(compare);
|
Var vb = exec.var(compare);
|
||||||
boolean cmp;
|
boolean cmp;
|
||||||
|
|
||||||
if(op.objFunction != null && va.isobj && vb.isobj){
|
if(op == ConditionOp.strictEqual){
|
||||||
//use object function if provided, and one of the variables is an object
|
cmp = va.isobj == vb.isobj && ((va.isobj && va.objval == vb.objval) || (!va.isobj && va.numval == vb.numval));
|
||||||
|
}else if(op.objFunction != null && va.isobj && vb.isobj){
|
||||||
|
//use object function if both are objects
|
||||||
cmp = op.objFunction.get(exec.obj(value), exec.obj(compare));
|
cmp = op.objFunction.get(exec.obj(value), exec.obj(compare));
|
||||||
}else{
|
}else{
|
||||||
cmp = op.function.get(exec.num(value), exec.num(compare));
|
cmp = op.function.get(exec.num(value), exec.num(compare));
|
||||||
@@ -965,5 +984,37 @@ public class LExecutor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class WaitI implements LInstruction{
|
||||||
|
public int value;
|
||||||
|
|
||||||
|
public float curTime;
|
||||||
|
public double wait;
|
||||||
|
public long frameId;
|
||||||
|
|
||||||
|
public WaitI(int value){
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public WaitI(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(LExecutor exec){
|
||||||
|
if(curTime >= exec.num(value)){
|
||||||
|
curTime = 0f;
|
||||||
|
}else{
|
||||||
|
//skip back to self.
|
||||||
|
exec.var(varCounter).numval --;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Core.graphics.getFrameId() != frameId){
|
||||||
|
curTime += Time.delta / 60f;
|
||||||
|
frameId = Core.graphics.getFrameId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ import mindustry.logic.LCanvas.*;
|
|||||||
import mindustry.logic.LExecutor.*;
|
import mindustry.logic.LExecutor.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
|
|
||||||
|
import static mindustry.logic.LCanvas.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A statement is an intermediate representation of an instruction, to be used mostly in UI.
|
* A statement is an intermediate representation of an instruction, to be used mostly in UI.
|
||||||
* Contains all relevant variable information. */
|
* Contains all relevant variable information. */
|
||||||
@@ -38,13 +40,18 @@ public abstract class LStatement{
|
|||||||
|
|
||||||
//protected methods are only for internal UI layout utilities
|
//protected methods are only for internal UI layout utilities
|
||||||
|
|
||||||
|
protected void param(Cell<Label> label){
|
||||||
|
String text = name() + "." + label.get().getText().toString().trim();
|
||||||
|
tooltip(label, text);
|
||||||
|
}
|
||||||
|
|
||||||
protected Cell<TextField> field(Table table, String value, Cons<String> setter){
|
protected Cell<TextField> field(Table table, String value, Cons<String> setter){
|
||||||
return table.field(value, Styles.nodeField, setter)
|
return table.field(value, Styles.nodeField, setter)
|
||||||
.size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength).addInputDialog();
|
.size(144f, 40f).pad(2f).color(table.color).maxTextLength(LAssembler.maxTokenLength).addInputDialog();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){
|
protected Cell<TextField> fields(Table table, String desc, String value, Cons<String> setter){
|
||||||
table.add(desc).padLeft(10).left();
|
table.add(desc).padLeft(10).left().self(this::param);;
|
||||||
return field(table, value, setter).width(85f).padRight(10).left();
|
return field(table, value, setter).width(85f).padRight(10).left();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,29 +65,40 @@ public abstract class LStatement{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected <T> void showSelect(Button b, T[] values, T current, Cons<T> getter, int cols, Cons<Cell> sizer){
|
protected <T extends Enum<T>> void showSelect(Button b, T[] values, T current, Cons<T> getter, int cols, Cons<Cell> sizer){
|
||||||
showSelectTable(b, (t, hide) -> {
|
showSelectTable(b, (t, hide) -> {
|
||||||
ButtonGroup<Button> group = new ButtonGroup<>();
|
ButtonGroup<Button> group = new ButtonGroup<>();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
t.defaults().size(56f, 40f);
|
t.defaults().size(60f, 38f);
|
||||||
|
|
||||||
for(T p : values){
|
for(T p : values){
|
||||||
sizer.get(t.button(p.toString(), Styles.clearTogglet, () -> {
|
sizer.get(t.button(p.toString(), Styles.logicTogglet, () -> {
|
||||||
getter.get(p);
|
getter.get(p);
|
||||||
hide.run();
|
hide.run();
|
||||||
}).checked(current == p).group(group));
|
}).self(c -> tooltip(c, p)).checked(current == p).group(group));
|
||||||
|
|
||||||
if(++i % cols == 0) t.row();
|
if(++i % cols == 0) t.row();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected <T> void showSelect(Button b, T[] values, T current, Cons<T> getter){
|
protected <T extends Enum<T>> void showSelect(Button b, T[] values, T current, Cons<T> getter){
|
||||||
showSelect(b, values, current, getter, 4, c -> {});
|
showSelect(b, values, current, getter, 4, c -> {});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void showSelectTable(Button b, Cons2<Table, Runnable> hideCons){
|
protected void showSelectTable(Button b, Cons2<Table, Runnable> hideCons){
|
||||||
Table t = new Table(Tex.button);
|
Table t = new Table(Tex.paneSolid){
|
||||||
|
@Override
|
||||||
|
public float getPrefHeight(){
|
||||||
|
return Math.min(super.getPrefHeight(), Core.graphics.getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getPrefWidth(){
|
||||||
|
return Math.min(super.getPrefWidth(), Core.graphics.getWidth());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
t.margin(4);
|
||||||
|
|
||||||
//triggers events behind the element to simulate deselection
|
//triggers events behind the element to simulate deselection
|
||||||
Element hitter = new Element();
|
Element hitter = new Element();
|
||||||
@@ -110,14 +128,15 @@ public abstract class LStatement{
|
|||||||
if(t.getWidth() > Core.scene.getWidth()) t.setWidth(Core.graphics.getWidth());
|
if(t.getWidth() > Core.scene.getWidth()) t.setWidth(Core.graphics.getWidth());
|
||||||
if(t.getHeight() > Core.scene.getHeight()) t.setHeight(Core.graphics.getHeight());
|
if(t.getHeight() > Core.scene.getHeight()) t.setHeight(Core.graphics.getHeight());
|
||||||
t.keepInStage();
|
t.keepInStage();
|
||||||
|
t.invalidateHierarchy();
|
||||||
|
t.pack();
|
||||||
});
|
});
|
||||||
t.actions(Actions.alpha(0), Actions.fadeIn(0.3f, Interp.fade));
|
t.actions(Actions.alpha(0), Actions.fadeIn(0.3f, Interp.fade));
|
||||||
|
|
||||||
t.top().pane(inner -> {
|
t.top().pane(inner -> {
|
||||||
inner.marginRight(24f);
|
|
||||||
inner.top();
|
inner.top();
|
||||||
hideCons.get(inner, hide);
|
hideCons.get(inner, hide);
|
||||||
}).top();
|
}).pad(0f).top().get().setScrollingDisabled(true, false);
|
||||||
|
|
||||||
t.pack();
|
t.pack();
|
||||||
}
|
}
|
||||||
@@ -139,4 +158,5 @@ public abstract class LStatement{
|
|||||||
public String name(){
|
public String name(){
|
||||||
return Strings.insertSpaces(getClass().getSimpleName().replace("Statement", ""));
|
return Strings.insertSpaces(getClass().getSimpleName().replace("Statement", ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import mindustry.type.*;
|
|||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
|
|
||||||
|
import static mindustry.logic.LCanvas.*;
|
||||||
import static mindustry.world.blocks.logic.LogicDisplay.*;
|
import static mindustry.world.blocks.logic.LogicDisplay.*;
|
||||||
|
|
||||||
public class LStatements{
|
public class LStatements{
|
||||||
@@ -355,7 +356,7 @@ public class LStatements{
|
|||||||
}, 2, cell -> cell.size(100, 50)));
|
}, 2, cell -> cell.size(100, 50)));
|
||||||
}, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2);
|
}, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2);
|
||||||
|
|
||||||
table.add(" of ");
|
table.add(" of ").self(this::param);
|
||||||
|
|
||||||
field(table, target, v -> target = v);
|
field(table, target, v -> target = v);
|
||||||
|
|
||||||
@@ -394,7 +395,7 @@ public class LStatements{
|
|||||||
table.defaults().left();
|
table.defaults().left();
|
||||||
|
|
||||||
if(buildFrom()){
|
if(buildFrom()){
|
||||||
table.add(" from ");
|
table.add(" from ").self(this::param);
|
||||||
|
|
||||||
fields(table, radar, v -> radar = v);
|
fields(table, radar, v -> radar = v);
|
||||||
|
|
||||||
@@ -405,7 +406,7 @@ public class LStatements{
|
|||||||
int fi = i;
|
int fi = i;
|
||||||
Prov<RadarTarget> get = () -> (fi == 0 ? target1 : fi == 1 ? target2 : target3);
|
Prov<RadarTarget> get = () -> (fi == 0 ? target1 : fi == 1 ? target2 : target3);
|
||||||
|
|
||||||
table.add(i == 0 ? " target " : " and ");
|
table.add(i == 0 ? " target " : " and ").self(this::param);
|
||||||
|
|
||||||
table.button(b -> {
|
table.button(b -> {
|
||||||
b.label(() -> get.get().name());
|
b.label(() -> get.get().name());
|
||||||
@@ -419,13 +420,13 @@ public class LStatements{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
table.add(" order ");
|
table.add(" order ").self(this::param);
|
||||||
|
|
||||||
fields(table, sortOrder, v -> sortOrder = v);
|
fields(table, sortOrder, v -> sortOrder = v);
|
||||||
|
|
||||||
table.row();
|
table.row();
|
||||||
|
|
||||||
table.add(" sort ");
|
table.add(" sort ").self(this::param);
|
||||||
|
|
||||||
table.button(b -> {
|
table.button(b -> {
|
||||||
b.label(() -> sort.name());
|
b.label(() -> sort.name());
|
||||||
@@ -434,7 +435,7 @@ public class LStatements{
|
|||||||
}, 2, cell -> cell.size(100, 50)));
|
}, 2, cell -> cell.size(100, 50)));
|
||||||
}, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2);
|
}, Styles.logict, () -> {}).size(90, 40).color(table.color).left().padLeft(2);
|
||||||
|
|
||||||
table.add(" output ");
|
table.add(" output ").self(this::param);
|
||||||
|
|
||||||
fields(table, output, v -> output = v);
|
fields(table, output, v -> output = v);
|
||||||
}
|
}
|
||||||
@@ -511,7 +512,7 @@ public class LStatements{
|
|||||||
i.button(sensor.name(), Styles.cleart, () -> {
|
i.button(sensor.name(), Styles.cleart, () -> {
|
||||||
stype("@" + sensor.name());
|
stype("@" + sensor.name());
|
||||||
hide.run();
|
hide.run();
|
||||||
}).size(240f, 40f).row();
|
}).size(240f, 40f).self(c -> tooltip(c, sensor)).row();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
@@ -531,14 +532,14 @@ public class LStatements{
|
|||||||
|
|
||||||
t.parent.parent.pack();
|
t.parent.parent.pack();
|
||||||
t.parent.parent.invalidateHierarchy();
|
t.parent.parent.invalidateHierarchy();
|
||||||
}).size(80f, 50f).growX().checked(selected == fi).group(group);
|
}).height(50f).growX().checked(selected == fi).group(group);
|
||||||
}
|
}
|
||||||
t.row();
|
t.row();
|
||||||
t.add(stack).colspan(3).width(240f).left();
|
t.add(stack).colspan(3).width(240f).left();
|
||||||
}));
|
}));
|
||||||
}, Styles.logict, () -> {}).size(40f).padLeft(-1).color(table.color);
|
}, Styles.logict, () -> {}).size(40f).padLeft(-1).color(table.color);
|
||||||
|
|
||||||
table.add(" in ");
|
table.add(" in ").self(this::param);
|
||||||
|
|
||||||
field(table, from, str -> from = str);
|
field(table, from, str -> from = str);
|
||||||
}
|
}
|
||||||
@@ -608,6 +609,20 @@ public class LStatements{
|
|||||||
}else{
|
}else{
|
||||||
row(table);
|
row(table);
|
||||||
|
|
||||||
|
//"function"-type operations have the name at the left and arguments on the right
|
||||||
|
if(op.func){
|
||||||
|
if(LCanvas.useRows()){
|
||||||
|
table.left();
|
||||||
|
table.row();
|
||||||
|
table.table(c -> {
|
||||||
|
c.color.set(color());
|
||||||
|
c.left();
|
||||||
|
funcs(c);
|
||||||
|
}).colspan(2).left();
|
||||||
|
}else{
|
||||||
|
funcs(table);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
field(table, a, str -> a = str);
|
field(table, a, str -> a = str);
|
||||||
|
|
||||||
opButton(table);
|
opButton(table);
|
||||||
@@ -615,6 +630,15 @@ public class LStatements{
|
|||||||
field(table, b, str -> b = str);
|
field(table, b, str -> b = str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void funcs(Table table){
|
||||||
|
opButton(table);
|
||||||
|
|
||||||
|
field(table, a, str -> a = str);
|
||||||
|
|
||||||
|
field(table, b, str -> b = str);
|
||||||
|
}
|
||||||
|
|
||||||
void opButton(Table table){
|
void opButton(Table table){
|
||||||
table.button(b -> {
|
table.button(b -> {
|
||||||
@@ -623,7 +647,7 @@ public class LStatements{
|
|||||||
op = o;
|
op = o;
|
||||||
rebuild(table);
|
rebuild(table);
|
||||||
}));
|
}));
|
||||||
}, Styles.logict, () -> {}).size(60f, 40f).pad(4f).color(table.color);
|
}, Styles.logict, () -> {}).size(64f, 40f).pad(4f).color(table.color);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -637,6 +661,28 @@ public class LStatements{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO untested
|
||||||
|
//@RegisterStatement("wait")
|
||||||
|
public static class WaitStatement extends LStatement{
|
||||||
|
public String value = "0.5";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void build(Table table){
|
||||||
|
field(table, value, str -> value = str);
|
||||||
|
table.add(" sec");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Color color(){
|
||||||
|
return Pal.logicOperations;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LInstruction build(LAssembler builder){
|
||||||
|
return new WaitI(builder.var(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@RegisterStatement("end")
|
@RegisterStatement("end")
|
||||||
public static class EndStatement extends LStatement{
|
public static class EndStatement extends LStatement{
|
||||||
@Override
|
@Override
|
||||||
@@ -855,7 +901,7 @@ public class LStatements{
|
|||||||
void rebuild(Table table){
|
void rebuild(Table table){
|
||||||
table.clearChildren();
|
table.clearChildren();
|
||||||
|
|
||||||
table.add(" find ").left();
|
table.add(" find ").left().self(this::param);;
|
||||||
|
|
||||||
table.button(b -> {
|
table.button(b -> {
|
||||||
b.label(() -> locate.name());
|
b.label(() -> locate.name());
|
||||||
@@ -868,14 +914,14 @@ public class LStatements{
|
|||||||
switch(locate){
|
switch(locate){
|
||||||
case building -> {
|
case building -> {
|
||||||
row(table);
|
row(table);
|
||||||
table.add(" type ").left();
|
table.add(" group ").left().self(this::param);;
|
||||||
table.button(b -> {
|
table.button(b -> {
|
||||||
b.label(() -> flag.name());
|
b.label(() -> flag.name());
|
||||||
b.clicked(() -> showSelect(b, BlockFlag.all, flag, t -> flag = t, 2, cell -> cell.size(110, 50)));
|
b.clicked(() -> showSelect(b, BlockFlag.allLogic, flag, t -> flag = t, 2, cell -> cell.size(110, 50)));
|
||||||
}, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2);
|
}, Styles.logict, () -> {}).size(110, 40).color(table.color).left().padLeft(2);
|
||||||
row(table);
|
row(table);
|
||||||
|
|
||||||
table.add(" enemy ").left();
|
table.add(" enemy ").left().self(this::param);;
|
||||||
|
|
||||||
fields(table, enemy, str -> enemy = str);
|
fields(table, enemy, str -> enemy = str);
|
||||||
|
|
||||||
@@ -883,7 +929,7 @@ public class LStatements{
|
|||||||
}
|
}
|
||||||
|
|
||||||
case ore -> {
|
case ore -> {
|
||||||
table.add(" ore ").left();
|
table.add(" ore ").left().self(this::param);
|
||||||
table.table(ts -> {
|
table.table(ts -> {
|
||||||
ts.color.set(table.color);
|
ts.color.set(table.color);
|
||||||
|
|
||||||
@@ -920,19 +966,19 @@ public class LStatements{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
table.add(" outX ").left();
|
table.add(" outX ").left().self(this::param);
|
||||||
fields(table, outX, str -> outX = str);
|
fields(table, outX, str -> outX = str);
|
||||||
|
|
||||||
table.add(" outY ").left();
|
table.add(" outY ").left().self(this::param);
|
||||||
fields(table, outY, str -> outY = str);
|
fields(table, outY, str -> outY = str);
|
||||||
|
|
||||||
row(table);
|
row(table);
|
||||||
|
|
||||||
table.add(" found ").left();
|
table.add(" found ").left().self(this::param);
|
||||||
fields(table, outFound, str -> outFound = str);
|
fields(table, outFound, str -> outFound = str);
|
||||||
|
|
||||||
if(locate != LLocate.ore){
|
if(locate != LLocate.ore){
|
||||||
table.add(" building ").left();
|
table.add(" building ").left().self(this::param);
|
||||||
fields(table, outBuild, str -> outBuild = str);
|
fields(table, outBuild, str -> outBuild = str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import mindustry.ui.*;
|
|||||||
import mindustry.ui.dialogs.*;
|
import mindustry.ui.dialogs.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
import static mindustry.logic.LCanvas.*;
|
||||||
|
|
||||||
public class LogicDialog extends BaseDialog{
|
public class LogicDialog extends BaseDialog{
|
||||||
public LCanvas canvas;
|
public LCanvas canvas;
|
||||||
@@ -72,7 +73,7 @@ public class LogicDialog extends BaseDialog{
|
|||||||
t.button(example.name(), style, () -> {
|
t.button(example.name(), style, () -> {
|
||||||
canvas.add(prov.get());
|
canvas.add(prov.get());
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
}).size(140f, 50f);
|
}).size(140f, 50f).self(c -> tooltip(c, "lst." + example.name()));
|
||||||
if(++i % 2 == 0) t.row();
|
if(++i % 2 == 0) t.row();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ public enum LogicOp{
|
|||||||
lessThanEq("<=", (a, b) -> a <= b ? 1 : 0),
|
lessThanEq("<=", (a, b) -> a <= b ? 1 : 0),
|
||||||
greaterThan(">", (a, b) -> a > b ? 1 : 0),
|
greaterThan(">", (a, b) -> a > b ? 1 : 0),
|
||||||
greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0),
|
greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0),
|
||||||
|
strictEqual("===", (a, b) -> 0), //this lambda is not actually used
|
||||||
|
|
||||||
shl("<<", (a, b) -> (long)a << (long)b),
|
shl("<<", (a, b) -> (long)a << (long)b),
|
||||||
shr(">>", (a, b) -> (long)a >> (long)b),
|
shr(">>", (a, b) -> (long)a >> (long)b),
|
||||||
@@ -27,11 +28,11 @@ public enum LogicOp{
|
|||||||
xor("xor", (a, b) -> (long)a ^ (long)b),
|
xor("xor", (a, b) -> (long)a ^ (long)b),
|
||||||
not("flip", a -> ~(long)(a)),
|
not("flip", a -> ~(long)(a)),
|
||||||
|
|
||||||
max("max", Math::max),
|
max("max", true, Math::max),
|
||||||
min("min", Math::min),
|
min("min", true, Math::min),
|
||||||
atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg),
|
angle("angle", true, (x, y) -> Angles.angle((float)x, (float)y)),
|
||||||
dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)),
|
len("len", true, (x, y) -> Mathf.dst((float)x, (float)y)),
|
||||||
noise("noise", LExecutor.noise::rawNoise2D),
|
noise("noise", true, LExecutor.noise::rawNoise2D),
|
||||||
abs("abs", a -> Math.abs(a)),
|
abs("abs", a -> Math.abs(a)),
|
||||||
log("log", Math::log),
|
log("log", Math::log),
|
||||||
log10("log10", Math::log10),
|
log10("log10", Math::log10),
|
||||||
@@ -48,19 +49,29 @@ public enum LogicOp{
|
|||||||
public final OpObjLambda2 objFunction2;
|
public final OpObjLambda2 objFunction2;
|
||||||
public final OpLambda2 function2;
|
public final OpLambda2 function2;
|
||||||
public final OpLambda1 function1;
|
public final OpLambda1 function1;
|
||||||
public final boolean unary;
|
public final boolean unary, func;
|
||||||
public final String symbol;
|
public final String symbol;
|
||||||
|
|
||||||
LogicOp(String symbol, OpLambda2 function){
|
LogicOp(String symbol, OpLambda2 function){
|
||||||
this(symbol, function, null);
|
this(symbol, function, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LogicOp(String symbol, boolean func, OpLambda2 function){
|
||||||
|
this.symbol = symbol;
|
||||||
|
this.function2 = function;
|
||||||
|
this.function1 = null;
|
||||||
|
this.unary = false;
|
||||||
|
this.objFunction2 = null;
|
||||||
|
this.func = func;
|
||||||
|
}
|
||||||
|
|
||||||
LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){
|
LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){
|
||||||
this.symbol = symbol;
|
this.symbol = symbol;
|
||||||
this.function2 = function;
|
this.function2 = function;
|
||||||
this.function1 = null;
|
this.function1 = null;
|
||||||
this.unary = false;
|
this.unary = false;
|
||||||
this.objFunction2 = objFunction;
|
this.objFunction2 = objFunction;
|
||||||
|
this.func = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogicOp(String symbol, OpLambda1 function){
|
LogicOp(String symbol, OpLambda1 function){
|
||||||
@@ -69,6 +80,7 @@ public enum LogicOp{
|
|||||||
this.function2 = null;
|
this.function2 = null;
|
||||||
this.unary = true;
|
this.unary = true;
|
||||||
this.objFunction2 = null;
|
this.objFunction2 = null;
|
||||||
|
this.func = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
259
core/src/mindustry/mod/ClassMap.java
Normal file
259
core/src/mindustry/mod/ClassMap.java
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
package mindustry.mod;
|
||||||
|
|
||||||
|
import arc.struct.*;
|
||||||
|
/** Generated class. Maps simple class names to concrete classes. For use in JSON mods. */
|
||||||
|
public class ClassMap{
|
||||||
|
public static final ObjectMap<String, Class<?>> classes = new ObjectMap<>();
|
||||||
|
|
||||||
|
static{
|
||||||
|
classes.put("BuilderAI", mindustry.ai.types.BuilderAI.class);
|
||||||
|
classes.put("FlyingAI", mindustry.ai.types.FlyingAI.class);
|
||||||
|
classes.put("FormationAI", mindustry.ai.types.FormationAI.class);
|
||||||
|
classes.put("GroundAI", mindustry.ai.types.GroundAI.class);
|
||||||
|
classes.put("LogicAI", mindustry.ai.types.LogicAI.class);
|
||||||
|
classes.put("MinerAI", mindustry.ai.types.MinerAI.class);
|
||||||
|
classes.put("RepairAI", mindustry.ai.types.RepairAI.class);
|
||||||
|
classes.put("SuicideAI", mindustry.ai.types.SuicideAI.class);
|
||||||
|
classes.put("ArtilleryBulletType", mindustry.entities.bullet.ArtilleryBulletType.class);
|
||||||
|
classes.put("BasicBulletType", mindustry.entities.bullet.BasicBulletType.class);
|
||||||
|
classes.put("BombBulletType", mindustry.entities.bullet.BombBulletType.class);
|
||||||
|
classes.put("BulletType", mindustry.entities.bullet.BulletType.class);
|
||||||
|
classes.put("ContinuousLaserBulletType", mindustry.entities.bullet.ContinuousLaserBulletType.class);
|
||||||
|
classes.put("FlakBulletType", mindustry.entities.bullet.FlakBulletType.class);
|
||||||
|
classes.put("LaserBoltBulletType", mindustry.entities.bullet.LaserBoltBulletType.class);
|
||||||
|
classes.put("LaserBulletType", mindustry.entities.bullet.LaserBulletType.class);
|
||||||
|
classes.put("LightningBulletType", mindustry.entities.bullet.LightningBulletType.class);
|
||||||
|
classes.put("LiquidBulletType", mindustry.entities.bullet.LiquidBulletType.class);
|
||||||
|
classes.put("MassDriverBolt", mindustry.entities.bullet.MassDriverBolt.class);
|
||||||
|
classes.put("MissileBulletType", mindustry.entities.bullet.MissileBulletType.class);
|
||||||
|
classes.put("PointBulletType", mindustry.entities.bullet.PointBulletType.class);
|
||||||
|
classes.put("RailBulletType", mindustry.entities.bullet.RailBulletType.class);
|
||||||
|
classes.put("SapBulletType", mindustry.entities.bullet.SapBulletType.class);
|
||||||
|
classes.put("ShrapnelBulletType", mindustry.entities.bullet.ShrapnelBulletType.class);
|
||||||
|
classes.put("MultiEffect", mindustry.entities.effect.MultiEffect.class);
|
||||||
|
classes.put("ParticleEffect", mindustry.entities.effect.ParticleEffect.class);
|
||||||
|
classes.put("WaveEffect", mindustry.entities.effect.WaveEffect.class);
|
||||||
|
classes.put("Objectives", mindustry.game.Objectives.class);
|
||||||
|
classes.put("Objective", mindustry.game.Objectives.Objective.class);
|
||||||
|
classes.put("Produce", mindustry.game.Objectives.Produce.class);
|
||||||
|
classes.put("Research", mindustry.game.Objectives.Research.class);
|
||||||
|
classes.put("SectorComplete", mindustry.game.Objectives.SectorComplete.class);
|
||||||
|
classes.put("ParticleWeather", mindustry.type.weather.ParticleWeather.class);
|
||||||
|
classes.put("RainWeather", mindustry.type.weather.RainWeather.class);
|
||||||
|
classes.put("Attributes", mindustry.world.blocks.Attributes.class);
|
||||||
|
classes.put("Autotiler", mindustry.world.blocks.Autotiler.class);
|
||||||
|
classes.put("AutotilerHolder", mindustry.world.blocks.Autotiler.AutotilerHolder.class);
|
||||||
|
classes.put("SliceMode", mindustry.world.blocks.Autotiler.SliceMode.class);
|
||||||
|
classes.put("ConstructBlock", mindustry.world.blocks.ConstructBlock.class);
|
||||||
|
classes.put("ConstructBuild", mindustry.world.blocks.ConstructBlock.ConstructBuild.class);
|
||||||
|
classes.put("ControlBlock", mindustry.world.blocks.ControlBlock.class);
|
||||||
|
classes.put("ItemSelection", mindustry.world.blocks.ItemSelection.class);
|
||||||
|
classes.put("Accelerator", mindustry.world.blocks.campaign.Accelerator.class);
|
||||||
|
classes.put("AcceleratorBuild", mindustry.world.blocks.campaign.Accelerator.AcceleratorBuild.class);
|
||||||
|
classes.put("LaunchPad", mindustry.world.blocks.campaign.LaunchPad.class);
|
||||||
|
classes.put("LaunchPadBuild", mindustry.world.blocks.campaign.LaunchPad.LaunchPadBuild.class);
|
||||||
|
classes.put("Door", mindustry.world.blocks.defense.Door.class);
|
||||||
|
classes.put("DoorBuild", mindustry.world.blocks.defense.Door.DoorBuild.class);
|
||||||
|
classes.put("ForceProjector", mindustry.world.blocks.defense.ForceProjector.class);
|
||||||
|
classes.put("ForceBuild", mindustry.world.blocks.defense.ForceProjector.ForceBuild.class);
|
||||||
|
classes.put("MendProjector", mindustry.world.blocks.defense.MendProjector.class);
|
||||||
|
classes.put("MendBuild", mindustry.world.blocks.defense.MendProjector.MendBuild.class);
|
||||||
|
classes.put("OverdriveProjector", mindustry.world.blocks.defense.OverdriveProjector.class);
|
||||||
|
classes.put("OverdriveBuild", mindustry.world.blocks.defense.OverdriveProjector.OverdriveBuild.class);
|
||||||
|
classes.put("ShockMine", mindustry.world.blocks.defense.ShockMine.class);
|
||||||
|
classes.put("ShockMineBuild", mindustry.world.blocks.defense.ShockMine.ShockMineBuild.class);
|
||||||
|
classes.put("Thruster", mindustry.world.blocks.defense.Thruster.class);
|
||||||
|
classes.put("ThrusterBuild", mindustry.world.blocks.defense.Thruster.ThrusterBuild.class);
|
||||||
|
classes.put("Wall", mindustry.world.blocks.defense.Wall.class);
|
||||||
|
classes.put("WallBuild", mindustry.world.blocks.defense.Wall.WallBuild.class);
|
||||||
|
classes.put("BaseTurret", mindustry.world.blocks.defense.turrets.BaseTurret.class);
|
||||||
|
classes.put("BaseTurretBuild", mindustry.world.blocks.defense.turrets.BaseTurret.BaseTurretBuild.class);
|
||||||
|
classes.put("ItemTurret", mindustry.world.blocks.defense.turrets.ItemTurret.class);
|
||||||
|
classes.put("ItemTurretBuild", mindustry.world.blocks.defense.turrets.ItemTurret.ItemTurretBuild.class);
|
||||||
|
classes.put("LaserTurret", mindustry.world.blocks.defense.turrets.LaserTurret.class);
|
||||||
|
classes.put("LaserTurretBuild", mindustry.world.blocks.defense.turrets.LaserTurret.LaserTurretBuild.class);
|
||||||
|
classes.put("LiquidTurret", mindustry.world.blocks.defense.turrets.LiquidTurret.class);
|
||||||
|
classes.put("LiquidTurretBuild", mindustry.world.blocks.defense.turrets.LiquidTurret.LiquidTurretBuild.class);
|
||||||
|
classes.put("PointDefenseTurret", mindustry.world.blocks.defense.turrets.PointDefenseTurret.class);
|
||||||
|
classes.put("PointDefenseBuild", mindustry.world.blocks.defense.turrets.PointDefenseTurret.PointDefenseBuild.class);
|
||||||
|
classes.put("PowerTurret", mindustry.world.blocks.defense.turrets.PowerTurret.class);
|
||||||
|
classes.put("PowerTurretBuild", mindustry.world.blocks.defense.turrets.PowerTurret.PowerTurretBuild.class);
|
||||||
|
classes.put("ReloadTurret", mindustry.world.blocks.defense.turrets.ReloadTurret.class);
|
||||||
|
classes.put("ReloadTurretBuild", mindustry.world.blocks.defense.turrets.ReloadTurret.ReloadTurretBuild.class);
|
||||||
|
classes.put("TractorBeamTurret", mindustry.world.blocks.defense.turrets.TractorBeamTurret.class);
|
||||||
|
classes.put("TractorBeamBuild", mindustry.world.blocks.defense.turrets.TractorBeamTurret.TractorBeamBuild.class);
|
||||||
|
classes.put("Turret", mindustry.world.blocks.defense.turrets.Turret.class);
|
||||||
|
classes.put("AmmoEntry", mindustry.world.blocks.defense.turrets.Turret.AmmoEntry.class);
|
||||||
|
classes.put("TurretBuild", mindustry.world.blocks.defense.turrets.Turret.TurretBuild.class);
|
||||||
|
classes.put("ArmoredConveyor", mindustry.world.blocks.distribution.ArmoredConveyor.class);
|
||||||
|
classes.put("ArmoredConveyorBuild", mindustry.world.blocks.distribution.ArmoredConveyor.ArmoredConveyorBuild.class);
|
||||||
|
classes.put("BufferedItemBridge", mindustry.world.blocks.distribution.BufferedItemBridge.class);
|
||||||
|
classes.put("BufferedItemBridgeBuild", mindustry.world.blocks.distribution.BufferedItemBridge.BufferedItemBridgeBuild.class);
|
||||||
|
classes.put("ChainedBuilding", mindustry.world.blocks.distribution.ChainedBuilding.class);
|
||||||
|
classes.put("Conveyor", mindustry.world.blocks.distribution.Conveyor.class);
|
||||||
|
classes.put("ConveyorBuild", mindustry.world.blocks.distribution.Conveyor.ConveyorBuild.class);
|
||||||
|
classes.put("ExtendingItemBridge", mindustry.world.blocks.distribution.ExtendingItemBridge.class);
|
||||||
|
classes.put("ExtendingItemBridgeBuild", mindustry.world.blocks.distribution.ExtendingItemBridge.ExtendingItemBridgeBuild.class);
|
||||||
|
classes.put("ItemBridge", mindustry.world.blocks.distribution.ItemBridge.class);
|
||||||
|
classes.put("ItemBridgeBuild", mindustry.world.blocks.distribution.ItemBridge.ItemBridgeBuild.class);
|
||||||
|
classes.put("Junction", mindustry.world.blocks.distribution.Junction.class);
|
||||||
|
classes.put("JunctionBuild", mindustry.world.blocks.distribution.Junction.JunctionBuild.class);
|
||||||
|
classes.put("MassDriver", mindustry.world.blocks.distribution.MassDriver.class);
|
||||||
|
classes.put("DriverBulletData", mindustry.world.blocks.distribution.MassDriver.DriverBulletData.class);
|
||||||
|
classes.put("DriverState", mindustry.world.blocks.distribution.MassDriver.DriverState.class);
|
||||||
|
classes.put("MassDriverBuild", mindustry.world.blocks.distribution.MassDriver.MassDriverBuild.class);
|
||||||
|
classes.put("OverflowGate", mindustry.world.blocks.distribution.OverflowGate.class);
|
||||||
|
classes.put("OverflowGateBuild", mindustry.world.blocks.distribution.OverflowGate.OverflowGateBuild.class);
|
||||||
|
classes.put("PayloadConveyor", mindustry.world.blocks.distribution.PayloadConveyor.class);
|
||||||
|
classes.put("PayloadConveyorBuild", mindustry.world.blocks.distribution.PayloadConveyor.PayloadConveyorBuild.class);
|
||||||
|
classes.put("PayloadRouter", mindustry.world.blocks.distribution.PayloadRouter.class);
|
||||||
|
classes.put("PayloadRouterBuild", mindustry.world.blocks.distribution.PayloadRouter.PayloadRouterBuild.class);
|
||||||
|
classes.put("Router", mindustry.world.blocks.distribution.Router.class);
|
||||||
|
classes.put("RouterBuild", mindustry.world.blocks.distribution.Router.RouterBuild.class);
|
||||||
|
classes.put("Sorter", mindustry.world.blocks.distribution.Sorter.class);
|
||||||
|
classes.put("SorterBuild", mindustry.world.blocks.distribution.Sorter.SorterBuild.class);
|
||||||
|
classes.put("StackConveyor", mindustry.world.blocks.distribution.StackConveyor.class);
|
||||||
|
classes.put("StackConveyorBuild", mindustry.world.blocks.distribution.StackConveyor.StackConveyorBuild.class);
|
||||||
|
classes.put("AirBlock", mindustry.world.blocks.environment.AirBlock.class);
|
||||||
|
classes.put("Boulder", mindustry.world.blocks.environment.Boulder.class);
|
||||||
|
classes.put("Cliff", mindustry.world.blocks.environment.Cliff.class);
|
||||||
|
classes.put("DoubleOverlayFloor", mindustry.world.blocks.environment.DoubleOverlayFloor.class);
|
||||||
|
classes.put("Floor", mindustry.world.blocks.environment.Floor.class);
|
||||||
|
classes.put("OreBlock", mindustry.world.blocks.environment.OreBlock.class);
|
||||||
|
classes.put("OverlayFloor", mindustry.world.blocks.environment.OverlayFloor.class);
|
||||||
|
classes.put("ShallowLiquid", mindustry.world.blocks.environment.ShallowLiquid.class);
|
||||||
|
classes.put("SpawnBlock", mindustry.world.blocks.environment.SpawnBlock.class);
|
||||||
|
classes.put("StaticTree", mindustry.world.blocks.environment.StaticTree.class);
|
||||||
|
classes.put("StaticWall", mindustry.world.blocks.environment.StaticWall.class);
|
||||||
|
classes.put("TreeBlock", mindustry.world.blocks.environment.TreeBlock.class);
|
||||||
|
classes.put("BlockForge", mindustry.world.blocks.experimental.BlockForge.class);
|
||||||
|
classes.put("BlockForgeBuild", mindustry.world.blocks.experimental.BlockForge.BlockForgeBuild.class);
|
||||||
|
classes.put("BlockLoader", mindustry.world.blocks.experimental.BlockLoader.class);
|
||||||
|
classes.put("BlockLoaderBuild", mindustry.world.blocks.experimental.BlockLoader.BlockLoaderBuild.class);
|
||||||
|
classes.put("BlockUnloader", mindustry.world.blocks.experimental.BlockUnloader.class);
|
||||||
|
classes.put("BlockUnloaderBuild", mindustry.world.blocks.experimental.BlockUnloader.BlockUnloaderBuild.class);
|
||||||
|
classes.put("LegacyBlock", mindustry.world.blocks.legacy.LegacyBlock.class);
|
||||||
|
classes.put("LegacyMechPad", mindustry.world.blocks.legacy.LegacyMechPad.class);
|
||||||
|
classes.put("LegacyMechPadBuild", mindustry.world.blocks.legacy.LegacyMechPad.LegacyMechPadBuild.class);
|
||||||
|
classes.put("LegacyUnitFactory", mindustry.world.blocks.legacy.LegacyUnitFactory.class);
|
||||||
|
classes.put("LegacyUnitFactoryBuild", mindustry.world.blocks.legacy.LegacyUnitFactory.LegacyUnitFactoryBuild.class);
|
||||||
|
classes.put("ArmoredConduit", mindustry.world.blocks.liquid.ArmoredConduit.class);
|
||||||
|
classes.put("ArmoredConduitBuild", mindustry.world.blocks.liquid.ArmoredConduit.ArmoredConduitBuild.class);
|
||||||
|
classes.put("Conduit", mindustry.world.blocks.liquid.Conduit.class);
|
||||||
|
classes.put("ConduitBuild", mindustry.world.blocks.liquid.Conduit.ConduitBuild.class);
|
||||||
|
classes.put("LiquidBlock", mindustry.world.blocks.liquid.LiquidBlock.class);
|
||||||
|
classes.put("LiquidBuild", mindustry.world.blocks.liquid.LiquidBlock.LiquidBuild.class);
|
||||||
|
classes.put("LiquidBridge", mindustry.world.blocks.liquid.LiquidBridge.class);
|
||||||
|
classes.put("LiquidBridgeBuild", mindustry.world.blocks.liquid.LiquidBridge.LiquidBridgeBuild.class);
|
||||||
|
classes.put("LiquidExtendingBridge", mindustry.world.blocks.liquid.LiquidExtendingBridge.class);
|
||||||
|
classes.put("LiquidExtendingBridgeBuild", mindustry.world.blocks.liquid.LiquidExtendingBridge.LiquidExtendingBridgeBuild.class);
|
||||||
|
classes.put("LiquidJunction", mindustry.world.blocks.liquid.LiquidJunction.class);
|
||||||
|
classes.put("LiquidJunctionBuild", mindustry.world.blocks.liquid.LiquidJunction.LiquidJunctionBuild.class);
|
||||||
|
classes.put("LiquidRouter", mindustry.world.blocks.liquid.LiquidRouter.class);
|
||||||
|
classes.put("LiquidRouterBuild", mindustry.world.blocks.liquid.LiquidRouter.LiquidRouterBuild.class);
|
||||||
|
classes.put("LogicBlock", mindustry.world.blocks.logic.LogicBlock.class);
|
||||||
|
classes.put("LogicBuild", mindustry.world.blocks.logic.LogicBlock.LogicBuild.class);
|
||||||
|
classes.put("LogicLink", mindustry.world.blocks.logic.LogicBlock.LogicLink.class);
|
||||||
|
classes.put("LogicDisplay", mindustry.world.blocks.logic.LogicDisplay.class);
|
||||||
|
classes.put("GraphicsType", mindustry.world.blocks.logic.LogicDisplay.GraphicsType.class);
|
||||||
|
classes.put("LogicDisplayBuild", mindustry.world.blocks.logic.LogicDisplay.LogicDisplayBuild.class);
|
||||||
|
classes.put("MemoryBlock", mindustry.world.blocks.logic.MemoryBlock.class);
|
||||||
|
classes.put("MemoryBuild", mindustry.world.blocks.logic.MemoryBlock.MemoryBuild.class);
|
||||||
|
classes.put("MessageBlock", mindustry.world.blocks.logic.MessageBlock.class);
|
||||||
|
classes.put("MessageBuild", mindustry.world.blocks.logic.MessageBlock.MessageBuild.class);
|
||||||
|
classes.put("SwitchBlock", mindustry.world.blocks.logic.SwitchBlock.class);
|
||||||
|
classes.put("SwitchBuild", mindustry.world.blocks.logic.SwitchBlock.SwitchBuild.class);
|
||||||
|
classes.put("BuildPayload", mindustry.world.blocks.payloads.BuildPayload.class);
|
||||||
|
classes.put("Payload", mindustry.world.blocks.payloads.Payload.class);
|
||||||
|
classes.put("UnitPayload", mindustry.world.blocks.payloads.UnitPayload.class);
|
||||||
|
classes.put("Battery", mindustry.world.blocks.power.Battery.class);
|
||||||
|
classes.put("BatteryBuild", mindustry.world.blocks.power.Battery.BatteryBuild.class);
|
||||||
|
classes.put("BurnerGenerator", mindustry.world.blocks.power.BurnerGenerator.class);
|
||||||
|
classes.put("BurnerGeneratorBuild", mindustry.world.blocks.power.BurnerGenerator.BurnerGeneratorBuild.class);
|
||||||
|
classes.put("ConditionalConsumePower", mindustry.world.blocks.power.ConditionalConsumePower.class);
|
||||||
|
classes.put("DecayGenerator", mindustry.world.blocks.power.DecayGenerator.class);
|
||||||
|
classes.put("ImpactReactor", mindustry.world.blocks.power.ImpactReactor.class);
|
||||||
|
classes.put("ImpactReactorBuild", mindustry.world.blocks.power.ImpactReactor.ImpactReactorBuild.class);
|
||||||
|
classes.put("ItemLiquidGenerator", mindustry.world.blocks.power.ItemLiquidGenerator.class);
|
||||||
|
classes.put("ItemLiquidGeneratorBuild", mindustry.world.blocks.power.ItemLiquidGenerator.ItemLiquidGeneratorBuild.class);
|
||||||
|
classes.put("LightBlock", mindustry.world.blocks.power.LightBlock.class);
|
||||||
|
classes.put("LightBuild", mindustry.world.blocks.power.LightBlock.LightBuild.class);
|
||||||
|
classes.put("NuclearReactor", mindustry.world.blocks.power.NuclearReactor.class);
|
||||||
|
classes.put("NuclearReactorBuild", mindustry.world.blocks.power.NuclearReactor.NuclearReactorBuild.class);
|
||||||
|
classes.put("PowerBlock", mindustry.world.blocks.power.PowerBlock.class);
|
||||||
|
classes.put("PowerDiode", mindustry.world.blocks.power.PowerDiode.class);
|
||||||
|
classes.put("PowerDiodeBuild", mindustry.world.blocks.power.PowerDiode.PowerDiodeBuild.class);
|
||||||
|
classes.put("PowerDistributor", mindustry.world.blocks.power.PowerDistributor.class);
|
||||||
|
classes.put("PowerGenerator", mindustry.world.blocks.power.PowerGenerator.class);
|
||||||
|
classes.put("GeneratorBuild", mindustry.world.blocks.power.PowerGenerator.GeneratorBuild.class);
|
||||||
|
classes.put("PowerGraph", mindustry.world.blocks.power.PowerGraph.class);
|
||||||
|
classes.put("PowerNode", mindustry.world.blocks.power.PowerNode.class);
|
||||||
|
classes.put("PowerNodeBuild", mindustry.world.blocks.power.PowerNode.PowerNodeBuild.class);
|
||||||
|
classes.put("SingleTypeGenerator", mindustry.world.blocks.power.SingleTypeGenerator.class);
|
||||||
|
classes.put("SolarGenerator", mindustry.world.blocks.power.SolarGenerator.class);
|
||||||
|
classes.put("SolarGeneratorBuild", mindustry.world.blocks.power.SolarGenerator.SolarGeneratorBuild.class);
|
||||||
|
classes.put("ThermalGenerator", mindustry.world.blocks.power.ThermalGenerator.class);
|
||||||
|
classes.put("ThermalGeneratorBuild", mindustry.world.blocks.power.ThermalGenerator.ThermalGeneratorBuild.class);
|
||||||
|
classes.put("AttributeSmelter", mindustry.world.blocks.production.AttributeSmelter.class);
|
||||||
|
classes.put("AttributeSmelterBuild", mindustry.world.blocks.production.AttributeSmelter.AttributeSmelterBuild.class);
|
||||||
|
classes.put("Cultivator", mindustry.world.blocks.production.Cultivator.class);
|
||||||
|
classes.put("CultivatorBuild", mindustry.world.blocks.production.Cultivator.CultivatorBuild.class);
|
||||||
|
classes.put("Drill", mindustry.world.blocks.production.Drill.class);
|
||||||
|
classes.put("DrillBuild", mindustry.world.blocks.production.Drill.DrillBuild.class);
|
||||||
|
classes.put("Fracker", mindustry.world.blocks.production.Fracker.class);
|
||||||
|
classes.put("FrackerBuild", mindustry.world.blocks.production.Fracker.FrackerBuild.class);
|
||||||
|
classes.put("GenericCrafter", mindustry.world.blocks.production.GenericCrafter.class);
|
||||||
|
classes.put("GenericCrafterBuild", mindustry.world.blocks.production.GenericCrafter.GenericCrafterBuild.class);
|
||||||
|
classes.put("GenericSmelter", mindustry.world.blocks.production.GenericSmelter.class);
|
||||||
|
classes.put("SmelterBuild", mindustry.world.blocks.production.GenericSmelter.SmelterBuild.class);
|
||||||
|
classes.put("Incinerator", mindustry.world.blocks.production.Incinerator.class);
|
||||||
|
classes.put("IncineratorBuild", mindustry.world.blocks.production.Incinerator.IncineratorBuild.class);
|
||||||
|
classes.put("LiquidConverter", mindustry.world.blocks.production.LiquidConverter.class);
|
||||||
|
classes.put("LiquidConverterBuild", mindustry.world.blocks.production.LiquidConverter.LiquidConverterBuild.class);
|
||||||
|
classes.put("PayloadAcceptor", mindustry.world.blocks.production.PayloadAcceptor.class);
|
||||||
|
classes.put("PayloadAcceptorBuild", mindustry.world.blocks.production.PayloadAcceptor.PayloadAcceptorBuild.class);
|
||||||
|
classes.put("Pump", mindustry.world.blocks.production.Pump.class);
|
||||||
|
classes.put("PumpBuild", mindustry.world.blocks.production.Pump.PumpBuild.class);
|
||||||
|
classes.put("Separator", mindustry.world.blocks.production.Separator.class);
|
||||||
|
classes.put("SeparatorBuild", mindustry.world.blocks.production.Separator.SeparatorBuild.class);
|
||||||
|
classes.put("SolidPump", mindustry.world.blocks.production.SolidPump.class);
|
||||||
|
classes.put("SolidPumpBuild", mindustry.world.blocks.production.SolidPump.SolidPumpBuild.class);
|
||||||
|
classes.put("ItemSource", mindustry.world.blocks.sandbox.ItemSource.class);
|
||||||
|
classes.put("ItemSourceBuild", mindustry.world.blocks.sandbox.ItemSource.ItemSourceBuild.class);
|
||||||
|
classes.put("ItemVoid", mindustry.world.blocks.sandbox.ItemVoid.class);
|
||||||
|
classes.put("ItemVoidBuild", mindustry.world.blocks.sandbox.ItemVoid.ItemVoidBuild.class);
|
||||||
|
classes.put("LiquidSource", mindustry.world.blocks.sandbox.LiquidSource.class);
|
||||||
|
classes.put("LiquidSourceBuild", mindustry.world.blocks.sandbox.LiquidSource.LiquidSourceBuild.class);
|
||||||
|
classes.put("LiquidVoid", mindustry.world.blocks.sandbox.LiquidVoid.class);
|
||||||
|
classes.put("LiquidVoidBuild", mindustry.world.blocks.sandbox.LiquidVoid.LiquidVoidBuild.class);
|
||||||
|
classes.put("PowerSource", mindustry.world.blocks.sandbox.PowerSource.class);
|
||||||
|
classes.put("PowerSourceBuild", mindustry.world.blocks.sandbox.PowerSource.PowerSourceBuild.class);
|
||||||
|
classes.put("PowerVoid", mindustry.world.blocks.sandbox.PowerVoid.class);
|
||||||
|
classes.put("CoreBlock", mindustry.world.blocks.storage.CoreBlock.class);
|
||||||
|
classes.put("CoreBuild", mindustry.world.blocks.storage.CoreBlock.CoreBuild.class);
|
||||||
|
classes.put("StorageBlock", mindustry.world.blocks.storage.StorageBlock.class);
|
||||||
|
classes.put("StorageBuild", mindustry.world.blocks.storage.StorageBlock.StorageBuild.class);
|
||||||
|
classes.put("Unloader", mindustry.world.blocks.storage.Unloader.class);
|
||||||
|
classes.put("UnloaderBuild", mindustry.world.blocks.storage.Unloader.UnloaderBuild.class);
|
||||||
|
classes.put("CommandCenter", mindustry.world.blocks.units.CommandCenter.class);
|
||||||
|
classes.put("CommandBuild", mindustry.world.blocks.units.CommandCenter.CommandBuild.class);
|
||||||
|
classes.put("Reconstructor", mindustry.world.blocks.units.Reconstructor.class);
|
||||||
|
classes.put("ReconstructorBuild", mindustry.world.blocks.units.Reconstructor.ReconstructorBuild.class);
|
||||||
|
classes.put("RepairPoint", mindustry.world.blocks.units.RepairPoint.class);
|
||||||
|
classes.put("RepairPointBuild", mindustry.world.blocks.units.RepairPoint.RepairPointBuild.class);
|
||||||
|
classes.put("ResupplyPoint", mindustry.world.blocks.units.ResupplyPoint.class);
|
||||||
|
classes.put("ResupplyPointBuild", mindustry.world.blocks.units.ResupplyPoint.ResupplyPointBuild.class);
|
||||||
|
classes.put("UnitBlock", mindustry.world.blocks.units.UnitBlock.class);
|
||||||
|
classes.put("UnitBuild", mindustry.world.blocks.units.UnitBlock.UnitBuild.class);
|
||||||
|
classes.put("UnitFactory", mindustry.world.blocks.units.UnitFactory.class);
|
||||||
|
classes.put("UnitFactoryBuild", mindustry.world.blocks.units.UnitFactory.UnitFactoryBuild.class);
|
||||||
|
classes.put("UnitPlan", mindustry.world.blocks.units.UnitFactory.UnitPlan.class);
|
||||||
|
classes.put("DrawAnimation", mindustry.world.draw.DrawAnimation.class);
|
||||||
|
classes.put("DrawBlock", mindustry.world.draw.DrawBlock.class);
|
||||||
|
classes.put("DrawGlow", mindustry.world.draw.DrawGlow.class);
|
||||||
|
classes.put("DrawMixer", mindustry.world.draw.DrawMixer.class);
|
||||||
|
classes.put("DrawRotator", mindustry.world.draw.DrawRotator.class);
|
||||||
|
classes.put("DrawWeave", mindustry.world.draw.DrawWeave.class);
|
||||||
|
classes.put("Block", mindustry.world.Block.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,10 +15,12 @@ import arc.util.serialization.*;
|
|||||||
import arc.util.serialization.Json.*;
|
import arc.util.serialization.Json.*;
|
||||||
import arc.util.serialization.Jval.*;
|
import arc.util.serialization.Jval.*;
|
||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
|
import mindustry.ai.types.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
import mindustry.content.TechTree.*;
|
import mindustry.content.TechTree.*;
|
||||||
import mindustry.ctype.*;
|
import mindustry.ctype.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
|
import mindustry.entities.abilities.*;
|
||||||
import mindustry.entities.bullet.*;
|
import mindustry.entities.bullet.*;
|
||||||
import mindustry.entities.effect.*;
|
import mindustry.entities.effect.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
@@ -26,6 +28,7 @@ import mindustry.game.Objectives.*;
|
|||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.mod.Mods.*;
|
import mindustry.mod.Mods.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
|
import mindustry.type.weather.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.units.*;
|
import mindustry.world.blocks.units.*;
|
||||||
import mindustry.world.blocks.units.UnitFactory.*;
|
import mindustry.world.blocks.units.UnitFactory.*;
|
||||||
@@ -42,14 +45,14 @@ public class ContentParser{
|
|||||||
private static final boolean ignoreUnknownFields = true;
|
private static final boolean ignoreUnknownFields = true;
|
||||||
ObjectMap<Class<?>, ContentType> contentTypes = new ObjectMap<>();
|
ObjectMap<Class<?>, ContentType> contentTypes = new ObjectMap<>();
|
||||||
ObjectSet<Class<?>> implicitNullable = ObjectSet.with(TextureRegion.class, TextureRegion[].class, TextureRegion[][].class);
|
ObjectSet<Class<?>> implicitNullable = ObjectSet.with(TextureRegion.class, TextureRegion[].class, TextureRegion[][].class);
|
||||||
ObjectMap<String, AssetDescriptor> sounds = new ObjectMap<>();
|
ObjectMap<String, AssetDescriptor<?>> sounds = new ObjectMap<>();
|
||||||
|
|
||||||
ObjectMap<Class<?>, FieldParser> classParsers = new ObjectMap<>(){{
|
ObjectMap<Class<?>, FieldParser> classParsers = new ObjectMap<>(){{
|
||||||
put(Effect.class, (type, data) -> {
|
put(Effect.class, (type, data) -> {
|
||||||
if(data.isString()){
|
if(data.isString()){
|
||||||
return field(Fx.class, data);
|
return field(Fx.class, data);
|
||||||
}
|
}
|
||||||
Class<? extends Effect> bc = data.has("type") ? resolve(data.getString("type"), "mindustry.entities.effect") : ParticleEffect.class;
|
Class<? extends Effect> bc = resolve(data.getString("type", ""), ParticleEffect.class);
|
||||||
data.remove("type");
|
data.remove("type");
|
||||||
Effect result = make(bc);
|
Effect result = make(bc);
|
||||||
readFields(result, data);
|
readFields(result, data);
|
||||||
@@ -83,12 +86,23 @@ public class ContentParser{
|
|||||||
if(data.isString()){
|
if(data.isString()){
|
||||||
return field(Bullets.class, data);
|
return field(Bullets.class, data);
|
||||||
}
|
}
|
||||||
Class<? extends BulletType> bc = data.has("type") ? resolve(data.getString("type"), "mindustry.entities.bullet") : BasicBulletType.class;
|
var bc = resolve(data.getString("type", ""), BasicBulletType.class);
|
||||||
data.remove("type");
|
data.remove("type");
|
||||||
BulletType result = make(bc);
|
BulletType result = make(bc);
|
||||||
readFields(result, data);
|
readFields(result, data);
|
||||||
return result;
|
return result;
|
||||||
});
|
});
|
||||||
|
put(DrawBlock.class, (type, data) -> {
|
||||||
|
if(data.isString()){
|
||||||
|
//try to instantiate
|
||||||
|
return make(resolve(data.asString()));
|
||||||
|
}
|
||||||
|
var bc = resolve(data.getString("type", ""), DrawBlock.class);
|
||||||
|
data.remove("type");
|
||||||
|
var result = make(bc);
|
||||||
|
readFields(result, data);
|
||||||
|
return result;
|
||||||
|
});
|
||||||
put(Sound.class, (type, data) -> {
|
put(Sound.class, (type, data) -> {
|
||||||
if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data);
|
if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data);
|
||||||
if(Vars.headless) return new Sound();
|
if(Vars.headless) return new Sound();
|
||||||
@@ -104,12 +118,19 @@ public class ContentParser{
|
|||||||
return sound;
|
return sound;
|
||||||
});
|
});
|
||||||
put(Objectives.Objective.class, (type, data) -> {
|
put(Objectives.Objective.class, (type, data) -> {
|
||||||
Class<? extends Objectives.Objective> oc = data.has("type") ? resolve(data.getString("type"), "mindustry.game.Objectives") : SectorComplete.class;
|
var oc = resolve(data.getString("type", ""), SectorComplete.class);
|
||||||
data.remove("type");
|
data.remove("type");
|
||||||
Objectives.Objective obj = make(oc);
|
Objectives.Objective obj = make(oc);
|
||||||
readFields(obj, data);
|
readFields(obj, data);
|
||||||
return obj;
|
return obj;
|
||||||
});
|
});
|
||||||
|
put(Ability.class, (type, data) -> {
|
||||||
|
Class<? extends Ability> oc = resolve(data.getString("type", ""));
|
||||||
|
data.remove("type");
|
||||||
|
Ability obj = make(oc);
|
||||||
|
readFields(obj, data);
|
||||||
|
return obj;
|
||||||
|
});
|
||||||
put(Weapon.class, (type, data) -> {
|
put(Weapon.class, (type, data) -> {
|
||||||
Weapon weapon = new Weapon();
|
Weapon weapon = new Weapon();
|
||||||
readFields(weapon, data);
|
readFields(weapon, data);
|
||||||
@@ -118,12 +139,13 @@ public class ContentParser{
|
|||||||
});
|
});
|
||||||
}};
|
}};
|
||||||
/** Stores things that need to be parsed fully, e.g. reading fields of content.
|
/** Stores things that need to be parsed fully, e.g. reading fields of content.
|
||||||
* This is done to accomodate binding of content names first.*/
|
* This is done to accommodate binding of content names first.*/
|
||||||
private Seq<Runnable> reads = new Seq<>();
|
private Seq<Runnable> reads = new Seq<>();
|
||||||
private Seq<Runnable> postreads = new Seq<>();
|
private Seq<Runnable> postreads = new Seq<>();
|
||||||
private ObjectSet<Object> toBeParsed = new ObjectSet<>();
|
private ObjectSet<Object> toBeParsed = new ObjectSet<>();
|
||||||
|
|
||||||
LoadedMod currentMod;
|
LoadedMod currentMod;
|
||||||
private Content currentContent;
|
Content currentContent;
|
||||||
|
|
||||||
private Json parser = new Json(){
|
private Json parser = new Json(){
|
||||||
@Override
|
@Override
|
||||||
@@ -160,11 +182,6 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//try to load DrawBlock by instantiating it
|
|
||||||
if(type == DrawBlock.class && jsonData.isString()){
|
|
||||||
return Reflect.make("mindustry.world.draw." + Strings.capitalize(jsonData.asString()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if(Content.class.isAssignableFrom(type)){
|
if(Content.class.isAssignableFrom(type)){
|
||||||
ContentType ctype = contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName()));
|
ContentType ctype = contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName()));
|
||||||
String prefix = currentMod != null ? currentMod.name + "-" : "";
|
String prefix = currentMod != null ? currentMod.name + "-" : "";
|
||||||
@@ -194,30 +211,7 @@ public class ContentParser{
|
|||||||
throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name);
|
throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//TODO generate dynamically instead of doing.. this
|
block = make(resolve(getType(value), Block.class), mod + "-" + name);
|
||||||
Class<? extends Block> type;
|
|
||||||
|
|
||||||
try{
|
|
||||||
type = resolve(getType(value),
|
|
||||||
"mindustry.world",
|
|
||||||
"mindustry.world.blocks",
|
|
||||||
"mindustry.world.blocks.defense",
|
|
||||||
"mindustry.world.blocks.defense.turrets",
|
|
||||||
"mindustry.world.blocks.distribution",
|
|
||||||
"mindustry.world.blocks.environment",
|
|
||||||
"mindustry.world.blocks.liquid",
|
|
||||||
"mindustry.world.blocks.logic",
|
|
||||||
"mindustry.world.blocks.power",
|
|
||||||
"mindustry.world.blocks.production",
|
|
||||||
"mindustry.world.blocks.sandbox",
|
|
||||||
"mindustry.world.blocks.storage",
|
|
||||||
"mindustry.world.blocks.units"
|
|
||||||
);
|
|
||||||
}catch(IllegalArgumentException e){
|
|
||||||
type = Block.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
block = make(type, mod + "-" + name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
currentContent = block;
|
currentContent = block;
|
||||||
@@ -225,22 +219,19 @@ public class ContentParser{
|
|||||||
read(() -> {
|
read(() -> {
|
||||||
if(value.has("consumes") && value.get("consumes").isObject()){
|
if(value.has("consumes") && value.get("consumes").isObject()){
|
||||||
for(JsonValue child : value.get("consumes")){
|
for(JsonValue child : value.get("consumes")){
|
||||||
if(child.name.equals("item")){
|
switch(child.name){
|
||||||
block.consumes.item(find(ContentType.item, child.asString()));
|
case "item" -> block.consumes.item(find(ContentType.item, child.asString()));
|
||||||
}else if(child.name.equals("items")){
|
case "items" -> block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child));
|
||||||
block.consumes.add((Consume)parser.readValue(ConsumeItems.class, child));
|
case "liquid" -> block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
|
||||||
}else if(child.name.equals("liquid")){
|
case "power" -> {
|
||||||
block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child));
|
|
||||||
}else if(child.name.equals("power")){
|
|
||||||
if(child.isNumber()){
|
if(child.isNumber()){
|
||||||
block.consumes.power(child.asFloat());
|
block.consumes.power(child.asFloat());
|
||||||
}else{
|
}else{
|
||||||
block.consumes.add((Consume)parser.readValue(ConsumePower.class, child));
|
block.consumes.add((Consume)parser.readValue(ConsumePower.class, child));
|
||||||
}
|
}
|
||||||
}else if(child.name.equals("powerBuffered")){
|
}
|
||||||
block.consumes.powerBuffered(child.asFloat());
|
case "powerBuffered" -> block.consumes.powerBuffered(child.asFloat());
|
||||||
}else{
|
default -> throw new IllegalArgumentException("Unknown consumption type: '" + child.name + "' for block '" + block.name + "'.");
|
||||||
throw new IllegalArgumentException("Unknown consumption type: '" + child.name + "' for block '" + block.name + "'.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
value.remove("consumes");
|
value.remove("consumes");
|
||||||
@@ -284,15 +275,6 @@ public class ContentParser{
|
|||||||
if(value.has("requirements")){
|
if(value.has("requirements")){
|
||||||
JsonValue rec = value.remove("requirements");
|
JsonValue rec = value.remove("requirements");
|
||||||
|
|
||||||
//intermediate class for parsing
|
|
||||||
class UnitReq{
|
|
||||||
public Block block;
|
|
||||||
public ItemStack[] requirements = {};
|
|
||||||
@Nullable
|
|
||||||
public UnitType previous;
|
|
||||||
public float time = 60f * 10f;
|
|
||||||
}
|
|
||||||
|
|
||||||
UnitReq req = parser.readValue(UnitReq.class, rec);
|
UnitReq req = parser.readValue(UnitReq.class, rec);
|
||||||
|
|
||||||
if(req.block instanceof Reconstructor r){
|
if(req.block instanceof Reconstructor r){
|
||||||
@@ -308,7 +290,7 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(value.has("controller")){
|
if(value.has("controller")){
|
||||||
unit.defaultController = make(resolve(value.getString("controller"), "mindustry.ai.types"));
|
unit.defaultController = supply(resolve(value.getString("controller"), FlyingAI.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
//read extra default waves
|
//read extra default waves
|
||||||
@@ -334,8 +316,7 @@ public class ContentParser{
|
|||||||
readBundle(ContentType.weather, name, value);
|
readBundle(ContentType.weather, name, value);
|
||||||
}else{
|
}else{
|
||||||
readBundle(ContentType.weather, name, value);
|
readBundle(ContentType.weather, name, value);
|
||||||
Class<? extends Weather> type = resolve(getType(value), "mindustry.type.weather");
|
item = make(resolve(getType(value), ParticleWeather.class));
|
||||||
item = make(type);
|
|
||||||
}
|
}
|
||||||
currentContent = item;
|
currentContent = item;
|
||||||
read(() -> readFields(item, value));
|
read(() -> readFields(item, value));
|
||||||
@@ -425,6 +406,12 @@ public class ContentParser{
|
|||||||
this.currentMod = mod;
|
this.currentMod = mod;
|
||||||
this.currentContent = cont;
|
this.currentContent = cont;
|
||||||
run.run();
|
run.run();
|
||||||
|
|
||||||
|
//check nulls after parsing
|
||||||
|
if(cont != null){
|
||||||
|
toBeParsed.remove(cont);
|
||||||
|
checkNullFields(cont);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -624,8 +611,8 @@ public class ContentParser{
|
|||||||
JsonValue research = jsonMap.remove("research");
|
JsonValue research = jsonMap.remove("research");
|
||||||
|
|
||||||
toBeParsed.remove(object);
|
toBeParsed.remove(object);
|
||||||
Class type = object.getClass();
|
var type = object.getClass();
|
||||||
ObjectMap<String, FieldMetadata> fields = parser.getFields(type);
|
var fields = parser.getFields(type);
|
||||||
for(JsonValue child = jsonMap.child; child != null; child = child.next){
|
for(JsonValue child = jsonMap.child; child != null; child = child.next){
|
||||||
FieldMetadata metadata = fields.get(child.name().replace(" ", "_"));
|
FieldMetadata metadata = fields.get(child.name().replace(" ", "_"));
|
||||||
if(metadata == null){
|
if(metadata == null){
|
||||||
@@ -654,7 +641,6 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(object instanceof UnlockableContent unlock && research != null){
|
if(object instanceof UnlockableContent unlock && research != null){
|
||||||
|
|
||||||
//add research tech node
|
//add research tech node
|
||||||
@@ -706,21 +692,41 @@ public class ContentParser{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Tries to resolve a class from a list of potential class names. */
|
/** Tries to resolve a class from the class type map. */
|
||||||
<T> Class<T> resolve(String base, String... potentials){
|
<T> Class<T> resolve(String base){
|
||||||
if(!base.isEmpty() && Character.isLowerCase(base.charAt(0))) base = Strings.capitalize(base);
|
return resolve(base, null);
|
||||||
|
}
|
||||||
|
|
||||||
for(String type : potentials){
|
/** Tries to resolve a class from the class type map. */
|
||||||
|
<T> Class<T> resolve(String base, Class<T> def){
|
||||||
|
//no base class specified
|
||||||
|
if(base.isEmpty() && def != null) return def;
|
||||||
|
|
||||||
|
//return mapped class if found in the global map
|
||||||
|
var out = ClassMap.classes.get(!base.isEmpty() && Character.isLowerCase(base.charAt(0)) ? Strings.capitalize(base) : base);
|
||||||
|
if(out != null) return (Class<T>)out;
|
||||||
|
|
||||||
|
//try to resolve it as a raw class name if it's allowed
|
||||||
|
if(base.indexOf('.') != -1 && Scripts.allowClass(base)){
|
||||||
try{
|
try{
|
||||||
return (Class<T>)Class.forName(type + '.' + base);
|
return (Class<T>)Class.forName(base);
|
||||||
}catch(Exception ignored){
|
}catch(Exception ignored){
|
||||||
|
//try to load from a mod's class loader
|
||||||
|
for(LoadedMod mod : mods.mods){
|
||||||
|
if(mod.loader != null){
|
||||||
try{
|
try{
|
||||||
return (Class<T>)Class.forName(type + '$' + base);
|
return (Class<T>)Class.forName(base, true, mod.loader);
|
||||||
}catch(Exception ignored2){
|
}catch(Exception ignore){}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Types not found: " + base + "." + potentials[0]);
|
}
|
||||||
|
|
||||||
|
if(def != null){
|
||||||
|
Log.warn("[@] No type '" + base + "' found, defaulting to type '" + def.getSimpleName() + "'", currentContent == null ? currentMod.name : "");
|
||||||
|
return def;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Type not found: " + base);
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface FieldParser{
|
private interface FieldParser{
|
||||||
@@ -731,4 +737,13 @@ public class ContentParser{
|
|||||||
T parse(String mod, String name, JsonValue value) throws Exception;
|
T parse(String mod, String name, JsonValue value) throws Exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//intermediate class for parsing
|
||||||
|
static class UnitReq{
|
||||||
|
public Block block;
|
||||||
|
public ItemStack[] requirements = {};
|
||||||
|
@Nullable
|
||||||
|
public UnitType previous;
|
||||||
|
public float time = 60f * 10f;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,8 @@ public class Mods implements Loadable{
|
|||||||
var loaded = loadMod(dest, true);
|
var loaded = loadMod(dest, true);
|
||||||
mods.add(loaded);
|
mods.add(loaded);
|
||||||
requiresReload = true;
|
requiresReload = true;
|
||||||
|
//enable the mod on import
|
||||||
|
Core.settings.put("mod-" + loaded.name + "-enabled", true);
|
||||||
sortMods();
|
sortMods();
|
||||||
//try to load the mod's icon so it displays on import
|
//try to load the mod's icon so it displays on import
|
||||||
Core.app.post(() -> {
|
Core.app.post(() -> {
|
||||||
@@ -257,6 +259,11 @@ public class Mods implements Loadable{
|
|||||||
return requiresReload;
|
return requiresReload;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return whether to skip mod loading due to previous initialization failure. */
|
||||||
|
public boolean skipModLoading(){
|
||||||
|
return failedToLaunch && Core.settings.getBool("modcrashdisable", true);
|
||||||
|
}
|
||||||
|
|
||||||
/** Loads all mods from the folder, but does not call any methods on them.*/
|
/** Loads all mods from the folder, but does not call any methods on them.*/
|
||||||
public void load(){
|
public void load(){
|
||||||
for(Fi file : modDirectory.list()){
|
for(Fi file : modDirectory.list()){
|
||||||
@@ -664,9 +671,10 @@ public class Mods implements Loadable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClassLoader loader = null;
|
||||||
Mod mainMod;
|
Mod mainMod;
|
||||||
|
|
||||||
Fi mainFile = zip;
|
Fi mainFile = zip;
|
||||||
|
|
||||||
if(android){
|
if(android){
|
||||||
mainFile = mainFile.child("classes.dex");
|
mainFile = mainFile.child("classes.dex");
|
||||||
}else{
|
}else{
|
||||||
@@ -680,14 +688,20 @@ public class Mods implements Loadable{
|
|||||||
|
|
||||||
//make sure the main class exists before loading it; if it doesn't just don't put it there
|
//make sure the main class exists before loading it; if it doesn't just don't put it there
|
||||||
//if the mod is explicitly marked as java, try loading it anyway
|
//if the mod is explicitly marked as java, try loading it anyway
|
||||||
if((mainFile.exists() || meta.java) &&
|
if(
|
||||||
Core.settings.getBool("mod-" + baseName + "-enabled", true) && Version.isAtLeast(meta.minGameVersion) && (meta.getMinMajor() >= 105 || headless)){
|
(mainFile.exists() || meta.java) &&
|
||||||
|
!skipModLoading() &&
|
||||||
|
Core.settings.getBool("mod-" + baseName + "-enabled", true) &&
|
||||||
|
Version.isAtLeast(meta.minGameVersion) &&
|
||||||
|
(meta.getMinMajor() >= 105 || headless)
|
||||||
|
){
|
||||||
|
|
||||||
if(ios){
|
if(ios){
|
||||||
throw new IllegalArgumentException("Java class mods are not supported on iOS.");
|
throw new IllegalArgumentException("Java class mods are not supported on iOS.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Class<?> main = platform.loadJar(sourceFile, mainClass);
|
loader = platform.loadJar(sourceFile, mainClass);
|
||||||
|
Class<?> main = Class.forName(mainClass, true, loader);
|
||||||
metas.put(main, meta);
|
metas.put(main, meta);
|
||||||
mainMod = (Mod)main.getDeclaredConstructor().newInstance();
|
mainMod = (Mod)main.getDeclaredConstructor().newInstance();
|
||||||
}else{
|
}else{
|
||||||
@@ -707,11 +721,16 @@ public class Mods implements Loadable{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//skip mod loading if it failed
|
||||||
|
if(skipModLoading()){
|
||||||
|
Core.settings.put("mod-" + baseName + "-enabled", false);
|
||||||
|
}
|
||||||
|
|
||||||
if(!headless){
|
if(!headless){
|
||||||
Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed());
|
Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed());
|
||||||
}
|
}
|
||||||
return new LoadedMod(sourceFile, zip, mainMod, meta);
|
|
||||||
|
|
||||||
|
return new LoadedMod(sourceFile, zip, mainMod, loader, meta);
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
//delete root zip file so it can be closed on windows
|
//delete root zip file so it can be closed on windows
|
||||||
if(rootZip != null) rootZip.delete();
|
if(rootZip != null) rootZip.delete();
|
||||||
@@ -743,10 +762,13 @@ public class Mods implements Loadable{
|
|||||||
public ModState state = ModState.enabled;
|
public ModState state = ModState.enabled;
|
||||||
/** Icon texture. Should be disposed. */
|
/** Icon texture. Should be disposed. */
|
||||||
public @Nullable Texture iconTexture;
|
public @Nullable Texture iconTexture;
|
||||||
|
/** Class loader for JAR mods. Null if the mod isn't loaded or this isn't a jar mod. */
|
||||||
|
public @Nullable ClassLoader loader;
|
||||||
|
|
||||||
public LoadedMod(Fi file, Fi root, Mod main, ModMeta meta){
|
public LoadedMod(Fi file, Fi root, Mod main, ClassLoader loader, ModMeta meta){
|
||||||
this.root = root;
|
this.root = root;
|
||||||
this.file = file;
|
this.file = file;
|
||||||
|
this.loader = loader;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
this.meta = meta;
|
this.meta = meta;
|
||||||
this.name = meta.name.toLowerCase().replace(" ", "-");
|
this.name = meta.name.toLowerCase().replace(" ", "-");
|
||||||
|
|||||||
@@ -21,20 +21,25 @@ import java.net.*;
|
|||||||
import java.util.regex.*;
|
import java.util.regex.*;
|
||||||
|
|
||||||
public class Scripts implements Disposable{
|
public class Scripts implements Disposable{
|
||||||
private final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
|
private static final Seq<String> blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk",
|
||||||
"runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system",
|
"runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system",
|
||||||
".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "arc.net");
|
".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org.", "mod.classmap");
|
||||||
private final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio", "systemcursor");
|
private static final Seq<String> whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio", "systemcursor", "filetreeinitevent");
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final Scriptable scope;
|
private final Scriptable scope;
|
||||||
private boolean errored;
|
private boolean errored;
|
||||||
LoadedMod currentMod = null;
|
LoadedMod currentMod = null;
|
||||||
|
|
||||||
|
public static boolean allowClass(String type){
|
||||||
|
return !blacklist.contains(type.toLowerCase()::contains) || whitelist.contains(type.toLowerCase()::contains);
|
||||||
|
}
|
||||||
|
|
||||||
public Scripts(){
|
public Scripts(){
|
||||||
Time.mark();
|
Time.mark();
|
||||||
|
|
||||||
context = Vars.platform.getScriptContext();
|
context = Vars.platform.getScriptContext();
|
||||||
context.setClassShutter(type -> !blacklist.contains(type.toLowerCase()::contains) || whitelist.contains(type.toLowerCase()::contains));
|
context.setClassShutter(Scripts::allowClass);
|
||||||
context.getWrapFactory().setJavaPrimitiveWrap(false);
|
context.getWrapFactory().setJavaPrimitiveWrap(false);
|
||||||
context.setLanguageVersion(Context.VERSION_ES6);
|
context.setLanguageVersion(Context.VERSION_ES6);
|
||||||
|
|
||||||
@@ -57,7 +62,7 @@ public class Scripts implements Disposable{
|
|||||||
public String runConsole(String text){
|
public String runConsole(String text){
|
||||||
try{
|
try{
|
||||||
Object o = context.evaluateString(scope, text, "console.js", 1, null);
|
Object o = context.evaluateString(scope, text, "console.js", 1, null);
|
||||||
if(o instanceof NativeJavaObject) o = ((NativeJavaObject)o).unwrap();
|
if(o instanceof NativeJavaObject n) o = n.unwrap();
|
||||||
if(o instanceof Undefined) o = "undefined";
|
if(o instanceof Undefined) o = "undefined";
|
||||||
return String.valueOf(o);
|
return String.valueOf(o);
|
||||||
}catch(Throwable t){
|
}catch(Throwable t){
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ public class Packets{
|
|||||||
public int version;
|
public int version;
|
||||||
public String versionType;
|
public String versionType;
|
||||||
public Seq<String> mods;
|
public Seq<String> mods;
|
||||||
public String name, uuid, usid;
|
public String name, locale, uuid, usid;
|
||||||
public boolean mobile;
|
public boolean mobile;
|
||||||
public int color;
|
public int color;
|
||||||
|
|
||||||
@@ -169,6 +169,7 @@ public class Packets{
|
|||||||
buffer.putInt(Version.build);
|
buffer.putInt(Version.build);
|
||||||
TypeIO.writeString(buffer, versionType);
|
TypeIO.writeString(buffer, versionType);
|
||||||
TypeIO.writeString(buffer, name);
|
TypeIO.writeString(buffer, name);
|
||||||
|
TypeIO.writeString(buffer, locale);
|
||||||
TypeIO.writeString(buffer, usid);
|
TypeIO.writeString(buffer, usid);
|
||||||
|
|
||||||
byte[] b = Base64Coder.decode(uuid);
|
byte[] b = Base64Coder.decode(uuid);
|
||||||
@@ -190,6 +191,7 @@ public class Packets{
|
|||||||
version = buffer.getInt();
|
version = buffer.getInt();
|
||||||
versionType = TypeIO.readString(buffer);
|
versionType = TypeIO.readString(buffer);
|
||||||
name = TypeIO.readString(buffer);
|
name = TypeIO.readString(buffer);
|
||||||
|
locale = TypeIO.readString(buffer);
|
||||||
usid = TypeIO.readString(buffer);
|
usid = TypeIO.readString(buffer);
|
||||||
byte[] idbytes = new byte[16];
|
byte[] idbytes = new byte[16];
|
||||||
buffer.get(idbytes);
|
buffer.get(idbytes);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import mindustry.world.modules.ItemModule.*;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class ItemSeq implements Iterable<ItemStack>, Serializable{
|
public class ItemSeq implements Iterable<ItemStack>, JsonSerializable{
|
||||||
protected final int[] values = new int[Vars.content.items().size];
|
protected final int[] values = new int[Vars.content.items().size];
|
||||||
public int total;
|
public int total;
|
||||||
|
|
||||||
|
|||||||
@@ -225,6 +225,7 @@ public class UnitType extends UnlockableContent{
|
|||||||
Unit inst = constructor.get();
|
Unit inst = constructor.get();
|
||||||
|
|
||||||
stats.add(Stat.health, health);
|
stats.add(Stat.health, health);
|
||||||
|
stats.add(Stat.armor, armor);
|
||||||
stats.add(Stat.speed, speed);
|
stats.add(Stat.speed, speed);
|
||||||
stats.add(Stat.itemCapacity, itemCapacity);
|
stats.add(Stat.itemCapacity, itemCapacity);
|
||||||
stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks);
|
stats.add(Stat.range, (int)(maxRange / tilesize), StatUnit.blocks);
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ import static mindustry.gen.Tex.*;
|
|||||||
@StyleDefaults
|
@StyleDefaults
|
||||||
public class Styles{
|
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, accentDrawable;
|
||||||
public static ButtonStyle defaultb, waveb, modsb;
|
public static ButtonStyle defaultb, waveb, modsb;
|
||||||
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt, fullTogglet, logict;
|
public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, nonet, infot, clearPartialt, clearTogglet, logicTogglet, 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;
|
||||||
@@ -46,6 +46,7 @@ public class Styles{
|
|||||||
none = whiteui.tint(0f, 0f, 0f, 0f);
|
none = whiteui.tint(0f, 0f, 0f, 0f);
|
||||||
flatDown = createFlatDown();
|
flatDown = createFlatDown();
|
||||||
flatOver = whiteui.tint(Color.valueOf("454545"));
|
flatOver = whiteui.tint(Color.valueOf("454545"));
|
||||||
|
accentDrawable = whiteui.tint(Pal.accent);
|
||||||
|
|
||||||
defaultb = new ButtonStyle(){{
|
defaultb = new ButtonStyle(){{
|
||||||
down = buttonDown;
|
down = buttonDown;
|
||||||
@@ -151,6 +152,16 @@ public class Styles{
|
|||||||
disabled = black;
|
disabled = black;
|
||||||
disabledFontColor = Color.gray;
|
disabledFontColor = Color.gray;
|
||||||
}};
|
}};
|
||||||
|
logicTogglet = new TextButtonStyle(){{
|
||||||
|
font = Fonts.outline;
|
||||||
|
fontColor = Color.white;
|
||||||
|
checked = accentDrawable;
|
||||||
|
down = accentDrawable;
|
||||||
|
up = black;
|
||||||
|
over = flatOver;
|
||||||
|
disabled = black;
|
||||||
|
disabledFontColor = Color.gray;
|
||||||
|
}};
|
||||||
clearToggleMenut = new TextButtonStyle(){{
|
clearToggleMenut = new TextButtonStyle(){{
|
||||||
font = Fonts.def;
|
font = Fonts.def;
|
||||||
fontColor = Color.white;
|
fontColor = Color.white;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class ControlsDialog extends KeybindDialog{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addCloseButton(){
|
public void addCloseButton(){
|
||||||
buttons.button("@back", Icon.left, this::hide).size(230f, 64f);
|
buttons.button("@back", Icon.left, this::hide).size(210f, 64f);
|
||||||
|
|
||||||
keyDown(key -> {
|
keyDown(key -> {
|
||||||
if(key == KeyCode.escape || key == KeyCode.back) hide();
|
if(key == KeyCode.escape || key == KeyCode.back) hide();
|
||||||
|
|||||||
@@ -161,6 +161,8 @@ public class CustomRulesDialog extends BaseDialog{
|
|||||||
|
|
||||||
title("@rules.title.unit");
|
title("@rules.title.unit");
|
||||||
check("@rules.unitammo", b -> rules.unitAmmo = b, () -> rules.unitAmmo);
|
check("@rules.unitammo", b -> rules.unitAmmo = b, () -> rules.unitAmmo);
|
||||||
|
check("@rules.unitcapvariable", b -> rules.unitCapVariable = b, () -> rules.unitCapVariable);
|
||||||
|
number("@rules.unitcap", true, f -> rules.unitCap = f, () -> rules.unitCap, -999, 999);
|
||||||
number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
|
number("@rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
|
||||||
number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, 0.001f, 50f);
|
number("@rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, 0.001f, 50f);
|
||||||
|
|
||||||
@@ -204,6 +206,17 @@ public class CustomRulesDialog extends BaseDialog{
|
|||||||
number(text, false, cons, prov, condition, 0, Float.MAX_VALUE);
|
number(text, false, cons, prov, condition, 0, Float.MAX_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void number(String text, boolean integer, Intc cons, Intp prov, int min, int max){
|
||||||
|
main.table(t -> {
|
||||||
|
t.left();
|
||||||
|
t.add(text).left().padRight(5);
|
||||||
|
t.field((integer ? (int)prov.get() : prov.get()) + "", s -> cons.get(Strings.parseInt(s)))
|
||||||
|
.padRight(100f)
|
||||||
|
.valid(f -> Strings.parseInt(f) >= min && Strings.parseInt(f) <= max).width(120f).left().addInputDialog();
|
||||||
|
}).padTop(0);
|
||||||
|
main.row();
|
||||||
|
}
|
||||||
|
|
||||||
void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition, float min, float max){
|
void number(String text, boolean integer, Floatc cons, Floatp prov, Boolp condition, float min, float max){
|
||||||
main.table(t -> {
|
main.table(t -> {
|
||||||
t.left();
|
t.left();
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ public class JoinDialog extends BaseDialog{
|
|||||||
Core.settings.remove("server-list");
|
Core.settings.remove("server-list");
|
||||||
}
|
}
|
||||||
|
|
||||||
var url = becontrol.active() ? serverJsonBeURL : serverJsonV6URL;
|
var url = becontrol.active() ? serverJsonBeURL : serverJsonURL;
|
||||||
Log.info("Fetching community servers at @", url);
|
Log.info("Fetching community servers at @", url);
|
||||||
|
|
||||||
//get servers
|
//get servers
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class ModsDialog extends BaseDialog{
|
|||||||
|
|
||||||
private String searchtxt = "";
|
private String searchtxt = "";
|
||||||
private @Nullable Seq<ModListing> modList;
|
private @Nullable Seq<ModListing> modList;
|
||||||
private boolean orderDate = true;
|
private boolean orderDate = false;
|
||||||
private BaseDialog currentContent;
|
private BaseDialog currentContent;
|
||||||
|
|
||||||
private BaseDialog browser;
|
private BaseDialog browser;
|
||||||
@@ -77,7 +77,6 @@ public class ModsDialog extends BaseDialog{
|
|||||||
browser.cont.pane(tablebrow -> {
|
browser.cont.pane(tablebrow -> {
|
||||||
tablebrow.margin(10f).top();
|
tablebrow.margin(10f).top();
|
||||||
browserTable = tablebrow;
|
browserTable = tablebrow;
|
||||||
rebuildBrowser();
|
|
||||||
}).get().setScrollingDisabled(true, false);
|
}).get().setScrollingDisabled(true, false);
|
||||||
browser.addCloseButton();
|
browser.addCloseButton();
|
||||||
|
|
||||||
@@ -107,11 +106,6 @@ public class ModsDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
shown(() -> Core.app.post(() -> {
|
|
||||||
Core.settings.getBoolOnce("modsalpha", () -> {
|
|
||||||
ui.showText("@mods", "@mods.alphainfo");
|
|
||||||
});
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void modError(Throwable error){
|
void modError(Throwable error){
|
||||||
@@ -155,7 +149,7 @@ public class ModsDialog extends BaseDialog{
|
|||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, error -> Core.app.post(() -> ui.showException(error)));
|
}, error -> Core.app.post(() -> modError(error)));
|
||||||
}else{
|
}else{
|
||||||
listener.get(modList);
|
listener.get(modList);
|
||||||
}
|
}
|
||||||
@@ -267,7 +261,7 @@ public class ModsDialog extends BaseDialog{
|
|||||||
title.table(text -> {
|
title.table(text -> {
|
||||||
boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors();
|
boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors();
|
||||||
|
|
||||||
text.add("" + Strings.stripColors(mod.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(mod.meta.version)) + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
|
text.add("[accent]" + Strings.stripColors(mod.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(mod.meta.version)) + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
|
||||||
.wrap().top().width(300f).growX().left();
|
.wrap().top().width(300f).growX().left();
|
||||||
|
|
||||||
text.row();
|
text.row();
|
||||||
@@ -385,7 +379,7 @@ public class ModsDialog extends BaseDialog{
|
|||||||
|
|
||||||
}).tooltip(c.localizedName);
|
}).tooltip(c.localizedName);
|
||||||
|
|
||||||
if(++i % Math.min(Core.graphics.getWidth() / Scl.scl(70), 14) == 0) cs.row();
|
if(++i % Math.min(Core.graphics.getWidth() / Scl.scl(110), 14) == 0) cs.row();
|
||||||
}
|
}
|
||||||
}).grow();
|
}).grow();
|
||||||
d.addCloseButton();
|
d.addCloseButton();
|
||||||
@@ -508,6 +502,7 @@ public class ModsDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String trimText(String text){
|
private String trimText(String text){
|
||||||
|
if(text == null) return "";
|
||||||
if(text.contains("\n")){
|
if(text.contains("\n")){
|
||||||
return text.substring(0, text.indexOf("\n"));
|
return text.substring(0, text.indexOf("\n"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -208,11 +208,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void addBack(){
|
void addBack(){
|
||||||
buttons.button("@back", Icon.left, this::hide).size(200, 54).pad(2).bottom();
|
buttons.button("@back", Icon.left, this::hide).size(200f, 54f).pad(2).bottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
void addTech(){
|
void addTech(){
|
||||||
buttons.button("@techtree", Icon.tree, () -> ui.research.show()).size(200, 54).pad(2).bottom();
|
buttons.button("@techtree", Icon.tree, () -> ui.research.show()).size(200f, 54f).pad(2).bottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showOverview(){
|
public void showOverview(){
|
||||||
@@ -677,7 +677,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
setFillParent(true);
|
setFillParent(true);
|
||||||
cont.pane(t -> {
|
cont.pane(t -> {
|
||||||
t.marginRight(19f);
|
t.marginRight(19f);
|
||||||
t.defaults().size(48);
|
t.defaults().size(48f);
|
||||||
|
|
||||||
t.button(Icon.none, Styles.clearTogglei, () -> {
|
t.button(Icon.none, Styles.clearTogglei, () -> {
|
||||||
sector.info.icon = null;
|
sector.info.icon = null;
|
||||||
@@ -701,6 +701,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
|||||||
if(++i % 8 == 0) t.row();
|
if(++i % 8 == 0) t.row();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
buttons.button("@back", Icon.left, this::hide).size(210f, 64f);
|
||||||
}}.show();
|
}}.show();
|
||||||
}).size(40f);
|
}).size(40f);
|
||||||
}).row();
|
}).row();
|
||||||
|
|||||||
@@ -320,12 +320,17 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
game.checkPref("blockreplace", true);
|
game.checkPref("blockreplace", true);
|
||||||
game.checkPref("conveyorpathfinding", true);
|
game.checkPref("conveyorpathfinding", true);
|
||||||
game.checkPref("hints", true);
|
game.checkPref("hints", true);
|
||||||
|
game.checkPref("logichints", true);
|
||||||
|
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
game.checkPref("backgroundpause", true);
|
game.checkPref("backgroundpause", true);
|
||||||
game.checkPref("buildautopause", false);
|
game.checkPref("buildautopause", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!ios){
|
||||||
|
game.checkPref("modcrashdisable", true);
|
||||||
|
}
|
||||||
|
|
||||||
if(steam){
|
if(steam){
|
||||||
game.sliderPref("playerlimit", 16, 2, 32, i -> {
|
game.sliderPref("playerlimit", 16, 2, 32, i -> {
|
||||||
platform.updateLobby();
|
platform.updateLobby();
|
||||||
@@ -452,11 +457,24 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
files.addAll(schematicDirectory.list());
|
files.addAll(schematicDirectory.list());
|
||||||
String base = Core.settings.getDataDirectory().path();
|
String base = Core.settings.getDataDirectory().path();
|
||||||
|
|
||||||
|
//add directories
|
||||||
|
for(Fi other : files.copy()){
|
||||||
|
Fi parent = other.parent();
|
||||||
|
while(!files.contains(parent) && !parent.equals(settings.getDataDirectory())){
|
||||||
|
files.add(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){
|
try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){
|
||||||
for(Fi add : files){
|
for(Fi add : files){
|
||||||
if(add.isDirectory()) continue;
|
String path = add.path().substring(base.length());
|
||||||
zos.putNextEntry(new ZipEntry(add.path().substring(base.length())));
|
if(add.isDirectory()) path += "/";
|
||||||
|
//fix trailing / in path
|
||||||
|
path = path.startsWith("/") ? path.substring(1) : path;
|
||||||
|
zos.putNextEntry(new ZipEntry(path));
|
||||||
|
if(!add.isDirectory()){
|
||||||
Streams.copy(add.read(), zos);
|
Streams.copy(add.read(), zos);
|
||||||
|
}
|
||||||
zos.closeEntry();
|
zos.closeEntry();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -500,13 +518,13 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addCloseButton(){
|
public void addCloseButton(){
|
||||||
buttons.button("@back", Icon.leftOpen, () -> {
|
buttons.button("@back", Icon.left, () -> {
|
||||||
if(prefs.getChildren().first() != menu){
|
if(prefs.getChildren().first() != menu){
|
||||||
back();
|
back();
|
||||||
}else{
|
}else{
|
||||||
hide();
|
hide();
|
||||||
}
|
}
|
||||||
}).size(230f, 64f);
|
}).size(210f, 64f);
|
||||||
|
|
||||||
keyDown(key -> {
|
keyDown(key -> {
|
||||||
if(key == KeyCode.escape || key == KeyCode.back){
|
if(key == KeyCode.escape || key == KeyCode.back){
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import arc.util.*;
|
|||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.input.*;
|
import mindustry.input.*;
|
||||||
import mindustry.type.*;
|
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
|
|
||||||
import static arc.Core.*;
|
import static arc.Core.*;
|
||||||
@@ -206,7 +205,7 @@ public class ChatFragment extends Table{
|
|||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//sending chat has a delay; workaround for issue #1943
|
//sending chat has a delay; workaround for issue #1943
|
||||||
Time.run(2f, () ->{
|
Time.runTask(2f, () ->{
|
||||||
scene.setKeyboardFocus(null);
|
scene.setKeyboardFocus(null);
|
||||||
shown = false;
|
shown = false;
|
||||||
scrollPos = 0;
|
scrollPos = 0;
|
||||||
|
|||||||
@@ -637,20 +637,12 @@ public class HudFragment extends Fragment{
|
|||||||
|
|
||||||
if(Float.isNaN(value) || Float.isInfinite(value)) value = 1f;
|
if(Float.isNaN(value) || Float.isInfinite(value)) value = 1f;
|
||||||
|
|
||||||
drawInner(Pal.darkishGray);
|
drawInner(Pal.darkishGray, 1f);
|
||||||
|
drawInner(Tmp.c1.set(color).lerp(Color.white, blink), value);
|
||||||
Draw.beginStencil();
|
|
||||||
|
|
||||||
Fill.crect(x, y, width, height * value);
|
|
||||||
|
|
||||||
Draw.beginStenciled();
|
|
||||||
|
|
||||||
drawInner(Tmp.c1.set(color).lerp(Color.white, blink));
|
|
||||||
|
|
||||||
Draw.endStencil();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawInner(Color color){
|
void drawInner(Color color, float fract){
|
||||||
|
if(fract < 0) return;
|
||||||
if(flip){
|
if(flip){
|
||||||
x += width;
|
x += width;
|
||||||
width = -width;
|
width = -width;
|
||||||
@@ -660,19 +652,26 @@ public class HudFragment extends Fragment{
|
|||||||
float bh = height/2f;
|
float bh = height/2f;
|
||||||
Draw.color(color);
|
Draw.color(color);
|
||||||
|
|
||||||
|
float f1 = Math.min(fract * 2f, 1f), f2 = (fract - 0.5f) * 2f;
|
||||||
|
|
||||||
|
float bo = -(1f - f1) * (width - stroke);
|
||||||
|
|
||||||
Fill.quad(
|
Fill.quad(
|
||||||
x, y,
|
x, y,
|
||||||
x + stroke, y,
|
x + stroke, y,
|
||||||
x + width, y + bh,
|
x + width + bo, y + bh * f1,
|
||||||
x + width - stroke, y + bh
|
x + width - stroke + bo, y + bh * f1
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if(f2 > 0){
|
||||||
|
float bx = x + (width - stroke) * (1f - f2);
|
||||||
Fill.quad(
|
Fill.quad(
|
||||||
x + width, y + bh,
|
x + width, y + bh,
|
||||||
x + width - stroke, y + bh,
|
x + width - stroke, y + bh,
|
||||||
x, y + height,
|
bx, y + height * fract,
|
||||||
x + stroke, y + height
|
bx + stroke, y + height * fract
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
|
|||||||
@@ -160,8 +160,10 @@ public class Block extends UnlockableContent{
|
|||||||
public boolean canOverdrive = true;
|
public boolean canOverdrive = true;
|
||||||
/** Outlined icon color.*/
|
/** Outlined icon color.*/
|
||||||
public Color outlineColor = Color.valueOf("404049");
|
public Color outlineColor = Color.valueOf("404049");
|
||||||
/** Whether the icon region has an outline added. */
|
/** Whether any icon region has an outline added. */
|
||||||
public boolean outlineIcon = false;
|
public boolean outlineIcon = false;
|
||||||
|
/** Which of the icon regions gets the outline added. */
|
||||||
|
public int outlinedIcon = -1;
|
||||||
/** Whether this block has a shadow under it. */
|
/** Whether this block has a shadow under it. */
|
||||||
public boolean hasShadow = true;
|
public boolean hasShadow = true;
|
||||||
/** Sounds made when this block breaks.*/
|
/** Sounds made when this block breaks.*/
|
||||||
@@ -333,7 +335,11 @@ public class Block extends UnlockableContent{
|
|||||||
super.setStats();
|
super.setStats();
|
||||||
|
|
||||||
stats.add(Stat.size, "@x@", size, size);
|
stats.add(Stat.size, "@x@", size, size);
|
||||||
|
|
||||||
|
if(synthetic()){
|
||||||
stats.add(Stat.health, health, StatUnit.none);
|
stats.add(Stat.health, health, StatUnit.none);
|
||||||
|
}
|
||||||
|
|
||||||
if(canBeBuilt()){
|
if(canBeBuilt()){
|
||||||
stats.add(Stat.buildTime, buildCost / 60, StatUnit.seconds);
|
stats.add(Stat.buildTime, buildCost / 60, StatUnit.seconds);
|
||||||
stats.add(Stat.buildCost, new ItemListValue(false, requirements));
|
stats.add(Stat.buildCost, new ItemListValue(false, requirements));
|
||||||
@@ -428,7 +434,7 @@ public class Block extends UnlockableContent{
|
|||||||
TextureRegion reg = getRequestRegion(req, list);
|
TextureRegion reg = getRequestRegion(req, list);
|
||||||
Draw.rect(reg, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90);
|
Draw.rect(reg, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90);
|
||||||
|
|
||||||
if(req.worldContext && player != null && teamRegion.found()){
|
if(req.worldContext && player != null && teamRegion != null && teamRegion.found()){
|
||||||
if(teamRegions[player.team().id] == teamRegion) Draw.color(player.team().color);
|
if(teamRegions[player.team().id] == teamRegion) Draw.color(player.team().color);
|
||||||
Draw.rect(teamRegions[player.team().id], req.drawx(), req.drawy());
|
Draw.rect(teamRegions[player.team().id], req.drawx(), req.drawy());
|
||||||
Draw.color();
|
Draw.color();
|
||||||
@@ -768,7 +774,7 @@ public class Block extends UnlockableContent{
|
|||||||
|
|
||||||
if(outlineIcon){
|
if(outlineIcon){
|
||||||
final int radius = 4;
|
final int radius = 4;
|
||||||
PixmapRegion region = Core.atlas.getPixmap(getGeneratedIcons()[getGeneratedIcons().length-1]);
|
PixmapRegion region = Core.atlas.getPixmap(getGeneratedIcons()[outlinedIcon >= 0 ? outlinedIcon : getGeneratedIcons().length -1]);
|
||||||
Pixmap out = new Pixmap(region.width, region.height);
|
Pixmap out = new Pixmap(region.width, region.height);
|
||||||
Color color = new Color();
|
Color color = new Color();
|
||||||
for(int x = 0; x < region.width; x++){
|
for(int x = 0; x < region.width; x++){
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ public class Build{
|
|||||||
(type == check.block() && check.build != null && rotation == check.build.rotation && type.rotate) || //same block, same rotation
|
(type == check.block() && check.build != null && rotation == check.build.rotation && type.rotate) || //same block, same rotation
|
||||||
!check.interactable(team) || //cannot interact
|
!check.interactable(team) || //cannot interact
|
||||||
!check.floor().placeableOn || //solid wall
|
!check.floor().placeableOn || //solid wall
|
||||||
|
(!checkVisible && !check.block().alwaysReplace) || //replacing a block that should be replaced (e.g. payload placement)
|
||||||
!((type.canReplace(check.block()) || //can replace type
|
!((type.canReplace(check.block()) || //can replace type
|
||||||
//controversial change: allow rebuilding damaged blocks
|
//controversial change: allow rebuilding damaged blocks
|
||||||
//this could be buggy and abuse-able, so I'm not enabling it yet
|
//this could be buggy and abuse-able, so I'm not enabling it yet
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import mindustry.world.meta.*;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class Attributes implements Serializable{
|
public class Attributes implements JsonSerializable{
|
||||||
private final float[] arr = new float[Attribute.all.length];
|
private final float[] arr = new float[Attribute.all.length];
|
||||||
|
|
||||||
public void clear(){
|
public void clear(){
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public class Accelerator extends Block{
|
|||||||
public @Load("launch-arrow") TextureRegion arrowRegion;
|
public @Load("launch-arrow") TextureRegion arrowRegion;
|
||||||
|
|
||||||
public Block launching = Blocks.coreNucleus;
|
public Block launching = Blocks.coreNucleus;
|
||||||
public int[] capacities;
|
public int[] capacities = {};
|
||||||
|
|
||||||
public Accelerator(String name){
|
public Accelerator(String name){
|
||||||
super(name);
|
super(name);
|
||||||
|
|||||||
@@ -178,6 +178,12 @@ public class ForceProjector extends Block{
|
|||||||
return (radius + phaseHeat * phaseRadiusBoost) * radscl;
|
return (radius + phaseHeat * phaseRadiusBoost) * radscl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double sense(LAccess sensor){
|
||||||
|
if(sensor == LAccess.heat) return buildup;
|
||||||
|
return super.sense(sensor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
super.draw();
|
super.draw();
|
||||||
|
|||||||
@@ -27,10 +27,11 @@ public class LiquidTurret extends Turret{
|
|||||||
hasLiquids = true;
|
hasLiquids = true;
|
||||||
loopSound = Sounds.spray;
|
loopSound = Sounds.spray;
|
||||||
shootSound = Sounds.none;
|
shootSound = Sounds.none;
|
||||||
|
outlinedIcon = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initializes accepted ammo map. Format: [liquid1, bullet1, liquid2, bullet2...] */
|
/** Initializes accepted ammo map. Format: [liquid1, bullet1, liquid2, bullet2...] */
|
||||||
protected void ammo(Object... objects){
|
public void ammo(Object... objects){
|
||||||
ammoTypes = OrderedMap.of(objects);
|
ammoTypes = OrderedMap.of(objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,6 +64,12 @@ public class LiquidTurret extends Turret{
|
|||||||
super.init();
|
super.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureRegion[] icons(){
|
||||||
|
if(topRegion.found()) return new TextureRegion[]{baseRegion, region, topRegion};
|
||||||
|
return super.icons();
|
||||||
|
}
|
||||||
|
|
||||||
public class LiquidTurretBuild extends TurretBuild{
|
public class LiquidTurretBuild extends TurretBuild{
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ public class TractorBeamTurret extends BaseTurret{
|
|||||||
any = false;
|
any = false;
|
||||||
|
|
||||||
//look at target
|
//look at target
|
||||||
if(target != null && target.within(this, range) && target.team() != team && target.checkTarget(targetAir, targetGround) && efficiency() > 0.02f){
|
if(target != null && target.within(this, range + target.hitSize/2f) && target.team() != team && target.checkTarget(targetAir, targetGround) && efficiency() > 0.02f){
|
||||||
if(!headless){
|
if(!headless){
|
||||||
control.sound.loop(shootSound, this, shootSoundVolume);
|
control.sound.loop(shootSound, this, shootSoundVolume);
|
||||||
}
|
}
|
||||||
|
|||||||
43
core/src/mindustry/world/blocks/environment/AirBlock.java
Normal file
43
core/src/mindustry/world/blocks/environment/AirBlock.java
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package mindustry.world.blocks.environment;
|
||||||
|
|
||||||
|
import arc.*;
|
||||||
|
import arc.graphics.g2d.*;
|
||||||
|
import mindustry.annotations.Annotations.*;
|
||||||
|
import mindustry.world.*;
|
||||||
|
|
||||||
|
public class AirBlock extends Floor{
|
||||||
|
|
||||||
|
public AirBlock(String name){
|
||||||
|
super(name);
|
||||||
|
alwaysReplace = true;
|
||||||
|
hasShadow = false;
|
||||||
|
useColor = false;
|
||||||
|
wall = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawBase(Tile tile){}
|
||||||
|
|
||||||
|
@OverrideCallSuper
|
||||||
|
@Override
|
||||||
|
public void load(){}
|
||||||
|
|
||||||
|
@OverrideCallSuper
|
||||||
|
@Override
|
||||||
|
public void init(){
|
||||||
|
decoration = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isHidden(){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextureRegion[] variantRegions(){
|
||||||
|
if(variantRegions == null){
|
||||||
|
variantRegions = new TextureRegion[]{Core.atlas.find("clear")};
|
||||||
|
}
|
||||||
|
return variantRegions;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ import arc.math.*;
|
|||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
|
||||||
public class Boulder extends Block{
|
public class Boulder extends Block{
|
||||||
protected int variants;
|
public int variants;
|
||||||
|
|
||||||
public Boulder(String name){
|
public Boulder(String name){
|
||||||
super(name);
|
super(name);
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
package mindustry.world.blocks.environment;
|
package mindustry.world.blocks.environment;
|
||||||
|
|
||||||
|
import arc.util.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
|
||||||
//do not use in mods!
|
/**
|
||||||
|
* Do not use in mods. This class provides no new functionality, and is only used for the Mindustry sprite generator.
|
||||||
|
* Use the standard Floor class instead.
|
||||||
|
* */
|
||||||
public class ShallowLiquid extends Floor{
|
public class ShallowLiquid extends Floor{
|
||||||
public Floor liquidBase, floorBase;
|
public @Nullable Floor liquidBase, floorBase;
|
||||||
public float liquidOpacity = 0.35f;
|
public float liquidOpacity = 0.35f;
|
||||||
|
|
||||||
public ShallowLiquid(String name){
|
public ShallowLiquid(String name){
|
||||||
|
|||||||
15
core/src/mindustry/world/blocks/environment/SpawnBlock.java
Normal file
15
core/src/mindustry/world/blocks/environment/SpawnBlock.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package mindustry.world.blocks.environment;
|
||||||
|
|
||||||
|
import mindustry.world.*;
|
||||||
|
|
||||||
|
public class SpawnBlock extends OverlayFloor{
|
||||||
|
|
||||||
|
public SpawnBlock(String name){
|
||||||
|
super(name);
|
||||||
|
variants = 0;
|
||||||
|
needsSurface = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawBase(Tile tile){}
|
||||||
|
}
|
||||||
@@ -83,6 +83,7 @@ public class UnitPayload implements Payload{
|
|||||||
public void draw(){
|
public void draw(){
|
||||||
Drawf.shadow(unit.x, unit.y, 20);
|
Drawf.shadow(unit.x, unit.y, 20);
|
||||||
Draw.rect(unit.type.icon(Cicon.full), unit.x, unit.y, unit.rotation - 90);
|
Draw.rect(unit.type.icon(Cicon.full), unit.x, unit.y, unit.rotation - 90);
|
||||||
|
unit.type.drawCell(unit);
|
||||||
|
|
||||||
//draw warning
|
//draw warning
|
||||||
if(deactiveTime > 0){
|
if(deactiveTime > 0){
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import arc.*;
|
|||||||
import arc.graphics.*;
|
import arc.graphics.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.math.*;
|
import arc.math.*;
|
||||||
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
@@ -23,8 +24,8 @@ public class ImpactReactor extends PowerGenerator{
|
|||||||
|
|
||||||
public float warmupSpeed = 0.001f;
|
public float warmupSpeed = 0.001f;
|
||||||
public float itemDuration = 60f;
|
public float itemDuration = 60f;
|
||||||
public int explosionRadius = 50;
|
public int explosionRadius = 23;
|
||||||
public int explosionDamage = 2000;
|
public int explosionDamage = 1900;
|
||||||
|
|
||||||
public Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b");
|
public Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b");
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ public class ImpactReactor extends PowerGenerator{
|
|||||||
liquidCapacity = 30f;
|
liquidCapacity = 30f;
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
outputsPower = consumesPower = true;
|
outputsPower = consumesPower = true;
|
||||||
|
flags = EnumSet.of(BlockFlag.reactor, BlockFlag.generator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -30,12 +30,17 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
public Color lightColor = Color.valueOf("7f19ea");
|
public Color lightColor = Color.valueOf("7f19ea");
|
||||||
public Color coolColor = new Color(1, 1, 1, 0f);
|
public Color coolColor = new Color(1, 1, 1, 0f);
|
||||||
public Color hotColor = Color.valueOf("ff9575a3");
|
public Color hotColor = Color.valueOf("ff9575a3");
|
||||||
public float itemDuration = 120; //time to consume 1 fuel
|
/** ticks to consume 1 fuel */
|
||||||
public float heating = 0.01f; //heating per frame * fullness
|
public float itemDuration = 120;
|
||||||
public float smokeThreshold = 0.3f; //threshold at which block starts smoking
|
/** heating per frame * fullness */
|
||||||
public int explosionRadius = 40;
|
public float heating = 0.01f;
|
||||||
public int explosionDamage = 1350;
|
/** threshold at which block starts smoking */
|
||||||
public float flashThreshold = 0.46f; //heat threshold at which the lights start flashing
|
public float smokeThreshold = 0.3f;
|
||||||
|
/** heat threshold at which lights start flashing */
|
||||||
|
public float flashThreshold = 0.46f;
|
||||||
|
public int explosionRadius = 19;
|
||||||
|
public int explosionDamage = 1250;
|
||||||
|
/** heat removed per unit of coolant */
|
||||||
public float coolantPower = 0.5f;
|
public float coolantPower = 0.5f;
|
||||||
|
|
||||||
public @Load("@-top") TextureRegion topRegion;
|
public @Load("@-top") TextureRegion topRegion;
|
||||||
@@ -48,7 +53,7 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
hasItems = true;
|
hasItems = true;
|
||||||
hasLiquids = true;
|
hasLiquids = true;
|
||||||
rebuildable = false;
|
rebuildable = false;
|
||||||
flags = EnumSet.of(BlockFlag.reactor);
|
flags = EnumSet.of(BlockFlag.reactor, BlockFlag.generator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user