Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bbc8c05f93 | ||
|
|
bfbb082fd8 | ||
|
|
89ef2ac4d3 | ||
|
|
506175212c | ||
|
|
b57b1966a7 | ||
|
|
08a50edb23 | ||
|
|
95c242a2e1 | ||
|
|
49a1a0b768 | ||
|
|
a44ef1f063 | ||
|
|
72d5a8a768 | ||
|
|
8692639e62 | ||
|
|
1ef264d560 | ||
|
|
63d4428527 | ||
|
|
4beca5e07d | ||
|
|
2758e65e19 | ||
|
|
129d76ad7e | ||
|
|
f4a7288633 | ||
|
|
1684c04e52 | ||
|
|
ece615e764 | ||
|
|
8b48ef4f92 | ||
|
|
0ee8c2362f | ||
|
|
adc7b30eab | ||
|
|
527be41e32 | ||
|
|
8280166485 | ||
|
|
e453c6033a | ||
|
|
949ad79ade | ||
|
|
daabdf486f | ||
|
|
8b50bb68e7 | ||
|
|
bd654fda76 | ||
|
|
40ae2e64c8 | ||
|
|
78ae6dde4f | ||
|
|
2071bad22d | ||
|
|
054f0b2128 | ||
|
|
1e2b593152 | ||
|
|
b46676014b | ||
|
|
3c36749990 | ||
|
|
280e345faf | ||
|
|
f296d23cfa | ||
|
|
c72a9166a6 | ||
|
|
ffca824474 | ||
|
|
3b609f698a | ||
|
|
dc35e61c3f | ||
|
|
d94765f470 | ||
|
|
4a25063a29 | ||
|
|
6b2ba8b432 | ||
|
|
6753ab7c6e | ||
|
|
dbc446f400 | ||
|
|
ea41e38706 | ||
|
|
4a1300f789 | ||
|
|
c263a1e52f | ||
|
|
8c99a5cce0 |
@@ -29,7 +29,7 @@ script:
|
||||
- cd ../Mindustry
|
||||
deploy:
|
||||
- provider: releases
|
||||
skip_cleanup: true
|
||||
cleanup: false
|
||||
draft: false
|
||||
api_key:
|
||||
secure: Cv5wFtWt62/A24EvSEQvMow7gKPbZ3oATEFPuSghhB2TQz1dA40Zee3Qvk4LFlpLrhYo4K0ZSczCZRGpR+hCd8+Dpww52bheYEvWuh3ZQfvu/fXtEx2j5PwP1qMpmIgSxETV/gkD7l9FImdh0VzktYiAvQfmi0bEocG9/D4QwjFpNat7iwBdcMiw1MvAygpdIWRsjiw0RKlB2mWarmoHhQ7Gu7qlU3j50uaEvcrtmU0pBUPggNQwQRv32i9NPvNFxrqqlUjDLIS8JFea99zCkp8BwYqbEvBIMzd+Qip1/stLJJA3+cDUClbsDtg8rAVetzpOrdLEEBmqShFe5MDl2yEHcsgpN9CFsyTaUfvB3P3rVjizvycMm42IsUkXQiarm5xTQ/TIA8Rd8AHiSKuweNCg1Fd5SFaRtKy8JVLXuxyfUccmyje6hhz2L4lS2Wfj3mAG7sqZUCXhWP79EKdGkiPOjKv4CwXEKmuH3BMVqPlNUZJr9Eg3sV1FG0h2l+MVOOnR635qdUbb49sYojYxVruMLX0BH1c4ZCu230m8CUoWA1Em1QNI75ya7+9Y5T6AsgWDVpBvdUo9fWNbdp+VQ0GskFQsJD5wtnxbcbHeFiERAgGBm7z6qt9u9LrQpBH+dsW52ADvYsu3L4nQEa+sdMHwTTwmGY+iUvsxu0DqxGg=
|
||||
|
||||
@@ -138,7 +138,7 @@ public class AndroidLauncher extends AndroidApplication{
|
||||
if(open){
|
||||
new FileChooser(title, file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show();
|
||||
}else{
|
||||
super.showFileChooser(open, extension, cons);
|
||||
super.showFileChooser(open, "@open", extension, cons);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
#Maps entity names to IDs. Autogenerated.
|
||||
|
||||
alpha=0
|
||||
arkyid=29
|
||||
atrax=1
|
||||
beta=30
|
||||
block=2
|
||||
corvus=24
|
||||
flare=3
|
||||
gamma=31
|
||||
mace=4
|
||||
mega=5
|
||||
mindustry.entities.comp.BuildingComp=6
|
||||
@@ -26,6 +29,8 @@ oct=26
|
||||
poly=18
|
||||
pulsar=19
|
||||
quad=23
|
||||
quasar=32
|
||||
risso=20
|
||||
spiroct=21
|
||||
toxopid=33
|
||||
vela=25
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{version:3,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:baseRotation,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{version:4,fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
@@ -0,0 +1 @@
|
||||
{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:flag,type:double},{name:health,type:float},{name:isShooting,type:boolean},{name:mineTile,type:mindustry.world.Tile},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:plans,type:arc.struct.Queue<mindustry.entities.units.BuildPlan>},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq<mindustry.entities.units.StatusEntry>},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]}
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 213 B |
@@ -10,18 +10,21 @@ link.dev-builds.description = Unstable development builds
|
||||
link.trello.description = Official Trello board for planned features
|
||||
link.itch.io.description = itch.io page with PC downloads
|
||||
link.google-play.description = Google Play store listing
|
||||
link.f-droid.description = F-Droid catalogue listing
|
||||
link.f-droid.description = F-Droid listing
|
||||
link.wiki.description = Official Mindustry wiki
|
||||
link.suggestions.description = Suggest new features
|
||||
linkfail = Failed to open link!\nThe URL has been copied to your clipboard.
|
||||
screenshot = Screenshot saved to {0}
|
||||
screenshot.invalid = Map too large, potentially not enough memory for screenshot.
|
||||
gameover = Game Over
|
||||
gameover.disconnect = Disconnect
|
||||
gameover.pvp = The[accent] {0}[] team is victorious!
|
||||
gameover.waiting = [accent]Waiting for next map...
|
||||
highscore = [accent]New highscore!
|
||||
copied = Copied.
|
||||
indev.popup = [accent]v6[] is currently in [accent]beta[].\n[lightgray]This means:[]\n[scarlet]- The campaign is unfinished[]\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[].
|
||||
indev.notready = This part of the game isn't ready yet
|
||||
indev.campaign = [accent]You've reached the end of the campaign![]\n\nThis is as far as the content goes. Interplanetary travel will be added in future updates.
|
||||
|
||||
load.sound = Sounds
|
||||
load.map = Maps
|
||||
@@ -502,6 +505,7 @@ loadout = Loadout
|
||||
resources = Resources
|
||||
bannedblocks = Banned Blocks
|
||||
addall = Add All
|
||||
launch.from = Launching From: [accent]{0}
|
||||
launch.destination = Destination: {0}
|
||||
configure.invalid = Amount must be a number between 0 and {0}.
|
||||
zone.unlocked = [lightgray]{0} unlocked.
|
||||
@@ -544,6 +548,7 @@ sectors.select = Select
|
||||
sectors.nonelaunch = [lightgray]none (sun)
|
||||
sectors.rename = Rename Sector
|
||||
|
||||
sector.curcapture = Sector Captured
|
||||
sector.missingresources = [scarlet]Insufficient Core Resources
|
||||
sector.attacked = Sector [accent]{0}[white] under attack!
|
||||
sector.lost = Sector [accent]{0}[white] lost!
|
||||
@@ -559,10 +564,8 @@ threat.eradication = Eradication
|
||||
planets = Planets
|
||||
|
||||
planet.serpulo.name = Serpulo
|
||||
#TODO better name
|
||||
planet.sun.name = Sun
|
||||
|
||||
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
|
||||
sector.impact0078.name = Impact 0078
|
||||
sector.groundZero.name = Ground Zero
|
||||
sector.craters.name = The Craters
|
||||
@@ -578,9 +581,7 @@ sector.fungalPass.name = Fungal Pass
|
||||
sector.biomassFacility.name = Biomass Synthesis Facility
|
||||
sector.windsweptIslands.name = Windswept Islands
|
||||
sector.extractionOutpost.name = Extraction Outpost
|
||||
|
||||
#unused
|
||||
#sector.crags.name = Crags
|
||||
sector.planetaryTerminal.name = Planetary Launch Terminal
|
||||
|
||||
sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on.
|
||||
sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders.
|
||||
@@ -1214,6 +1215,7 @@ block.overdrive-dome.name = Overdrive Dome
|
||||
block.block-forge.name = Block Forge
|
||||
block.block-loader.name = Block Loader
|
||||
block.block-unloader.name = Block Unloader
|
||||
block.interplanetary-accelerator.name = Interplanetary Accelerator
|
||||
|
||||
block.switch.name = Switch
|
||||
block.micro-processor.name = Micro Processor
|
||||
@@ -1275,11 +1277,13 @@ item.spore-pod.description = Used for conversion into oil, explosives and fuel.
|
||||
item.spore-pod.details = Spores. Likely a synthetic life form. Emit gases toxic to other biological life. Extremely invasive. Highly flammable in certain conditions.
|
||||
item.blast-compound.description = Used in bombs and explosive ammunition.
|
||||
item.pyratite.description = Used in incendiary weapons and combustion-fueled generators.
|
||||
|
||||
liquid.water.description = Used for cooling machines and waste processing.
|
||||
liquid.slag.description = Refined in separators into constituent metals, or sprayed at enemies as a weapon.
|
||||
liquid.oil.description = Used in advanced material production and as incendiary ammunition.
|
||||
liquid.cryofluid.description = Used as coolant in reactors, turrets and factories.
|
||||
|
||||
block.resupply-point.description = Resupplies nearby units with copper ammunition. Not compatible with units that require battery power.
|
||||
block.armored-conveyor.description = Moves items forward. Does not accept inputs from the sides.
|
||||
block.illuminator.description = Emits light.
|
||||
block.message.description = Stores a message for communication between allies.
|
||||
@@ -1422,6 +1426,7 @@ block.memory-cell.description = Stores information for a logic processor.
|
||||
block.memory-bank.description = Stores information for a logic processor. High capacity.
|
||||
block.logic-display.description = Displays arbitrary graphics from a logic processor.
|
||||
block.large-logic-display.description = Displays arbitrary graphics from a logic processor.
|
||||
block.interplanetary-accelerator.description = A massive electromagnetic railgun tower. Accelerates cores to escape velocity for interplanetary deployment.
|
||||
|
||||
unit.dagger.description = Fires standard bullets at all nearby enemies.
|
||||
unit.mace.description = Fires streams of flame at all nearby enemies.
|
||||
@@ -1449,7 +1454,7 @@ unit.mega.description = Automatically repairs damaged structures. Capable of car
|
||||
unit.quad.description = Drops large bombs on ground targets, repairing allied structures and damaging enemies. Capable of carrying medium-sized ground units.
|
||||
unit.oct.description = Protects nearby allies with its regenerating shield. Capable of carrying most ground units.
|
||||
unit.risso.description = Fires a barrage of missiles and bullets at all nearby enemies.
|
||||
unit.minke.description = Fires incendiary shells and standard bullets at nearby ground targets.
|
||||
unit.minke.description = Fires shells and standard bullets at nearby ground targets.
|
||||
unit.bryde.description = Fires long-range artillery shells and missiles at enemies.
|
||||
unit.sei.description = Fires a barrage of missiles and armor-piercing bullets at enemies.
|
||||
unit.omura.description = Fires a long-range piercing railgun bolt at enemies. Constructs flare units.
|
||||
|
||||
@@ -17,11 +17,14 @@ linkfail = Не удалось открыть ссылку!\nURL-адрес бы
|
||||
screenshot = Скриншот сохранён в {0}
|
||||
screenshot.invalid = Карта слишком большая, возможно, не хватает памяти для скриншота.
|
||||
gameover = Игра окончена
|
||||
gameover.disconnect = Отключение
|
||||
gameover.pvp = [accent]{0}[] команда победила!
|
||||
gameover.waiting = [accent]Ожидание следующей карты...
|
||||
highscore = [accent]Новый рекорд!
|
||||
copied = Скопировано.
|
||||
indev.popup = [accent]v6[] находится на стадии [accent]beta[].\n[lightgray]Это означает следующее:[]\n[scarlet]- Кампания не завершена[]\n- Звуки и музыка не готовы/отсутствуют\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]GitHub[].
|
||||
indev.popup = [accent]v6[] находится на стадии [accent]beta[].\n[lightgray]Это означает следующее:[]\n[scarlet]- Кампания не завершена[]\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]GitHub[].
|
||||
indev.notready = Эта часть игры ещё не готова
|
||||
indev.campaign = [accent]Вы достигли конца кампании![]\n\nЭто всё что предоставляет контент. Межпланетные путешествия будут добавлены в будущих обновлениях.
|
||||
|
||||
load.sound = Звуки
|
||||
load.map = Карты
|
||||
@@ -57,6 +60,7 @@ schematic.rename = Переименовать схему
|
||||
schematic.info = {0}x{1}, {2} блоков
|
||||
schematic.disabled = [scarlet]Схемы отключены[]\nНа этой [accent]карте[] или [accent]сервере запрещено использование схем.
|
||||
|
||||
stats = Статистика
|
||||
stat.wave = Волн отражено:[accent] {0}
|
||||
stat.enemiesDestroyed = Врагов уничтожено:[accent] {0}
|
||||
stat.built = Строений построено:[accent] {0}
|
||||
@@ -107,7 +111,7 @@ mods.guide = Руководство по модам
|
||||
mods.report = Доложить об ошибке
|
||||
mods.openfolder = Открыть папку с модификациями
|
||||
mods.reload = Перезагрузить
|
||||
mods.reloadexit = Игра будет закрыта для перезагрузки модов.
|
||||
mods.reloadexit = Игра будет закрыта для перезагрузки модификаций.
|
||||
mod.display = [gray]Модификация:[orange] {0}
|
||||
mod.enabled = [lightgray]Включён
|
||||
mod.disabled = [scarlet]Выключен
|
||||
@@ -290,6 +294,7 @@ cancelbuilding = [accent][[{0}][] для очистки плана
|
||||
selectschematic = [accent][[{0}][] выделить и скопировать
|
||||
pausebuilding = [accent][[{0}][] для приостановки строительства
|
||||
resumebuilding = [scarlet][[{0}][] для продолжения строительства
|
||||
showui = Интерфейс скрыт.\nНажмите [accent][[{0}][] для отображения интерфейса.
|
||||
wave = [accent]Волна {0}
|
||||
wave.cap = [accent]Волна {0}/{1}
|
||||
wave.waiting = [lightgray]Волна через {0}
|
||||
@@ -297,6 +302,8 @@ wave.waveInProgress = [lightgray]Волна продолжается
|
||||
waiting = [lightgray]Ожидание…
|
||||
waiting.players = Ожидание игроков…
|
||||
wave.enemies = [lightgray]Враги: {0}
|
||||
wave.enemycores = [lightgray]Вражеских ядер: [accent]{0}
|
||||
wave.enemycore = [accent]{0}[lightgray] вражеское ядро
|
||||
wave.enemy = [lightgray]Остался {0} враг
|
||||
wave.guardianwarn = Волн до прибытия Стража: [accent]{0}[].
|
||||
wave.guardianwarn.one = [accent]{0}[] волна до прибытия Стража.
|
||||
@@ -486,8 +493,8 @@ complete = [lightgray]Необходимо:
|
||||
requirement.wave = Достигните {0} волны в зоне {1}
|
||||
requirement.core = Уничтожьте вражеское ядро в зоне {0}
|
||||
requirement.research = Исследуйте {0}
|
||||
requirement.produce = Произведите {0}
|
||||
requirement.capture = Захватите {0}
|
||||
bestwave = [lightgray]Лучшая волна: {0}
|
||||
launch.text = Высадка
|
||||
research.multiplayer = Только хост может исследовать предметы.
|
||||
uncover = Раскрыть
|
||||
@@ -498,6 +505,7 @@ loadout = Груз
|
||||
resources = Ресурсы
|
||||
bannedblocks = Запрещённые блоки
|
||||
addall = Добавить всё
|
||||
launch.from = Запуск из: [accent]{0}
|
||||
launch.destination = Место назначения: {0}
|
||||
configure.invalid = Количество должно быть числом между 0 и {0}.
|
||||
zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована.
|
||||
@@ -529,19 +537,36 @@ weather.fog.name = Туман
|
||||
sectors.unexplored = [lightgray]Не исследовано
|
||||
sectors.resources = Ресурсы:
|
||||
sectors.production = Производит:
|
||||
sectors.export = Экспорт:
|
||||
sectors.time = Время:
|
||||
sectors.threat = Угроза:
|
||||
sectors.wave = Волна:
|
||||
sectors.stored = Накоплено:
|
||||
sectors.resume = Продолжить
|
||||
sectors.launch = Высадка
|
||||
sectors.select = Выбор
|
||||
sectors.nonelaunch = [lightgray]нет (солнце)
|
||||
sectors.rename = Переименовать сектор
|
||||
|
||||
sector.curcapture = Сектор захвачен
|
||||
sector.missingresources = [scarlet]Недостаточно ресурсов для высадки
|
||||
sector.attacked = Сектор [accent]{0}[white] атакован!
|
||||
sector.lost = Сектор [accent]{0}[white] потерян!
|
||||
#note: the missing space in the line below is intentional (недостающий пробел управляется кодом)
|
||||
sector.captured = Сектор [accent]{0}[white]захвачен!
|
||||
|
||||
threat.low = Низкая
|
||||
threat.medium = Средняя
|
||||
threat.high = Высокая
|
||||
threat.extreme = Экстремальная
|
||||
threat.eradication = Истребляющая
|
||||
|
||||
planets = Планеты
|
||||
|
||||
planet.serpulo.name = Серпуло
|
||||
#TODO better name
|
||||
planet.sun.name = Солнце
|
||||
|
||||
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
|
||||
sector.impact0078.name = Крушение 0078
|
||||
sector.groundZero.name = Отправная точка
|
||||
sector.craters.name = Кратеры
|
||||
sector.frozenForest.name = Ледяной лес
|
||||
@@ -553,10 +578,10 @@ sector.overgrowth.name = Заросли
|
||||
sector.tarFields.name = Дегтярные поля
|
||||
sector.saltFlats.name = Соляные равнины
|
||||
sector.fungalPass.name = Грибной перевал
|
||||
|
||||
#unused
|
||||
#sector.impact0078.name = Воздействие 0078
|
||||
#sector.crags.name = Скалы
|
||||
sector.biomassFacility.name = Центр исследования биомассы
|
||||
sector.windsweptIslands.name = Штормовой архипелаг
|
||||
sector.extractionOutpost.name = Добывающая база
|
||||
sector.planetaryTerminal.name = Планетарный пусковой терминал
|
||||
|
||||
sector.groundZero.description = Оптимальная локация для повторных игр. Низкая вражеская угроза. Немного ресурсов.\nСоберите как можно больше свинца и меди.\nДвигайтесь дальше.
|
||||
sector.frozenForest.description = Даже здесь, ближе к горам, споры распространились. Холодные температуры не могут сдерживать их вечно.\n\nНачните вкладываться в энергию. Постройте генераторы внутреннего сгорания. Научитесь пользоваться регенератором.
|
||||
@@ -568,7 +593,7 @@ sector.overgrowth.description = Эта заросшая область нахо
|
||||
sector.tarFields.description = Окраина зоны нефтедобычи, между горами и пустыней. Один из немногих районов с полезными запасами дёгтя.\nХотя эта область заброшенна, в ней поблизости присутствуют некоторые опасные вражеские силы. Не стоит их недооценивать.\n\n[lightgray]Исследуйте технологию переработки нефти, если возможно.
|
||||
sector.desolateRift.description = Чрезвычайно опасная зона. Обилие ресурсов, но мало места. Высокий риск разрушения. Эвакуироваться нужно как можно скорее. Не расслабляйтесь во время больших перерывов между вражескими атаками.
|
||||
sector.nuclearComplex.description = Бывший завод по производству и переработке тория, превращенный в руины.\n[lightgray]Исследуйте торий и варианты его многочисленного применения.\n\nВраг присутствует здесь в большом числе, постоянно разведывая нападающих.
|
||||
sector.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Камикадзе». Достаньте до обоих ядер.
|
||||
sector.fungalPass.description = Переходная область между высокими горами и более низкими, покрытыми спорами землями. Здесь расположена небольшая разведывательная база противника.\nУничтожьте ее.\nИспользуйте единицы «Кинжал» и «Ползун». Достаньте до обоих ядер.
|
||||
|
||||
settings.language = Язык
|
||||
settings.data = Игровые данные
|
||||
@@ -628,6 +653,8 @@ stat.memorycapacity = Размер памяти
|
||||
stat.basepowergeneration = Базовая генерация энергии
|
||||
stat.productiontime = Время производства
|
||||
stat.repairtime = Время полной регенерации
|
||||
stat.weapons = Орудия
|
||||
stat.bullet = Снаряд
|
||||
stat.speedincrease = Увеличение скорости
|
||||
stat.range = Радиус действия
|
||||
stat.drilltier = Бурит
|
||||
@@ -697,12 +724,14 @@ units.processorcontrol = [lightgray]Управляется процессоро
|
||||
bullet.damage = [stat]{0}[lightgray] урона
|
||||
bullet.splashdamage = [stat]{0}[lightgray] урона в радиусе ~[stat] {1}[lightgray] блоков
|
||||
bullet.incendiary = [stat]зажигательный
|
||||
bullet.sapping = [stat]истощающий
|
||||
bullet.homing = [stat]самонаводящийся
|
||||
bullet.shock = [stat]шоковый
|
||||
bullet.frag = [stat]осколочный
|
||||
bullet.knockback = [stat]{0}[lightgray] отдачи
|
||||
bullet.pierce = [stat]{0}[lightgray]x пробитие
|
||||
bullet.infinitepierce = [stat]бесконечное пробитие
|
||||
bullet.healpercent = [stat]{0}[lightgray]% лечение
|
||||
bullet.freezing = [stat]замораживающий
|
||||
bullet.tarred = [stat]замедляющий, горючий
|
||||
bullet.multiplier = [stat]{0}[lightgray]x множитель боеприпасов
|
||||
@@ -922,6 +951,7 @@ content.item.name = Предметы
|
||||
content.liquid.name = Жидкости
|
||||
content.unit.name = Боевые единицы
|
||||
content.block.name = Блоки
|
||||
content.sector.name = Секторы
|
||||
|
||||
item.copper.name = Медь
|
||||
item.lead.name = Свинец
|
||||
@@ -1079,7 +1109,6 @@ block.conveyor.name = Конвейер
|
||||
block.titanium-conveyor.name = Титановый конвейер
|
||||
block.plastanium-conveyor.name = Пластановый конвейер
|
||||
block.armored-conveyor.name = Бронированный конвейер
|
||||
block.armored-conveyor.description = Перемещает предметы вперёд. Не принимает вход по бокам.
|
||||
block.junction.name = Перекрёсток
|
||||
block.router.name = Маршрутизатор
|
||||
block.distributor.name = Распределитель
|
||||
@@ -1087,7 +1116,6 @@ block.sorter.name = Сортировщик
|
||||
block.inverted-sorter.name = Инвертированный сортировщик
|
||||
block.message.name = Сообщение
|
||||
block.illuminator.name = Осветитель
|
||||
block.illuminator.description = Излучает свет.
|
||||
block.overflow-gate.name = Избыточный затвор
|
||||
block.underflow-gate.name = Избыточный шлюз
|
||||
block.silicon-smelter.name = Кремниевая плавильня
|
||||
@@ -1187,6 +1215,7 @@ block.overdrive-dome.name = Сверхприводный купол
|
||||
block.block-forge.name = Завод блоков
|
||||
block.block-loader.name = Загрузчик блоков
|
||||
block.block-unloader.name = Разгрузчик блоков
|
||||
block.interplanetary-accelerator.name = Межпланетный ускоритель
|
||||
|
||||
block.switch.name = Переключатель
|
||||
block.micro-processor.name = Микропроцессор
|
||||
@@ -1238,7 +1267,7 @@ item.coal.description = Используется как топливо и в п
|
||||
item.coal.details = Похоже, что это окаменевшее растительное вещество, образовавшееся задолго до Посева.
|
||||
item.titanium.description = Широко используется в транспортировке жидкостей, бурах и авиации.
|
||||
item.thorium.description = Используется в прочных постройках и как ядерного топлива.
|
||||
item.scrap.description = Может быть расплавлен и переработан в другие материалы.
|
||||
item.scrap.description = Используется в плавильнях и измельчителях для получения других материалов.
|
||||
item.scrap.details = Остататки старых построек и единиц.
|
||||
item.silicon.description = Используется в солнечных панелях, сложной электронике и самонаводящихся боеприпасах для турелей.
|
||||
item.plastanium.description = Используется в продвинутой авиации, изоляции и осколочных боеприпасах.
|
||||
@@ -1248,11 +1277,15 @@ item.spore-pod.description = Используется для переработ
|
||||
item.spore-pod.details = Споры. Похоже на синтетическую форму жизни. Выделяет газы, токсичные для других биологических форм жизни. Чрезвычайно инвазивны. Легко воспламеняется при определенных условиях.
|
||||
item.blast-compound.description = Используется в бомбах и взрывчатых веществах.
|
||||
item.pyratite.description = Используется в зажигательном оружии и твердотопливных генераторах.
|
||||
|
||||
liquid.water.description = Используется для охлаждения машин и переработки отходов.
|
||||
liquid.slag.description = Может быть переработан в разделителе на составляющие металлы или распылён на врагов в качестве оружия.
|
||||
liquid.oil.description = Используется в производстве продвинутых материалов и как зажигательный боеприпас.
|
||||
liquid.cryofluid.description = Используется в качестве охлаждающей жидкости для реакторов, турелей и фабрик.
|
||||
|
||||
block.resupply-point.description = Снаряжает медными боеприпасами ближайщие боевые единицы. Не совместим с единицами, требующими питания от батареи.
|
||||
block.armored-conveyor.description = Перемещает предметы вперёд. Не принимает вход по бокам.
|
||||
block.illuminator.description = Излучает свет.
|
||||
block.message.description = Сохраняет сообщение для связи между союзниками.
|
||||
block.graphite-press.description = Сжимает куски угля в листы графита.
|
||||
block.multi-press.description = Сжимает куски угля в листы графита. Требуется вода в качестве охлаждающей жидкости.
|
||||
@@ -1393,6 +1426,7 @@ block.memory-cell.description = Хранит информацию для лог
|
||||
block.memory-bank.description = Хранит информацию для логического процессора. Большая ёмкость.
|
||||
block.logic-display.description = Отображает произвольную графику из логического процессора.
|
||||
block.large-logic-display.description = Отображает произвольную графику из логического процессора.
|
||||
block.interplanetary-accelerator.description = Массивный рельсотронный ускоритель. Разгоняет ядро до второй космической скорости для межпланетных размещений.
|
||||
|
||||
unit.dagger.description = Стреляет стандартными пулями по всем врагам поблизости.
|
||||
unit.mace.description = Стреляет потоками огня по всем врагам поблизости.
|
||||
|
||||
@@ -17,10 +17,12 @@ linkfail = Не вдалося перейти за посиланням!\nURL-а
|
||||
screenshot = Зняток мапи збережено до {0}
|
||||
screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи.
|
||||
gameover = Гра завершена
|
||||
gameover.disconnect = Від’єднатися
|
||||
gameover.pvp = [accent]{0}[] команда перемогла!
|
||||
gameover.waiting = [accent]Очікуємо наступно мапу…
|
||||
highscore = [accent]Новий рекорд!
|
||||
copied = Скопійовано.
|
||||
indev.popup = Наразі [accent]6.0[] знаходиться у стадії [accent]бета-тестування[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення кампанії;\n- Звуки і музика відсутні або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord.
|
||||
indev.popup = Наразі [accent]6.0[] знаходиться у стадії [accent]бета-тестування[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення кампанії;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord.
|
||||
indev.notready = Ця частина гри ще не готова.
|
||||
|
||||
load.sound = Звуки
|
||||
@@ -57,6 +59,7 @@ schematic.rename = Перейменувати схему
|
||||
schematic.info = {0}x{1}, блоків: {2}
|
||||
schematic.disabled = [scarlet]Схеми вимкнені[]\nВам не дозволяється використовувати схеми на цій [accent]мапі[] чи [accent]сервері.
|
||||
|
||||
stats = Статистика
|
||||
stat.wave = Хвиль відбито:[accent] {0}
|
||||
stat.enemiesDestroyed = Противників знищено:[accent] {0}
|
||||
stat.built = Будівель збудовано:[accent] {0}
|
||||
@@ -171,7 +174,7 @@ server.kicked.customClient = Цей сервер не підтримує кор
|
||||
server.kicked.gameover = Гру завершено!
|
||||
server.kicked.serverRestarting = Сервер перезавантажується
|
||||
server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[]
|
||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер.
|
||||
host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[].\nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер.
|
||||
join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip.
|
||||
hostserver = Запустити багатокористувацький сервер
|
||||
invitefriends = Запросити друзів
|
||||
@@ -189,6 +192,10 @@ servers.local = Локальні сервери
|
||||
servers.remote = Віддалені сервери
|
||||
servers.global = Глобальні сервери
|
||||
|
||||
servers.showhidden = Показати приховані сервери
|
||||
server.shown = Показано
|
||||
server.hidden = Приховано
|
||||
|
||||
trace = Стежити за гравцем
|
||||
trace.playername = Ім’я гравця: [accent]{0}
|
||||
trace.ip = IP: [accent]{0}
|
||||
@@ -267,6 +274,9 @@ cancel = Скасувати
|
||||
openlink = Перейти за посиланням
|
||||
copylink = Скопіювати посилання
|
||||
back = Назад
|
||||
crash.export = Експортувати аварійні звіти
|
||||
crash.none = Аварійних звітів не знайдено
|
||||
crash.exported = Аварійні звіти експортовано
|
||||
data.export = Вивантажити дані
|
||||
data.import = Завантажити дані
|
||||
data.openfolder = Відчинити теку з даними
|
||||
@@ -283,6 +293,7 @@ cancelbuilding = [accent][[{0}][], щоб очистити план
|
||||
selectschematic = [accent][[{0}][], щоби вибрати та скопіювати
|
||||
pausebuilding = [accent][[{0}][], щоби призупинити будування
|
||||
resumebuilding = [scarlet][[{0}][], щоби продовжити будування
|
||||
showui = Користувацький інтерфейс приховано.\nНатисніть [accent][[{0}][], щоби показати його знову.
|
||||
wave = [accent]Хвиля {0}
|
||||
wave.cap = [accent]Хвиля {0}/{1}
|
||||
wave.waiting = [lightgray]Наступна хвиля\nчерез {0}
|
||||
@@ -290,6 +301,8 @@ wave.waveInProgress = [lightgray]Хвиля триває
|
||||
waiting = [lightgray]Очікування…
|
||||
waiting.players = Очікування гравців…
|
||||
wave.enemies = Залишилося\n[lightgray]{0} противник.
|
||||
wave.enemycores = Ворожих ядер: [accent]{0}[lightgray]
|
||||
wave.enemycore = [accent]{0}[lightgray] вороже ядро
|
||||
wave.enemy = Залишився\n[lightgray]{0} противник
|
||||
wave.guardianwarn = Хвиль до появи Вартового: [accent]{0}[] .
|
||||
wave.guardianwarn.one = Вартовий з’явиться через [accent]{0}[] хвилю.
|
||||
@@ -350,6 +363,7 @@ waves.invalid = Недійсні хвилі в буфері обміну.
|
||||
waves.copied = Хвилі скопійовані.
|
||||
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
||||
|
||||
#these are intentionally in lower case
|
||||
wavemode.counts = кількість
|
||||
wavemode.totals = усього
|
||||
wavemode.health = здоров’я
|
||||
@@ -462,6 +476,8 @@ load = Завантажити
|
||||
save = Зберегти
|
||||
fps = FPS: {0}
|
||||
ping = Затримка: {0} мс
|
||||
memory = Mem: {0}мб
|
||||
memory2 = Mem:\n {0}мб +\n {1}мб
|
||||
language.restart = Перезапустіть свою гру, щоби налаштування мови набули чинності.
|
||||
settings = Налаштування
|
||||
tutorial = Навчання
|
||||
@@ -475,8 +491,9 @@ locked = Заблоковано
|
||||
complete = [lightgray]Необхідно:
|
||||
requirement.wave = Досягніть хвилі {0} у зоні «{1}»
|
||||
requirement.core = Знищте вороже ядро в зоні «{0}»
|
||||
requirement.research = Research {0}
|
||||
requirement.capture = Capture {0}
|
||||
requirement.research = Дослідіть {0}
|
||||
requirement.produce = Виробіть {0}
|
||||
requirement.capture = Захопіть {0}
|
||||
bestwave = [lightgray]Найкраща хвиля: {0}
|
||||
launch.text = Запуск
|
||||
research.multiplayer = Лише власник сервера має змогу досліджувати предмети.
|
||||
@@ -497,7 +514,7 @@ zone.objective = [lightgray]Мета: [accent]{0}
|
||||
zone.objective.survival = вижити
|
||||
zone.objective.attack = знищити вороже ядро
|
||||
add = Додати…
|
||||
boss.health = Здоров’я босу
|
||||
boss.health = Здоров’я Вартового
|
||||
|
||||
connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0}
|
||||
error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса?
|
||||
@@ -519,17 +536,37 @@ weather.fog.name = Туман
|
||||
sectors.unexplored = [lightgray]Не досліджено
|
||||
sectors.resources = Ресурси:
|
||||
sectors.production = Виробництво:
|
||||
sectors.export = Експортування:
|
||||
sectors.time = Час:
|
||||
sectors.threat = Загроза:
|
||||
sectors.wave = Хвиля:
|
||||
sectors.stored = Зберігає:
|
||||
sectors.resume = Продовжити
|
||||
sectors.launch = Запустити
|
||||
sectors.select = Вибрати
|
||||
sectors.nonelaunch = [lightgray]нічого (сонце)
|
||||
sectors.rename = Перейменування сектора
|
||||
sector.curcapture = Сектор захоплено
|
||||
sector.missingresources = [scarlet]Недостатньо ресурсів в ядрі
|
||||
sector.attacked = Сектор [accent]{0}[white] під атакою!
|
||||
sector.lost = Сектор [accent]{0}[white] втрачено!
|
||||
#note: the missing space in the line below is intentional
|
||||
sector.captured = Сектор [accent]{0}[white]захоплено!
|
||||
|
||||
threat.low = низька
|
||||
threat.medium = середня
|
||||
threat.high = висока
|
||||
threat.extreme = екстремальна
|
||||
threat.eradication = викорінювальна
|
||||
|
||||
planets = Планети
|
||||
|
||||
planet.serpulo.name = Cерпуло
|
||||
#TODO better name
|
||||
planet.sun.name = Сонце
|
||||
|
||||
#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway
|
||||
sector.impact0078.name = Аварійне приземлення 0078
|
||||
sector.groundZero.name = Відправний пункт
|
||||
sector.craters.name = Кратери
|
||||
sector.frozenForest.name = Крижаний ліс
|
||||
@@ -541,6 +578,12 @@ sector.overgrowth.name = Зарості
|
||||
sector.tarFields.name = Дьогтьові поля
|
||||
sector.saltFlats.name = Соляні рівнини
|
||||
sector.fungalPass.name = Грибний перевал
|
||||
sector.biomassFacility.name = Центр дослідження синтезу біомаси
|
||||
sector.windsweptIslands.name = Вітряні острови
|
||||
sector.extractionOutpost.name = Видобувна застава
|
||||
|
||||
#unused
|
||||
#sector.crags.name = Crags
|
||||
|
||||
sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗбирайте якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі.
|
||||
sector.frozenForest.description = Спори поширилися навіть тут, ближче до гір. Холодна температура не може стримувати їх завжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами.
|
||||
@@ -582,8 +625,9 @@ error.title = [crimson]Виникла помилка
|
||||
error.crashtitle = Виникла помилка
|
||||
unit.nobuild = [scarlet]Ця одиниця не може будувати
|
||||
lastaccessed = [lightgray]Остання зміна від {0}
|
||||
block.unknown = [lightgray]ШО ЗА???
|
||||
block.unknown = [lightgray]???
|
||||
|
||||
stat.description = Призначення
|
||||
stat.input = Ввід
|
||||
stat.output = Вивід
|
||||
stat.booster = Прискорювач
|
||||
@@ -611,6 +655,8 @@ stat.memorycapacity = Ємність пам’яті
|
||||
stat.basepowergeneration = Базова генерація енергії
|
||||
stat.productiontime = Час виробництва
|
||||
stat.repairtime = Час повного відновлення блоку
|
||||
stat.weapons = Зброя
|
||||
stat.bullet = Кулі
|
||||
stat.speedincrease = Збільшення швидкості
|
||||
stat.range = Радіус дії
|
||||
stat.drilltier = Видобуває
|
||||
@@ -623,7 +669,7 @@ stat.maxconsecutive = Максимальна послідовність
|
||||
stat.buildcost = Вартість будування
|
||||
stat.inaccuracy = Розкид
|
||||
stat.shots = Постріли
|
||||
stat.reload = Постріли/секунду
|
||||
stat.reload = Постріли за сек.
|
||||
stat.ammo = Боєприпаси
|
||||
stat.shieldhealth = Міцність щита
|
||||
stat.cooldowntime = Тривалість охолодження
|
||||
@@ -634,7 +680,7 @@ stat.lightningdamage = Шкода від удару блискавки
|
||||
stat.flammability = Займистість
|
||||
stat.radioactivity = Радіоактивність
|
||||
stat.heatcapacity = Теплоємність
|
||||
stat.viscosity = В'язкість
|
||||
stat.viscosity = В’язкість
|
||||
stat.temperature = Температура
|
||||
stat.speed = Швидкість
|
||||
stat.buildspeed = Швидкість будування
|
||||
@@ -651,6 +697,7 @@ ability.repairfield = Ремонтувальне поле
|
||||
ability.statusfield = Поле підсилення
|
||||
ability.unitspawn = Завод одиниць «{0}»
|
||||
ability.shieldregenfield = Поле, що відновлює щити
|
||||
ability.movelightning = Блискавки при русі
|
||||
|
||||
bar.drilltierreq = Потребується кращий бур
|
||||
bar.noresources = Бракує ресурсів
|
||||
@@ -679,12 +726,14 @@ units.processorcontrol = [lightgray]Керується процесором
|
||||
bullet.damage = [stat]{0}[lightgray] шкода
|
||||
bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] плиток
|
||||
bullet.incendiary = [stat]запальний
|
||||
bullet.sapping = [stat]виснажує
|
||||
bullet.homing = [stat]самонаведення
|
||||
bullet.shock = [stat]шок
|
||||
bullet.frag = [stat]шкода по ділянці
|
||||
bullet.knockback = [stat]{0}[lightgray] відкидання
|
||||
bullet.pierce = [stat]{0}[lightgray]x пробиття
|
||||
bullet.infinitepierce = [stat]пробиття
|
||||
bullet.healpercent = [stat]{0}[lightgray]% лікування
|
||||
bullet.freezing = [stat]заморожування
|
||||
bullet.tarred = [stat]дьогтьовий
|
||||
bullet.multiplier = [stat]{0}[lightgray]x патронів
|
||||
@@ -709,6 +758,7 @@ unit.items = предм.
|
||||
unit.thousands = тис
|
||||
unit.millions = млн
|
||||
unit.billions = млрд
|
||||
category.purpose = Призначення
|
||||
category.general = Загальне
|
||||
category.power = Енергія
|
||||
category.liquids = Рідини
|
||||
@@ -722,6 +772,7 @@ setting.blockreplace.name = Пропонування щодо автоматич
|
||||
setting.linear.name = Лінійна фільтрація
|
||||
setting.hints.name = Підказки
|
||||
setting.flow.name = Показувати темп швидкості ресурсів
|
||||
setting.backgroundpause.name = Пауза при згортанн
|
||||
setting.buildautopause.name = Автоматичне призупинення будування
|
||||
setting.animatedwater.name = Анімаційні рідини
|
||||
setting.animatedshields.name = Анімаційні щити
|
||||
@@ -916,7 +967,7 @@ item.surge-alloy.name = Кінетичний сплав
|
||||
item.spore-pod.name = Споровий стручок
|
||||
item.sand.name = Пісок
|
||||
item.blast-compound.name = Вибухова суміш
|
||||
item.pyratite.name = Піротит
|
||||
item.pyratite.name = Пиротит
|
||||
item.metaglass.name = Метаскло
|
||||
item.scrap.name = Брухт
|
||||
liquid.water.name = Вода
|
||||
@@ -935,7 +986,7 @@ unit.atrax.name = Атракс
|
||||
unit.spiroct.name = Павучник
|
||||
unit.arkyid.name = Аркиїд
|
||||
unit.toxopid.name = Отруйник
|
||||
unit.flare.name = Фальшфеєр
|
||||
unit.flare.name = Фальшфейєр
|
||||
unit.horizon.name = Горизонт
|
||||
unit.zenith.name = Зеніт
|
||||
unit.antumbra.name = Тіньовик
|
||||
@@ -946,10 +997,10 @@ unit.mega.name = Мега
|
||||
unit.quad.name = Квад
|
||||
unit.oct.name = Окт
|
||||
unit.risso.name = Грампус
|
||||
unit.minke.name = Смугач малий
|
||||
unit.bryde.name = Смугач Брайда
|
||||
unit.sei.name = Смугач Сейвал
|
||||
unit.omura.name = Смугач Омури
|
||||
unit.minke.name = Смугач
|
||||
unit.bryde.name = Брайд
|
||||
unit.sei.name = Сейвал
|
||||
unit.omura.name = Омура
|
||||
unit.alpha.name = Альфа
|
||||
unit.beta.name = Бета
|
||||
unit.gamma.name = Гамма
|
||||
@@ -989,7 +1040,7 @@ block.thruster.name = Штовхач
|
||||
block.kiln.name = Піч
|
||||
block.graphite-press.name = Графітний прес
|
||||
block.multi-press.name = Мультипрес
|
||||
block.constructing = {0}\n[lightgray](В процесі)
|
||||
block.constructing = {0}\n[lightgray](У процесі)
|
||||
block.spawn.name = Місце появи противника
|
||||
block.core-shard.name = Ядро «Уламок»
|
||||
block.core-foundation.name = Ядро «Штаб»
|
||||
@@ -1059,7 +1110,6 @@ block.conveyor.name = Конвеєр
|
||||
block.titanium-conveyor.name = Титановий конвеєр
|
||||
block.plastanium-conveyor.name = Пластанієвий конвеєр
|
||||
block.armored-conveyor.name = Броньований конвеєр
|
||||
block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок.
|
||||
block.junction.name = Перехрестя
|
||||
block.router.name = Маршрутизатор
|
||||
block.distributor.name = Розподілювач
|
||||
@@ -1067,7 +1117,6 @@ block.sorter.name = Сортувальник
|
||||
block.inverted-sorter.name = Зворотній сортувальник
|
||||
block.message.name = Повідомлення
|
||||
block.illuminator.name = Освітлювач
|
||||
block.illuminator.description = Невелике, компактне, джерело світла, яку можна налаштувати. Для роботи потребує енергії.
|
||||
block.overflow-gate.name = Надмірний затвор
|
||||
block.underflow-gate.name = Недостатній затвор
|
||||
block.silicon-smelter.name = Кремнієвий плавильний завод
|
||||
@@ -1112,7 +1161,7 @@ block.ripple.name = Ряб
|
||||
block.phase-conveyor.name = Фазовий конвеєр
|
||||
block.bridge-conveyor.name = Мостовий конвеєр
|
||||
block.plastanium-compressor.name = Пластанієвий компресор
|
||||
block.pyratite-mixer.name = Змішувач піротита
|
||||
block.pyratite-mixer.name = Змішувач пиротита
|
||||
block.blast-mixer.name = Змішувач вибухонебезпечного з’єднання
|
||||
block.solar-panel.name = Сонячна панель
|
||||
block.solar-panel-large.name = Велика сонячна панель
|
||||
@@ -1162,7 +1211,11 @@ block.payload-conveyor.name = Вантажний конвеєр
|
||||
block.payload-router.name = Розвантажувальний маршрутизатор
|
||||
block.disassembler.name = Розбирач
|
||||
block.silicon-crucible.name = Кремнієвий тигель
|
||||
block.overdrive-dome.name = Величний Прискорювач
|
||||
block.overdrive-dome.name = Великий прискорювач
|
||||
#experimental, may be removed
|
||||
block.block-forge.name = Блок-кузня
|
||||
block.block-loader.name = Блок-завантажувач
|
||||
block.block-unloader.name = Блок-вивантажувач
|
||||
|
||||
block.switch.name = Перемикач
|
||||
block.micro-processor.name = Мікропроцесор
|
||||
@@ -1203,136 +1256,205 @@ tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахи
|
||||
tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді.
|
||||
tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску.
|
||||
|
||||
item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків.
|
||||
item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин.
|
||||
item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини.
|
||||
item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент.
|
||||
item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів.
|
||||
item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів.
|
||||
item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків.
|
||||
item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива.
|
||||
item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів.
|
||||
item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт.
|
||||
item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах.
|
||||
item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення.
|
||||
item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями.
|
||||
item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо.
|
||||
item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується.
|
||||
item.pyratite.description = Надзвичайно легкозаймиста речовина, що використовується в запальній зброї.
|
||||
liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів.
|
||||
liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя.
|
||||
liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля.
|
||||
liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує.
|
||||
item.copper.description = Використовується у всіх типах блоків і боєприпасах.
|
||||
item.copper.details = Мідь. Напрочуд багато жил цієї руди на Серпуло. За своєю структурою слабка, якщо не зміцнена.
|
||||
item.lead.description = Широко використовується в електроніці та в транспортуванні рідин.
|
||||
item.lead.details = Сплав. Інертний. Широко використовується в акумуляторах.\nПримітка. Мабуть, токсичний для біологічних форм життя. Не те щоб тут залишилося багато...
|
||||
item.metaglass.description = Використовується для розподілу чи зберігання рідини.
|
||||
item.graphite.description = Використовується для боєприпасів та електричних компонентів.
|
||||
item.sand.description = Використовується для виробництва інших удосконалених матеріалів.
|
||||
item.coal.description = Використовується для виробництва палива і вдосноналених матеріалів.
|
||||
item.coal.details = Виглядає скам’янілою рослинною речовиною, утвореною задовго до Сівби.
|
||||
item.titanium.description = Використовується в транспортуванні рідин, бурів та авіації.
|
||||
item.thorium.description = Використовується в міцних конструкціях і як ядерне паливо.
|
||||
item.scrap.description = Використовується у Плавильнях і Подрібнювачах для переробки в інші матеріали в інші матеріали.
|
||||
item.scrap.details = Залишки старих споруд та підрозділів.
|
||||
item.silicon.description = Використовується в сонячних панелях, складній електроніці та боєприпасах самонаведення для башт.
|
||||
item.plastanium.description = Використовується в передових одиницях та у фрагментованих боєприпасах.
|
||||
item.phase-fabric.description = Використовується в передовій електроніці і технології самовідновлення.
|
||||
item.surge-alloy.description = Використовується в передовій зброї та реактивних захисних конструкціях.
|
||||
item.spore-pod.description = Використовується для перетворення на нафту, вибухівку та паливо.
|
||||
item.spore-pod.details = Спори. Найімовірніше, синтетична форма життя. Виділяють гази, токсичні для іншого біологічного життя. Надзвичайно загарбницька поведінка. Легкозаймисті при певних умовах.
|
||||
item.blast-compound.description = Використовується в бомбах та в розривних боєприпасах.
|
||||
item.pyratite.description = Використовується в запальній зброї і твердопаливних генераторах.
|
||||
liquid.water.description = Використовується для охолодження машин та перероблювання відходів.
|
||||
liquid.slag.description = Переробляється у відокремлювачах у складові метали або розпорошується на ворогів як зброя.
|
||||
liquid.oil.description = Використовується у виробництві передових матеріалів і як запальні боєприпаси.
|
||||
liquid.cryofluid.description = Використовується як теплоносій в реакторах, баштах і заводах.
|
||||
|
||||
block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками.
|
||||
block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту.
|
||||
block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля.
|
||||
block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній.
|
||||
block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії.
|
||||
block.plastanium-compressor.description = Виробляє пластаній із нафти та титану.
|
||||
block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії.
|
||||
block.armored-conveyor.description = Переміщує предмети вперед. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок.
|
||||
block.illuminator.description = Випромінює світло.
|
||||
block.message.description = Зберігає повідомлення для комунікації між союзниками.
|
||||
block.graphite-press.description = Стискає вугілля в графіт.
|
||||
block.multi-press.description = Стискає вугілля в графіт. Потребує воду для охолодження.
|
||||
block.silicon-smelter.description = Синтезує пісок з вугіллям для отримання кремнію.
|
||||
block.kiln.description = Виплавляє пісок та свинець у метаскло.
|
||||
block.plastanium-compressor.description = Виробляє пластаній із нафти і титану.
|
||||
block.phase-weaver.description = Синтезує фазову тканину з торію та піску.
|
||||
block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву.
|
||||
block.cryofluid-mixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання в торієвому реактору.
|
||||
block.blast-mixer.description = Подрібнює і змішує скупчення спор із піротитом для отримання вибухової суміші.
|
||||
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит.
|
||||
block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля».
|
||||
block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали.
|
||||
block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти.
|
||||
block.cryofluid-mixer.description = Змішує воду і подрібнений титан, щоб виробити кріогенну рідину.
|
||||
block.blast-mixer.description = Виробляє вибухову суміш з піратиту і спорових стручків.
|
||||
block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий пиротит.
|
||||
block.melter.description = Розплавляє брухт у шлак.
|
||||
block.separator.description = Відокремлює шлак на його мінеральні компоненти.
|
||||
block.spore-press.description = Стискає спорові стручки для синтезування нафти.
|
||||
block.pulverizer.description = Подрібнює брухт у дрібний пісок.
|
||||
block.coal-centrifuge.description = Нафта перетворюється в шматки вугілля.
|
||||
block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує.
|
||||
block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця.
|
||||
block.power-source.description = Постійно створює енергію. Тільки пісочниця.
|
||||
block.coal-centrifuge.description = Нафта перетворюється у вугілля.
|
||||
block.incinerator.description = Випаровує будь-який предмет або рідину, що отримує.
|
||||
block.power-void.description = Знищує будь-яку під’єднану енергію. Тільки пісочниця.
|
||||
block.power-source.description = Постійно генерує енергію. Тільки пісочниця.
|
||||
block.item-source.description = Постійно створює предмети. Тільки пісочниця.
|
||||
block.item-void.description = Знищує будь-які предмети. Тільки пісочниця.
|
||||
block.liquid-source.description = Постійно створює рідини. Тільки пісочниця.
|
||||
block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця.
|
||||
block.copper-wall.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.
|
||||
block.copper-wall-large.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток.
|
||||
block.titanium-wall.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.
|
||||
block.titanium-wall-large.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.\nЗаймає декілька плиток.
|
||||
block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.
|
||||
block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток.
|
||||
block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників.
|
||||
block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток.
|
||||
block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.
|
||||
block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток.
|
||||
block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.
|
||||
block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток.
|
||||
block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них.
|
||||
block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток.
|
||||
block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності.
|
||||
block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
|
||||
block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності.
|
||||
block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
|
||||
block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника.
|
||||
block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати.
|
||||
block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри.
|
||||
block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності.
|
||||
block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця.
|
||||
block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі.
|
||||
block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток.
|
||||
block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа.
|
||||
block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони.
|
||||
block.router.description = Приймає елементи з одного напрямку та виводить їх до трьох інших напрямків порівну. Корисно для поділу матеріалів від одного джерела до кількох цілей.\n\n[scarlet]Ніколи не використовуйте поруч із входами до механізмів, оскільки вони будуть забиті вихідними предметами.[]
|
||||
block.distributor.description = Поліпшений маршрутизатор. Розділяє предмети до 7 інших напрямків порівну.
|
||||
block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований.
|
||||
block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано.
|
||||
block.item-void.description = Руйнує будь-які предмети. Тільки пісочниця.
|
||||
block.liquid-source.description = Постійно виробляє рідини. Тільки пісочниця.
|
||||
block.liquid-void.description = Випаровує будь-які рідини. Тільки пісочниця.
|
||||
block.copper-wall.description = Захищає споруди від ворожих снарядів.
|
||||
block.copper-wall-large.description = Захищає споруди від ворожих снарядів.
|
||||
block.titanium-wall.description = Захищає споруди від ворожих снарядів.
|
||||
block.titanium-wall-large.description = Захищає споруди від ворожих снарядів.
|
||||
block.plastanium-wall.description = Захищає споруди від ворожих снарядів. Поглинає електричні дуги і лазери. Блокує автоматичні з’єднання енергетичних вузлів.
|
||||
block.plastanium-wall-large.description = Захищає споруди від ворожих снарядів. Поглинає електричні дуги і лазери. Блокує автоматичні з’єднання енергетичних вузлів.
|
||||
block.thorium-wall.description = Захищає споруди від ворожих снарядів.
|
||||
block.thorium-wall-large.description = Захищає споруди від ворожих снарядів.
|
||||
block.phase-wall.description = Захищає споруди від ворожих снарядів, відбиває більшість куль при зіткненні.
|
||||
block.phase-wall-large.description = Захищає споруди від ворожих снарядів, відбиває більшість куль при зіткненні.
|
||||
block.surge-wall.description = Захищає споруди від ворожих снарядів, періодично випускає електричні дуги при зіткненні.
|
||||
block.surge-wall-large.description = Захищає споруди від ворожих снарядів, періодично випускає електричні дуги при зіткненні.
|
||||
block.door.description = Стіна, яку можна відкрити і закрити.
|
||||
block.door-large.description = Стіна, яку можна відкрити і закрити.
|
||||
block.mender.description = Періодично ремонтує блоки в своєму радіусі дії.\nЗа бажанням можна використати кремній задля підвищення радіусу дії й ефективності.
|
||||
block.mend-projector.description = Ремонтує блоки в своєму радіусі дії.\nЗа бажанням можна використати фазову тканину задля підвищення радіусу дії й ефективності.
|
||||
block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням можна використати фазову тканину задля підвищення радіусу дії й ефективності.
|
||||
block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину.
|
||||
block.shock-mine.description = Випускає електричні дуги при контакті з ворогом.
|
||||
block.conveyor.description = Переміщує елементи вперед.
|
||||
block.titanium-conveyor.description = Переміщує предмети швидше, ніж звичайний конвеєр.
|
||||
block.plastanium-conveyor.description = Переміщує предмети партіями. Приймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. Потребує кілька точок завантаження та розвантаження для максимальної пропускної здатності.
|
||||
block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок.
|
||||
block.bridge-conveyor.description = Транспортує предмети через будівлі або місцевість
|
||||
block.phase-conveyor.description = Миттєво транспортує предмети через місцевості або будівлі. Більший діапазон, ніж у мостового конвеєра, але потребує енергії.
|
||||
block.sorter.description = Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться ліворуч та праворуч.
|
||||
block.inverted-sorter.description = Схожий на звичайний сортувальник, але виводить обрані елементи на бокові сторони.
|
||||
block.router.description = Розподіляє елементи, що надходять, порівну на 3 різні напрямки.
|
||||
block.router.details = Необхідне зло. Не використовуйте поруч із входами до механізмів, оскільки вони, входи, будуть забиті вихідними предметами.
|
||||
block.distributor.description = Розділяє предмети до 7 інших напрямків порівну.
|
||||
block.overflow-gate.description = Вивантажує лише ліворуч і праворуч, якщо передній шлях заблокований.
|
||||
block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий і правий шлях заблоковано.
|
||||
block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія.
|
||||
block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання.
|
||||
block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію.
|
||||
block.thermal-pump.description = Найкращий насос.
|
||||
block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами.
|
||||
block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи.
|
||||
block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nНе протікає.
|
||||
block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней.
|
||||
block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків.
|
||||
block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця.
|
||||
block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі.
|
||||
block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток.
|
||||
block.conduit.description = Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами.
|
||||
block.pulse-conduit.description = Пересуває рідини вперед. Швидше транспортує і зберігає більше рідини, ніж стандартні трубопроводи.
|
||||
block.plated-conduit.description = Пересуває рідини вперед. Не приймає рідин із боків окрім інших трубопроводів. Не протікає.
|
||||
block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також може зберігати певну кількість рідини.
|
||||
block.liquid-tank.description = Зберігає велику кількість рідини. Виводить воду на всі сторони, через це схожий на рідинний маршрутизатор.
|
||||
block.liquid-junction.description = Діє як міст для двох трубопроводів.
|
||||
block.bridge-conduit.description = Транспортує рідину через місцевість і будівлі.
|
||||
block.phase-conduit.description = Транспортує рідину через місцевість і будівлі. Діапазон дії більший ніж у мостового трубопровода
|
||||
block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них.
|
||||
block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії.
|
||||
block.power-node-large.description = Передовий вузол живлення з більшим радіусом дії.
|
||||
block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії.
|
||||
block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії.
|
||||
block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту.
|
||||
block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор.
|
||||
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля.
|
||||
block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях.
|
||||
block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари.
|
||||
block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить.
|
||||
block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
|
||||
block.battery-large.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. Більша ємність ніж у звичайного акумулятора.
|
||||
block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, як-от вугілля.
|
||||
block.thermal-generator.description = Виробляє енергію при розміщенні в спекотних місцях.
|
||||
block.steam-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали і перетворює воду в пару.
|
||||
block.differential-generator.description = Виробляє велику кількість енергії. Використовує різницю температур між кріогенною рідиною й пиротитом, що горить.
|
||||
block.rtg-generator.description = Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю.
|
||||
block.solar-panel.description = Забезпечує невелику кількість енергії від сонця.
|
||||
block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель.
|
||||
block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості.
|
||||
block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії.
|
||||
block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів.
|
||||
block.solar-panel-large.description = Забезпечує невелику кількість енергії від сонця. Значно ефективніша ніж стандартна сонячна панель.
|
||||
block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Потребує постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія.
|
||||
block.impact-reactor.description = Здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії.
|
||||
block.mechanical-drill.description = Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів.
|
||||
block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур.
|
||||
block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію.
|
||||
block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії.
|
||||
block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води.
|
||||
block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки.
|
||||
block.oil-extractor.description = Для видобутку нафти використовується велика кількість енергії, піску та води.
|
||||
block.core-shard.description = Найперша версія капсули ядра. Після його знищення всі контакти з регіоном втрачаються. Не допустіть цього.
|
||||
block.core-foundation.description = Друга версія ядра. Краще броньована. Зберігає більше ресурсів.
|
||||
block.core-nucleus.description = Третя й остання версія капсули ядра. Надзвичайно добре броньована. Зберігає величезні обсяги ресурсів.
|
||||
block.laser-drill.description = Дає змогу видобувати ще швидше за допомогою лазерної технології, але потребує енергії. здатний видобувати торій.
|
||||
block.blast-drill.description = Найкращий бур. Потрібує великої кількості енергії.
|
||||
block.water-extractor.description = Викачує підземні води. Використовується в місцях, де немає поверхневої води.
|
||||
block.cultivator.description = Культивує невеликі концентрації спор в стручки.
|
||||
block.cultivator.details = Відновлена технологія. Використовується для отримання величезної кількості біомаси якомога ефективніше. Ймовірно, початковий інкубатор спор, що зараз покриває Серпуло.
|
||||
block.oil-extractor.description = Використовується велика кількість енергії, піску та води для отримання нафти.
|
||||
block.core-shard.description = Ядро бази. Після знищення сектор втрачається. Найперша версія капсули ядра. Після його знищення всі контакти з регіоном втрачаються. Не допустіть цього.
|
||||
block.core-shard.details = Найперша версія капсули ядра. Компактне. Самовідтворюванне. Оснащене одноразовими пусковими рушіями. Не призначено для міжпланетних подорожей.
|
||||
block.core-foundation.description = Ядро бази. Добре броньоване. Зберігає більше ресурсів.
|
||||
block.core-foundation.details = Друга версія ядра.
|
||||
block.core-nucleus.description = Ядро бази. Напрочуд добре броньовано. Зберігає величезну кількість ресурсів.
|
||||
block.core-nucleus.details = Третя і фінальна версія ядра.
|
||||
block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
|
||||
block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища.
|
||||
block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок.
|
||||
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією.
|
||||
block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше.
|
||||
block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць.
|
||||
block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників.
|
||||
block.unloader.description = Вивантажує предмети з найближчих блоків
|
||||
block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра.
|
||||
block.duo.description = Вистрілює по черзі кулями по ворогах.
|
||||
block.scatter.description = Вистрілює скупченням свинцю, брухту чи метаскла в повітряних противників.
|
||||
block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані.
|
||||
block.hail.description = Невелика артилерійська башта з далеким радіусом дії.
|
||||
block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води.
|
||||
block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії.
|
||||
block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників.
|
||||
block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно.
|
||||
block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника.
|
||||
block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників.
|
||||
block.ripple.description = Надзвичайно потужна артилерійська башта. На великі відстані стріляє скупченнями снарядів у противників.
|
||||
block.cyclone.description = Велика протиповітряна та протиназемна башта. Підпалює вибухонебезпечними грудками скупчення противників.
|
||||
block.spectre.description = Масивна двоствольна гармата. Стріляє великими бронебійними кулями в повітряні та наземні цілі.
|
||||
block.meltdown.description = Масивна лазерна гармата. Заряджає і стріляє лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
|
||||
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю.
|
||||
block.hail.description = Вистрілює невеликі снаряди в наземних ворогів на великі відстані.
|
||||
block.wave.description = Вистрілює потоки рідин в ворогів. Автоматично гасить пожежі при постачанні води.
|
||||
block.lancer.description = Заряджає і вистрілює потужні пучки енергії в наземних противників.
|
||||
block.arc.description = Вистрілює дугами електрики в наземних противників.
|
||||
block.swarmer.description = Запускає ракети, що автоматично наводяться у противників.
|
||||
block.salvo.description = Вистрілює швидкий залп куль у противника.
|
||||
block.fuse.description = Вистрілює трьома променями, що пронизують броню, у малому радіусі у противників.
|
||||
block.ripple.description = Вистрілює скупченням снарядів у противників.
|
||||
block.cyclone.description = Підпалює вибухові грудки скупчення противників.
|
||||
block.spectre.description = Вистрілює великі бронебійні кулі у повітряні та наземні цілі.
|
||||
block.meltdown.description = Заряджає і вистріляє лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
|
||||
block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію
|
||||
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії.
|
||||
block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних.
|
||||
block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх в процесі.
|
||||
block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі при постачанні води.
|
||||
block.silicon-crucible.description = Очищує кремній від піску та вугілля, використовуючи пиратит як додаткове джерело тепла. Більш ефективний у жарких місцях.
|
||||
block.disassembler.description = Поділяє шлак на незначні кількості екзотичних мінеральних компонентів при низькій ефективності. Може виробляти торій.
|
||||
block.overdrive-dome.description = Збільшує швидкість найближчих будівль. Потребує фазову тканину і кремній.
|
||||
block.payload-conveyor.description = Переміщує великі вантажі, як-от одиниці з заводів.
|
||||
block.payload-router.description = Розділяє вантажі, що надходять, у 3 різні сторони.
|
||||
block.command-center.description = Контролює поведінку одиниць за допомогою декількох різних команд.
|
||||
block.ground-factory.description = Виробляє наземних одиниць. Вивід одиниць можна здійснити безпосередньо на місцевість, або спрямувати до реконструкторів для поліпшення.
|
||||
block.air-factory.description = Виробляє повітряних одиниць. Вивід одиниць можна здійснити безпосередньо на місцевість, або спрямувати до реконструкторів для поліпшення.
|
||||
block.naval-factory.description = Виробляє одиниць. Вивід одиниць можна здійснити безпосередньо на місцевість, або спрямувати до реконструкторів для поліпшення.
|
||||
block.additive-reconstructor.description = Поліпшує введених одиниць до другого рівня.
|
||||
block.multiplicative-reconstructor.description = Поліпшує введених одиниць до третього рівня.
|
||||
block.exponential-reconstructor.description = Поліпшує введених одиниць до четвертого рівня.
|
||||
block.tetrative-reconstructor.description = Поліпшує введених одиниць до п’ятого і фінального рівня.
|
||||
block.switch.description = Перемикач. Стан можна читати і контролювати за допомогою логічних процесорів.
|
||||
block.micro-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель.
|
||||
block.logic-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Мікропроцесор.
|
||||
block.hyper-processor.description = Запускає послідовність логічних вказівок (інструкцій) у нескінченному циклі. Може використовуватися для керування блоків та будівель. Швидше ніж Логічний процесор
|
||||
block.memory-cell.description = Зберігає інформацію для логічного процесора.
|
||||
block.memory-bank.description = Зберігає інформацію для логічного процесора. Висока місткість.
|
||||
block.logic-display.description = Відображає довільну графіку з логічного процесора.
|
||||
block.large-logic-display.description = Відображає довільну графіку з логічного процесора.
|
||||
|
||||
unit.dagger.description = Вистрілює стандартними кулями по найближчих ворогах.
|
||||
unit.mace.description = Вистрілює потоками полум'я у найближчих ворогів.
|
||||
unit.fortress.description = Вистрілює з дальнобійної артилерії по наземних цілях.
|
||||
unit.scepter.description = Вистрілює шквалом заряджених куль у найближчих ворогів.
|
||||
unit.reign.description = Вистрілює шквалом масивних пронизливих куль по найближчих ворогах.
|
||||
unit.nova.description = Вистрілює лазерними болтами, які пошкоджують ворогів та відновлюють союзні споруди. Здатний до польоту.
|
||||
unit.pulsar.description = Випускає дуги електрики, які завдають шкоди ворогам та відновлюють союзні споруди. Здатний до польоту.
|
||||
unit.quasar.description = Вистрілює пробивними лазерними промені, які пошкоджують ворогів та відновлюють споріднені конструкції. Здатний до польоту. Захищений.
|
||||
unit.vela.description = Вистрілює масивним безперервним лазерним промінем, який завдає шкоди ворогам, спричиняє пожежі та відновлює союзні споруди. Здатний до польоту.
|
||||
unit.corvus.description = Спричиняє масивний лазерний вибух, який завдає шкоди ворогам та відновлює споріднені споруди. Може переступати через більшість місцевості.
|
||||
unit.crawler.description = Біжить до ворогів і самознищується, викликаючи великий вибух.
|
||||
unit.atrax.description = Випалює виснажливі шари шлаку в наземних цілях. Може переступити більшість місцевості.
|
||||
unit.spiroct.description = Вистрілює виснажливими лазерними променями у ворогів, відновлюючись при цьому. Може переступати через більшість місцевості.
|
||||
unit.arkyid.description = Вистрілює у ворогів великими виснажливими лазерними променями, відновлюючись при цьому.
|
||||
unit.toxopid.description = Вистрілює у ворогів великими електричними касетними снарядами та пробивними лазерами. Може переступати через більшість місцевості.
|
||||
unit.flare.description = Вистрілює стандартними кулями в найближчі цілі.
|
||||
unit.horizon.description = Кидає купу бомб на наземні цілі.
|
||||
unit.zenith.description = Вистрілює залпи ракет по всіх найближчих ворогів.
|
||||
unit.antumbra.description = Вистрілює шквал куль у всіх найближчих ворогів.
|
||||
unit.eclipse.description = Вистрілює два пронизливі лазери та шквал луски по всіх найближчих ворогах.
|
||||
unit.mono.description = Автоматично видобуває мідь і свинець і кладе їх в ядро.
|
||||
unit.poly.description = Автоматично перебудовує зруйновані споруди та допомагає іншим одиницям у будівництві.
|
||||
unit.mega.description = Автоматично відновлює пошкоджені конструкції. Здатний нести блоки та невеликі наземні блоки.
|
||||
unit.quad.description = Кидає великі бомби на наземні цілі, відновлюючи союзні споруди та завдаючи шкоди ворогам. Здатний нести середні наземні одиниці.
|
||||
unit.oct.description = Захищає найближчих союзників своїм відновлювальним щитом. Здатний нести більшість наземних одиниць.
|
||||
unit.risso.description = Вистрілює шквалом ракет і куль по всіх найближчих ворогах.
|
||||
unit.minke.description = Вистрілює запальними снарядами та стандартнами кулями по найближчих наземних цілях.
|
||||
unit.bryde.description = Вистрілює по ворогам артилерійськими снарядами та ракетами великої дальності.
|
||||
unit.sei.description = Вистрілює по ворогам шквалом ракет і бронебійних куль.
|
||||
unit.omura.description = Вистрілює по ворогах дальнобійним болтом, що пробиває броню. Виробляє повітряних Фальшфеєрів.
|
||||
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
|
||||
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
|
||||
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
|
||||
|
||||
@@ -96,6 +96,7 @@ YellOw139
|
||||
PetrGasparik
|
||||
LeoDog896
|
||||
Summet
|
||||
MEEP of Faith
|
||||
jalastram (freesound.org)
|
||||
newlocknew (freesound.org)
|
||||
dsmolenaers (freesound.org)
|
||||
|
||||
@@ -316,3 +316,4 @@
|
||||
63420=space|block-space-medium
|
||||
63419=legacy-unit-factory-air|block-legacy-unit-factory-air-medium
|
||||
63418=legacy-unit-factory-ground|block-legacy-unit-factory-ground-medium
|
||||
63417=interplanetary-accelerator|block-interplanetary-accelerator-medium
|
||||
|
||||
@@ -17,9 +17,9 @@ const float shinelen = 0.2;
|
||||
void main(){
|
||||
vec3 norc = u_ambientColor * (diffuse + vec3(clamp((dot(a_normal, u_lightdir) + 1.0) / 2.0, 0.0, 1.0)));
|
||||
float shinedot = max((-dot(u_camdir, a_normal) - (1.0 - shinelen)) / shinelen, 0.0);
|
||||
float shinyness = (1.0 - a_color.a) * pow(shinedot, shinefalloff);
|
||||
float albedo = (1.0 - a_color.a) * pow(shinedot, shinefalloff);
|
||||
vec4 baseCol = vec4(a_color.rgb, 1.0);
|
||||
|
||||
v_col = mix(baseCol * vec4(norc, 1.0), vec4(1.0), shinyness * norc.r);
|
||||
v_col = mix(baseCol * vec4(norc, 1.0), vec4(1.0), albedo * norc.r);
|
||||
gl_Position = u_proj * u_trans * a_position;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 825 B After Width: | Height: | Size: 828 B |
|
Before Width: | Height: | Size: 668 KiB After Width: | Height: | Size: 660 KiB |
|
Before Width: | Height: | Size: 944 KiB After Width: | Height: | Size: 901 KiB |
|
Before Width: | Height: | Size: 596 KiB After Width: | Height: | Size: 675 KiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 429 KiB After Width: | Height: | Size: 437 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 2.9 MiB After Width: | Height: | Size: 3.0 MiB |
|
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 426 KiB After Width: | Height: | Size: 438 KiB |
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
@@ -14,21 +14,20 @@ import static mindustry.Vars.*;
|
||||
public class BuilderAI extends AIController{
|
||||
float buildRadius = 1500;
|
||||
boolean found = false;
|
||||
@Nullable Builderc following;
|
||||
@Nullable Unit following;
|
||||
|
||||
@Override
|
||||
public void updateMovement(){
|
||||
Builderc builder = (Builderc)unit;
|
||||
|
||||
if(builder.moving()){
|
||||
builder.lookAt(builder.vel().angle());
|
||||
if(unit.moving()){
|
||||
unit.lookAt(unit.vel.angle());
|
||||
}
|
||||
|
||||
if(target != null && shouldShoot()){
|
||||
unit.lookAt(target);
|
||||
}
|
||||
|
||||
builder.updateBuilding(true);
|
||||
unit.updateBuilding = true;
|
||||
|
||||
if(following != null){
|
||||
//try to follow and mimic someone
|
||||
@@ -36,18 +35,18 @@ public class BuilderAI extends AIController{
|
||||
//validate follower
|
||||
if(!following.isValid() || !following.activelyBuilding()){
|
||||
following = null;
|
||||
builder.plans().clear();
|
||||
unit.plans.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
//set to follower's first build plan, whatever that is
|
||||
builder.plans().clear();
|
||||
builder.plans().addFirst(following.buildPlan());
|
||||
unit.plans.clear();
|
||||
unit.plans.addFirst(following.buildPlan());
|
||||
}
|
||||
|
||||
if(builder.buildPlan() != null){
|
||||
if(unit.buildPlan() != null){
|
||||
//approach request if building
|
||||
BuildPlan req = builder.buildPlan();
|
||||
BuildPlan req = unit.buildPlan();
|
||||
|
||||
boolean valid =
|
||||
(req.tile().build instanceof ConstructBuild && req.tile().<ConstructBuild>bc().cblock == req.block) ||
|
||||
@@ -60,7 +59,7 @@ public class BuilderAI extends AIController{
|
||||
moveTo(req.tile(), buildingRange - 20f);
|
||||
}else{
|
||||
//discard invalid request
|
||||
builder.plans().removeFirst();
|
||||
unit.plans.removeFirst();
|
||||
}
|
||||
}else{
|
||||
|
||||
@@ -71,8 +70,8 @@ public class BuilderAI extends AIController{
|
||||
Units.nearby(unit.team, unit.x, unit.y, buildRadius, u -> {
|
||||
if(found) return;
|
||||
|
||||
if(u instanceof Builderc b && u != unit && b.activelyBuilding()){
|
||||
BuildPlan plan = b.buildPlan();
|
||||
if(u.canBuild() && u != unit && u.activelyBuilding()){
|
||||
BuildPlan plan = u.buildPlan();
|
||||
|
||||
Building build = world.build(plan.x, plan.y);
|
||||
if(build instanceof ConstructBuild cons){
|
||||
@@ -80,7 +79,7 @@ public class BuilderAI extends AIController{
|
||||
|
||||
//make sure you can reach the request in time
|
||||
if(dist / unit.speed() < cons.buildCost * 0.9f){
|
||||
following = b;
|
||||
following = u;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
@@ -98,7 +97,7 @@ public class BuilderAI extends AIController{
|
||||
blocks.removeFirst();
|
||||
}else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid.
|
||||
//add build request.
|
||||
builder.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
|
||||
unit.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config));
|
||||
//shift build plan to tail so next unit builds something else.
|
||||
blocks.addLast(blocks.removeFirst());
|
||||
}else{
|
||||
|
||||
@@ -59,13 +59,13 @@ public class FormationAI extends AIController implements FormationMember{
|
||||
unit.moveAt(realtarget.sub(unit).limit(speed));
|
||||
}
|
||||
|
||||
if(unit instanceof Minerc mine && leader instanceof Minerc com){
|
||||
if(com.mineTile() != null && mine.validMine(com.mineTile())){
|
||||
mine.mineTile(com.mineTile());
|
||||
if(unit.canMine() && leader.canMine()){
|
||||
if(leader.mineTile != null && unit.validMine(leader.mineTile)){
|
||||
unit.mineTile(leader.mineTile);
|
||||
|
||||
CoreBuild core = unit.team.core();
|
||||
|
||||
if(core != null && com.mineTile().drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(com.mineTile().drop())){
|
||||
if(core != null && leader.mineTile.drop() != null && unit.within(core, unit.type.range) && !unit.acceptsItem(leader.mineTile.drop())){
|
||||
if(core.acceptStack(unit.stack.item, unit.stack.amount, unit) > 0){
|
||||
Call.transferItemTo(unit.stack.item, unit.stack.amount, unit.x, unit.y, core);
|
||||
|
||||
@@ -73,13 +73,13 @@ public class FormationAI extends AIController implements FormationMember{
|
||||
}
|
||||
}
|
||||
}else{
|
||||
mine.mineTile(null);
|
||||
unit.mineTile(null);
|
||||
}
|
||||
}
|
||||
|
||||
if(unit instanceof Builderc build && leader instanceof Builderc com && com.activelyBuilding()){
|
||||
build.clearBuilding();
|
||||
build.addBuild(com.buildPlan());
|
||||
if(unit.canBuild() && leader.canBuild() && leader.activelyBuilding()){
|
||||
unit.clearBuilding();
|
||||
unit.addBuild(leader.buildPlan());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -92,9 +92,7 @@ public class LogicAI extends AIController{
|
||||
}
|
||||
}
|
||||
case stop -> {
|
||||
if(unit instanceof Builderc build){
|
||||
build.clearBuilding();
|
||||
}
|
||||
unit.clearBuilding();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,21 +17,21 @@ public class MinerAI extends AIController{
|
||||
protected void updateMovement(){
|
||||
Building core = unit.closestCore();
|
||||
|
||||
if(!(unit instanceof Minerc miner) || core == null) return;
|
||||
if(!(unit.canMine()) || core == null) return;
|
||||
|
||||
if(miner.mineTile() != null && !miner.mineTile().within(unit, unit.type.range)){
|
||||
miner.mineTile(null);
|
||||
if(unit.mineTile != null && !unit.mineTile.within(unit, unit.type.range)){
|
||||
unit.mineTile(null);
|
||||
}
|
||||
|
||||
if(mining){
|
||||
if(timer.get(timerTarget2, 60 * 4) || targetItem == null){
|
||||
targetItem = unit.team.data().mineItems.min(i -> indexer.hasOre(i) && miner.canMine(i), i -> core.items.get(i));
|
||||
targetItem = unit.team.data().mineItems.min(i -> indexer.hasOre(i) && unit.canMine(i), i -> core.items.get(i));
|
||||
}
|
||||
|
||||
//core full of the target item, do nothing
|
||||
if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){
|
||||
unit.clearItem();
|
||||
miner.mineTile(null);
|
||||
unit.mineTile(null);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class MinerAI extends AIController{
|
||||
moveTo(ore, unit.type.range / 2f, 20f);
|
||||
|
||||
if(unit.within(ore, unit.type.range)){
|
||||
miner.mineTile(ore);
|
||||
unit.mineTile = ore;
|
||||
}
|
||||
|
||||
if(ore.block() != Blocks.air){
|
||||
@@ -56,7 +56,7 @@ public class MinerAI extends AIController{
|
||||
}
|
||||
}
|
||||
}else{
|
||||
miner.mineTile(null);
|
||||
unit.mineTile = null;
|
||||
|
||||
if(unit.stack.amount == 0){
|
||||
mining = true;
|
||||
|
||||
@@ -27,13 +27,13 @@ public class SoundControl{
|
||||
public Seq<Music> bossMusic = Seq.with();
|
||||
|
||||
protected Music lastRandomPlayed;
|
||||
protected Interval timer = new Interval();
|
||||
protected Interval timer = new Interval(4);
|
||||
protected @Nullable Music current;
|
||||
protected float fade;
|
||||
protected boolean silenced;
|
||||
|
||||
protected AudioBus uiBus = new AudioBus();
|
||||
protected boolean wasPaused, wasPlaying;
|
||||
protected boolean wasPlaying;
|
||||
protected AudioFilter filter = new BiquadFilter(){{
|
||||
set(0, 500, 1);
|
||||
}};
|
||||
@@ -117,9 +117,8 @@ public class SoundControl{
|
||||
fade = 0f;
|
||||
}
|
||||
|
||||
//fade the lowpass filter in/out
|
||||
if(paused != wasPaused){
|
||||
wasPaused = paused;
|
||||
//fade the lowpass filter in/out, poll every 30 ticks just in case performance is an issue
|
||||
if(timer.get(1, 30f)){
|
||||
Core.audio.soundBus.fadeFilterParam(0, Filters.paramWet, paused ? 1f : 0f, 0.4f);
|
||||
}
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ public class Blocks implements ContentList{
|
||||
message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, memoryBank,
|
||||
|
||||
//campaign
|
||||
launchPad, launchPadLarge,
|
||||
launchPad, launchPadLarge, interplanetaryAccelerator,
|
||||
|
||||
//misc experimental
|
||||
blockForge, blockLoader, blockUnloader;
|
||||
@@ -1777,7 +1777,7 @@ public class Blocks implements ContentList{
|
||||
shootSound = Sounds.railgun;
|
||||
unitSort = (u, x, y) -> -u.maxHealth;
|
||||
|
||||
coolantMultiplier = 0.11f;
|
||||
coolantMultiplier = 0.2f;
|
||||
|
||||
health = 150 * size * size;
|
||||
coolantUsage = 1f;
|
||||
@@ -2046,7 +2046,6 @@ public class Blocks implements ContentList{
|
||||
|
||||
//TODO remove
|
||||
launchPadLarge = new LaunchPad("launch-pad-large"){{
|
||||
//requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75));
|
||||
size = 4;
|
||||
itemCapacity = 300;
|
||||
launchTime = 60f * 35;
|
||||
@@ -2054,6 +2053,14 @@ public class Blocks implements ContentList{
|
||||
consumes.power(6f);
|
||||
}};
|
||||
|
||||
interplanetaryAccelerator = new Accelerator("interplanetary-accelerator"){{
|
||||
requirements(Category.effect, BuildVisibility.campaignOnly, with(Items.copper, 9000, Items.silicon, 9000, Items.thorium, 9000, Items.titanium, 9000, Items.surgeAlloy, 5000, Items.phaseFabric, 4000));
|
||||
researchCostMultiplier = 0.1f;
|
||||
size = 7;
|
||||
hasPower = true;
|
||||
consumes.power(10f);
|
||||
}};
|
||||
|
||||
//endregion campaign
|
||||
//region logic
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import mindustry.type.*;
|
||||
public class Planets implements ContentList{
|
||||
public static Planet
|
||||
sun,
|
||||
//tantros,
|
||||
serpulo;
|
||||
|
||||
@Override
|
||||
@@ -32,10 +33,23 @@ public class Planets implements ContentList{
|
||||
);
|
||||
}};
|
||||
|
||||
/*tantros = new Planet("tantros", sun, 2, 0.8f){{
|
||||
generator = new TantrosPlanetGenerator();
|
||||
meshLoader = () -> new HexMesh(this, 4);
|
||||
atmosphereColor = Color.valueOf("3db899");
|
||||
startSector = 10;
|
||||
atmosphereRadIn = -0.01f;
|
||||
atmosphereRadOut = 0.3f;
|
||||
accessible = false;
|
||||
visible = false;
|
||||
}};*/
|
||||
|
||||
serpulo = new Planet("serpulo", sun, 3, 1){{
|
||||
generator = new SerpuloPlanetGenerator();
|
||||
meshLoader = () -> new HexMesh(this, 6);
|
||||
atmosphereColor = Color.valueOf("3c1b8f");
|
||||
atmosphereRadIn = 0.02f;
|
||||
atmosphereRadOut = 0.3f;
|
||||
startSector = 15;
|
||||
}};
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ public class SectorPresets implements ContentList{
|
||||
groundZero,
|
||||
craters, biomassFacility, frozenForest, ruinousShores, windsweptIslands, stainedMountains, tarFields,
|
||||
fungalPass, extractionOutpost, saltFlats, overgrowth,
|
||||
impact0078, desolateRift, nuclearComplex;
|
||||
impact0078, desolateRift, nuclearComplex, planetaryTerminal;
|
||||
|
||||
@Override
|
||||
public void load(){
|
||||
@@ -41,7 +41,7 @@ public class SectorPresets implements ContentList{
|
||||
difficulty = 2;
|
||||
}};
|
||||
|
||||
ruinousShores = new SectorPreset("ruinousShores", serpulo, 19){{
|
||||
ruinousShores = new SectorPreset("ruinousShores", serpulo, 213){{
|
||||
captureWave = 30;
|
||||
difficulty = 3;
|
||||
}};
|
||||
@@ -68,6 +68,7 @@ public class SectorPresets implements ContentList{
|
||||
|
||||
overgrowth = new SectorPreset("overgrowth", serpulo, 134){{
|
||||
difficulty = 5;
|
||||
useAI = false;
|
||||
}};
|
||||
|
||||
tarFields = new SectorPreset("tarFields", serpulo, 23){{
|
||||
@@ -89,5 +90,9 @@ public class SectorPresets implements ContentList{
|
||||
captureWave = 50;
|
||||
difficulty = 7;
|
||||
}};
|
||||
|
||||
planetaryTerminal = new SectorPreset("planetaryTerminal", serpulo, 93){{
|
||||
difficulty = 10;
|
||||
}};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@ public class TechTree implements ContentList{
|
||||
node(junction, () -> {
|
||||
node(router, () -> {
|
||||
node(launchPad, Seq.with(new SectorComplete(extractionOutpost)), () -> {
|
||||
node(interplanetaryAccelerator, Seq.with(new SectorComplete(planetaryTerminal)), () -> {
|
||||
});
|
||||
});
|
||||
|
||||
node(distributor);
|
||||
@@ -47,7 +49,7 @@ public class TechTree implements ContentList{
|
||||
});
|
||||
|
||||
node(itemBridge, () -> {
|
||||
node(titaniumConveyor, () -> {
|
||||
node(titaniumConveyor, Seq.with(new SectorComplete(craters)), () -> {
|
||||
node(phaseConveyor, () -> {
|
||||
node(massDriver, () -> {
|
||||
|
||||
@@ -108,7 +110,7 @@ public class TechTree implements ContentList{
|
||||
});
|
||||
|
||||
node(graphitePress, () -> {
|
||||
node(pneumaticDrill, () -> {
|
||||
node(pneumaticDrill, Seq.with(new SectorComplete(frozenForest)), () -> {
|
||||
node(cultivator, Seq.with(new SectorComplete(biomassFacility)), () -> {
|
||||
|
||||
});
|
||||
@@ -234,7 +236,7 @@ public class TechTree implements ContentList{
|
||||
});
|
||||
});
|
||||
|
||||
node(steamGenerator, () -> {
|
||||
node(steamGenerator, Seq.with(new SectorComplete(craters)), () -> {
|
||||
node(thermalGenerator, () -> {
|
||||
node(differentialGenerator, () -> {
|
||||
node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> {
|
||||
@@ -291,7 +293,7 @@ public class TechTree implements ContentList{
|
||||
node(salvo, () -> {
|
||||
node(swarmer, () -> {
|
||||
node(cyclone, () -> {
|
||||
node(spectre, () -> {
|
||||
node(spectre, Seq.with(new SectorComplete(nuclearComplex)), () -> {
|
||||
|
||||
});
|
||||
});
|
||||
@@ -321,8 +323,8 @@ public class TechTree implements ContentList{
|
||||
});
|
||||
|
||||
node(lancer, () -> {
|
||||
node(foreshadow, () -> {
|
||||
node(meltdown, () -> {
|
||||
node(meltdown, () -> {
|
||||
node(foreshadow, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
@@ -417,7 +419,7 @@ public class TechTree implements ContentList{
|
||||
});
|
||||
|
||||
node(additiveReconstructor, Seq.with(new SectorComplete(biomassFacility)), () -> {
|
||||
node(multiplicativeReconstructor, () -> {
|
||||
node(multiplicativeReconstructor, Seq.with(new SectorComplete(overgrowth)), () -> {
|
||||
node(exponentialReconstructor, () -> {
|
||||
node(tetrativeReconstructor, () -> {
|
||||
});
|
||||
@@ -468,7 +470,23 @@ public class TechTree implements ContentList{
|
||||
new Research(thermalGenerator),
|
||||
new Research(thoriumReactor)
|
||||
), () -> {
|
||||
node(planetaryTerminal, Seq.with(
|
||||
new SectorComplete(desolateRift),
|
||||
new SectorComplete(nuclearComplex),
|
||||
new SectorComplete(overgrowth),
|
||||
new SectorComplete(extractionOutpost),
|
||||
new SectorComplete(saltFlats),
|
||||
new Research(risso),
|
||||
new Research(minke),
|
||||
new Research(bryde),
|
||||
new Research(spectre),
|
||||
new Research(launchPad),
|
||||
new Research(impactReactor),
|
||||
new Research(additiveReconstructor),
|
||||
new Research(exponentialReconstructor)
|
||||
), () -> {
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -17,11 +17,13 @@ import static mindustry.Vars.*;
|
||||
public class UnitTypes implements ContentList{
|
||||
//region definitions
|
||||
|
||||
//(the wall of shame - should fix the legacy stuff eventually...)
|
||||
|
||||
//mech
|
||||
public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, scepter, reign;
|
||||
|
||||
//mech + builder + miner
|
||||
public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType nova, pulsar, quasar;
|
||||
//mech
|
||||
public static @EntityDef(value = {Unitc.class, Mechc.class}, legacy = true) UnitType nova, pulsar, quasar;
|
||||
|
||||
//mech
|
||||
public static @EntityDef({Unitc.class, Mechc.class}) UnitType vela;
|
||||
@@ -29,29 +31,29 @@ public class UnitTypes implements ContentList{
|
||||
//legs
|
||||
public static @EntityDef({Unitc.class, Legsc.class}) UnitType corvus, atrax;
|
||||
|
||||
//legs + building
|
||||
public static @EntityDef({Unitc.class, Legsc.class, Builderc.class}) UnitType spiroct, arkyid, toxopid;
|
||||
//legs
|
||||
public static @EntityDef(value = {Unitc.class, Legsc.class}, legacy = true) UnitType spiroct, arkyid, toxopid;
|
||||
|
||||
//air (no special traits)
|
||||
//air
|
||||
public static @EntityDef({Unitc.class}) UnitType flare, eclipse, horizon, zenith, antumbra;
|
||||
|
||||
//air, legacy mining
|
||||
//air
|
||||
public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType mono;
|
||||
|
||||
//air + building + mining
|
||||
public static @EntityDef({Unitc.class, Builderc.class}) UnitType poly;
|
||||
//air
|
||||
public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType poly;
|
||||
|
||||
//air + building + mining + payload
|
||||
public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class}) UnitType mega;
|
||||
//air + payload
|
||||
public static @EntityDef({Unitc.class, Payloadc.class}) UnitType mega;
|
||||
|
||||
//air + building + payload
|
||||
public static @EntityDef(value = {Unitc.class, Builderc.class, Payloadc.class}, legacy = true) UnitType quad;
|
||||
//air + payload
|
||||
public static @EntityDef(value = {Unitc.class, Payloadc.class}, legacy = true) UnitType quad;
|
||||
|
||||
//air + building + payload
|
||||
public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class, AmmoDistributec.class}) UnitType oct;
|
||||
//air + payload + ammo distribution
|
||||
public static @EntityDef({Unitc.class, Payloadc.class, AmmoDistributec.class}) UnitType oct;
|
||||
|
||||
//air + building + mining
|
||||
public static @EntityDef({Unitc.class, Builderc.class}) UnitType alpha, beta, gamma;
|
||||
//air
|
||||
public static @EntityDef(value = {Unitc.class}, legacy = true) UnitType alpha, beta, gamma;
|
||||
|
||||
//water
|
||||
public static @EntityDef({Unitc.class, WaterMovec.class}) UnitType risso, minke, bryde, sei, omura;
|
||||
@@ -111,7 +113,7 @@ public class UnitTypes implements ContentList{
|
||||
}};
|
||||
|
||||
fortress = new UnitType("fortress"){{
|
||||
speed = 0.38f;
|
||||
speed = 0.39f;
|
||||
hitSize = 13f;
|
||||
rotateSpeed = 3f;
|
||||
targetAir = false;
|
||||
@@ -136,7 +138,7 @@ public class UnitTypes implements ContentList{
|
||||
collides = true;
|
||||
collidesTiles = true;
|
||||
splashDamageRadius = 24f;
|
||||
splashDamage = 38f;
|
||||
splashDamage = 45f;
|
||||
backColor = Pal.bulletYellowBack;
|
||||
frontColor = Pal.bulletYellow;
|
||||
}};
|
||||
@@ -419,6 +421,7 @@ public class UnitTypes implements ContentList{
|
||||
armor = 7f;
|
||||
canBoost = true;
|
||||
landShake = 4f;
|
||||
immunities = ObjectSet.with(StatusEffects.burning);
|
||||
|
||||
commandLimit = 8;
|
||||
|
||||
@@ -431,7 +434,7 @@ public class UnitTypes implements ContentList{
|
||||
|
||||
firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f;
|
||||
|
||||
reload = 320f;
|
||||
reload = 160f;
|
||||
recoil = 0f;
|
||||
chargeSound = Sounds.lasercharge2;
|
||||
shootSound = Sounds.beam;
|
||||
@@ -450,7 +453,7 @@ public class UnitTypes implements ContentList{
|
||||
|
||||
shootEffect = Fx.greenLaserChargeSmall;
|
||||
|
||||
incendChance = 0.05f;
|
||||
incendChance = 0.075f;
|
||||
incendSpread = 5f;
|
||||
incendAmount = 1;
|
||||
|
||||
@@ -470,7 +473,6 @@ public class UnitTypes implements ContentList{
|
||||
mineTier = 1;
|
||||
hitSize = 29f;
|
||||
health = 18000f;
|
||||
buildSpeed = 1.7f;
|
||||
armor = 9f;
|
||||
landShake = 1.5f;
|
||||
rotateSpeed = 1.5f;
|
||||
@@ -700,6 +702,7 @@ public class UnitTypes implements ContentList{
|
||||
rippleScale = 2f;
|
||||
legSpeed = 0.2f;
|
||||
ammoType = AmmoTypes.power;
|
||||
buildSpeed = 1f;
|
||||
|
||||
legSplashDamage = 32;
|
||||
legSplashRange = 30;
|
||||
@@ -802,6 +805,7 @@ public class UnitTypes implements ContentList{
|
||||
rippleScale = 3f;
|
||||
legSpeed = 0.19f;
|
||||
ammoType = AmmoTypes.powerHigh;
|
||||
buildSpeed = 1f;
|
||||
|
||||
legSplashDamage = 80;
|
||||
legSplashRange = 60;
|
||||
@@ -942,7 +946,7 @@ public class UnitTypes implements ContentList{
|
||||
engineOffset = 7.8f;
|
||||
range = 140f;
|
||||
faceTarget = false;
|
||||
armor = 4f;
|
||||
armor = 3f;
|
||||
targetFlag = BlockFlag.factory;
|
||||
commandLimit = 5;
|
||||
|
||||
@@ -950,7 +954,7 @@ public class UnitTypes implements ContentList{
|
||||
minShootVelocity = 0.75f;
|
||||
x = 3f;
|
||||
shootY = 0f;
|
||||
reload = 11f;
|
||||
reload = 12f;
|
||||
shootCone = 180f;
|
||||
ejectEffect = Fx.none;
|
||||
inaccuracy = 15f;
|
||||
@@ -1466,7 +1470,7 @@ public class UnitTypes implements ContentList{
|
||||
shake = 1.5f;
|
||||
ejectEffect = Fx.casing2;
|
||||
shootSound = Sounds.bang;
|
||||
bullet = Bullets.artilleryIncendiary;
|
||||
bullet = Bullets.artilleryDense;
|
||||
}});
|
||||
}};
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ public class Weathers implements ContentList{
|
||||
baseSpeed = 5.4f;
|
||||
attrs.set(Attribute.light, -0.1f);
|
||||
attrs.set(Attribute.water, -0.1f);
|
||||
opacityMultiplier = 0.8f;
|
||||
opacityMultiplier = 0.5f;
|
||||
force = 0.1f;
|
||||
sound = Sounds.wind;
|
||||
soundVol = 0.3f;
|
||||
@@ -74,7 +74,7 @@ public class Weathers implements ContentList{
|
||||
attrs.set(Attribute.spores, 1f);
|
||||
attrs.set(Attribute.light, -0.15f);
|
||||
status = StatusEffects.sporeSlowed;
|
||||
opacityMultiplier = 0.85f;
|
||||
opacityMultiplier = 0.75f;
|
||||
force = 0.1f;
|
||||
sound = Sounds.wind;
|
||||
soundVol = 0.3f;
|
||||
|
||||
@@ -22,6 +22,7 @@ import mindustry.input.*;
|
||||
import mindustry.io.*;
|
||||
import mindustry.io.SaveIO.*;
|
||||
import mindustry.maps.Map;
|
||||
import mindustry.net.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.dialogs.*;
|
||||
import mindustry.world.*;
|
||||
@@ -162,7 +163,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
Events.on(GameOverEvent.class, e -> {
|
||||
if(state.isCampaign() && !net.client() && !headless){
|
||||
|
||||
//delete the save, it is gone.
|
||||
//save gameover sate immediately
|
||||
if(saves.getCurrent() != null && !state.rules.tutorial){
|
||||
saves.getCurrent().save();
|
||||
}
|
||||
@@ -279,6 +280,10 @@ public class Control implements ApplicationListener, Loadable{
|
||||
}
|
||||
|
||||
public void playSector(@Nullable Sector origin, Sector sector){
|
||||
playSector(origin, sector, new WorldReloader());
|
||||
}
|
||||
|
||||
void playSector(@Nullable Sector origin, Sector sector, WorldReloader reloader){
|
||||
ui.loadAnd(() -> {
|
||||
if(saves.getCurrent() != null && state.isGame()){
|
||||
control.saves.getCurrent().save();
|
||||
@@ -291,7 +296,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
if(slot != null && !clearSectors){
|
||||
|
||||
try{
|
||||
net.reset();
|
||||
reloader.begin();
|
||||
slot.load();
|
||||
slot.setAutosave(true);
|
||||
state.rules.sector = sector;
|
||||
@@ -305,7 +310,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
sector.save = null;
|
||||
slot.delete();
|
||||
//play again
|
||||
playSector(origin, sector);
|
||||
playSector(origin, sector, reloader);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -331,6 +336,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
}
|
||||
|
||||
state.set(State.playing);
|
||||
reloader.end();
|
||||
|
||||
}catch(SaveException e){
|
||||
Log.err(e);
|
||||
@@ -341,8 +347,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
}
|
||||
ui.planet.hide();
|
||||
}else{
|
||||
net.reset();
|
||||
logic.reset();
|
||||
reloader.begin();
|
||||
world.loadSector(sector);
|
||||
state.rules.sector = sector;
|
||||
//assign origin when launching
|
||||
@@ -352,6 +357,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
control.saves.saveSector(sector);
|
||||
Events.fire(new SectorLaunchEvent(sector));
|
||||
Events.fire(Trigger.newGame);
|
||||
reloader.end();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -484,7 +490,7 @@ public class Control implements ApplicationListener, Loadable{
|
||||
|
||||
//unlock core items
|
||||
var core = state.rules.defaultTeam.core();
|
||||
if(!net.client() && core != null){
|
||||
if(!net.client() && core != null && state.isCampaign()){
|
||||
core.items.each((i, a) -> i.unlock());
|
||||
}
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ public class Logic implements ApplicationListener{
|
||||
});
|
||||
|
||||
Events.on(SectorCaptureEvent.class, e -> {
|
||||
if(!net.client()){
|
||||
if(!net.client() && e.sector == state.getSector() && e.sector.isBeingPlayed()){
|
||||
for(Tile tile : world.tiles){
|
||||
//convert all blocks to neutral, randomly killing them
|
||||
if(tile.isCenter() && tile.build != null && tile.build.team == state.rules.waveTeam){
|
||||
|
||||
@@ -571,19 +571,19 @@ public class NetClient implements ApplicationListener{
|
||||
BuildPlan[] requests = null;
|
||||
if(player.isBuilder()){
|
||||
//limit to 10 to prevent buffer overflows
|
||||
int usedRequests = Math.min(player.builder().plans().size, 10);
|
||||
int usedRequests = Math.min(player.unit().plans().size, 10);
|
||||
|
||||
int totalLength = 0;
|
||||
|
||||
//prevent buffer overflow by checking config length
|
||||
for(int i = 0; i < usedRequests; i++){
|
||||
BuildPlan plan = player.builder().plans().get(i);
|
||||
BuildPlan plan = player.unit().plans().get(i);
|
||||
if(plan.config instanceof byte[] b){
|
||||
int length = b.length;
|
||||
totalLength += length;
|
||||
}
|
||||
|
||||
if(totalLength > 2048){
|
||||
if(totalLength > 1024){
|
||||
usedRequests = i + 1;
|
||||
break;
|
||||
}
|
||||
@@ -591,7 +591,7 @@ public class NetClient implements ApplicationListener{
|
||||
|
||||
requests = new BuildPlan[usedRequests];
|
||||
for(int i = 0; i < usedRequests; i++){
|
||||
requests[i] = player.builder().plans().get(i);
|
||||
requests[i] = player.unit().plans().get(i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -607,7 +607,7 @@ public class NetClient implements ApplicationListener{
|
||||
unit.rotation,
|
||||
unit instanceof Mechc m ? m.baseRotation() : 0,
|
||||
unit.vel.x, unit.vel.y,
|
||||
player.miner().mineTile(),
|
||||
player.unit().mineTile,
|
||||
player.boosting, player.shooting, ui.chatfrag.shown(), control.input.isBuilding,
|
||||
requests,
|
||||
Core.camera.position.x, Core.camera.position.y,
|
||||
|
||||
@@ -600,8 +600,8 @@ public class NetServer implements ApplicationListener{
|
||||
player.unit().aim(pointerX, pointerY);
|
||||
|
||||
if(player.isBuilder()){
|
||||
player.builder().clearBuilding();
|
||||
player.builder().updateBuilding(building);
|
||||
player.unit().clearBuilding();
|
||||
player.unit().updateBuilding(building);
|
||||
|
||||
if(requests != null){
|
||||
for(BuildPlan req : requests){
|
||||
@@ -625,14 +625,12 @@ public class NetServer implements ApplicationListener{
|
||||
con.rejectedRequests.add(req);
|
||||
continue;
|
||||
}
|
||||
player.builder().plans().addLast(req);
|
||||
player.unit().plans().addLast(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(player.isMiner()){
|
||||
player.miner().mineTile(mining);
|
||||
}
|
||||
player.unit().mineTile = mining;
|
||||
|
||||
con.rejectedRequests.clear();
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ public class Damage{
|
||||
|
||||
//try to heal the tile
|
||||
if(collide && hitter.type.collides(hitter, tile)){
|
||||
hitter.type.hitTile(hitter, tile, 0f);
|
||||
hitter.type.hitTile(hitter, tile, 0f, false);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -161,15 +161,17 @@ public abstract class BulletType extends Content{
|
||||
return healPercent <= 0.001f || tile.team != bullet.team || tile.healthf() < 1f;
|
||||
}
|
||||
|
||||
public void hitTile(Bullet b, Building tile, float initialHealth){
|
||||
if(makeFire && tile.team != b.team){
|
||||
Fires.create(tile.tile);
|
||||
/** If direct is false, this is an indirect hit and the tile was already damaged.
|
||||
* TODO this is a mess. */
|
||||
public void hitTile(Bullet b, Building build, float initialHealth, boolean direct){
|
||||
if(makeFire && build.team != b.team){
|
||||
Fires.create(build.tile);
|
||||
}
|
||||
|
||||
if(healPercent > 0f && tile.team == b.team && !(tile.block instanceof ConstructBlock)){
|
||||
Fx.healBlockFull.at(tile.x, tile.y, tile.block.size, Pal.heal);
|
||||
tile.heal(healPercent / 100f * tile.maxHealth());
|
||||
}else if(tile.team != b.team){
|
||||
if(healPercent > 0f && build.team == b.team && !(build.block instanceof ConstructBlock)){
|
||||
Fx.healBlockFull.at(build.x, build.y, build.block.size, Pal.heal);
|
||||
build.heal(healPercent / 100f * build.maxHealth());
|
||||
}else if(build.team != b.team && direct){
|
||||
hit(b);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ public class RailBulletType extends BulletType{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hitTile(Bullet b, Building tile, float initialHealth){
|
||||
handle(b, tile, initialHealth);
|
||||
public void hitTile(Bullet b, Building build, float initialHealth, boolean direct){
|
||||
handle(b, build, initialHealth);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import mindustry.entities.units.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.*;
|
||||
import mindustry.world.blocks.ConstructBlock.*;
|
||||
@@ -22,17 +23,22 @@ import java.util.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
@Component
|
||||
abstract class BuilderComp implements Unitc{
|
||||
abstract class BuilderComp implements Posc, Teamc, Rotc{
|
||||
static final Vec2[] vecs = new Vec2[]{new Vec2(), new Vec2(), new Vec2(), new Vec2()};
|
||||
|
||||
@Import float x, y, rotation;
|
||||
@Import UnitType type;
|
||||
|
||||
@SyncLocal Queue<BuildPlan> plans = new Queue<>(1);
|
||||
@SyncLocal transient boolean updateBuilding = true;
|
||||
|
||||
public boolean canBuild(){
|
||||
return type.buildSpeed > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(){
|
||||
if(!updateBuilding) return;
|
||||
if(!updateBuilding || !canBuild()) return;
|
||||
|
||||
float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange;
|
||||
boolean infinite = state.rules.infiniteResources || team().rules().infiniteResources;
|
||||
@@ -102,9 +108,9 @@ abstract class BuilderComp implements Unitc{
|
||||
ConstructBuild entity = tile.bc();
|
||||
|
||||
if(current.breaking){
|
||||
entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier);
|
||||
entity.deconstruct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * state.rules.buildSpeedMultiplier);
|
||||
}else{
|
||||
entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier, current.config);
|
||||
entity.construct(self(), core, 1f / entity.buildCost * Time.delta * type.buildSpeed * state.rules.buildSpeedMultiplier, current.config);
|
||||
}
|
||||
|
||||
current.stuck = Mathf.equal(current.progress, entity.progress);
|
||||
@@ -161,6 +167,8 @@ abstract class BuilderComp implements Unitc{
|
||||
|
||||
/** Add another build requests to the queue, if it doesn't exist there yet. */
|
||||
void addBuild(BuildPlan place, boolean tail){
|
||||
if(!canBuild()) return;
|
||||
|
||||
BuildPlan replace = null;
|
||||
for(BuildPlan request : plans){
|
||||
if(request.x == place.x && request.y == place.y){
|
||||
@@ -196,9 +204,8 @@ abstract class BuilderComp implements Unitc{
|
||||
return plans.size == 0 ? null : plans.first();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
if(!isBuilding() || !updateBuilding) return;
|
||||
if(!isBuilding() || !updateBuilding || !canBuild()) return;
|
||||
|
||||
//TODO check correctness
|
||||
Draw.z(Layer.flyingUnit);
|
||||
|
||||
@@ -519,7 +519,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
public void dumpLiquid(Liquid liquid){
|
||||
int dump = this.cdump;
|
||||
|
||||
if(!net.client()) liquid.unlock();
|
||||
if(!net.client() && state.isCampaign()) liquid.unlock();
|
||||
|
||||
for(int i = 0; i < proximity.size; i++){
|
||||
incrementDump(proximity.size);
|
||||
@@ -620,7 +620,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
*/
|
||||
public void offload(Item item){
|
||||
int dump = this.cdump;
|
||||
if(!net.client()) item.unlock();
|
||||
if(!net.client() && state.isCampaign()) item.unlock();
|
||||
|
||||
for(int i = 0; i < proximity.size; i++){
|
||||
incrementDump(proximity.size);
|
||||
@@ -1122,7 +1122,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
|
||||
/** Returns whether or not a hand cursor should be shown over this block. */
|
||||
public Cursor getCursor(){
|
||||
return block.configurable ? SystemCursor.hand : SystemCursor.arrow;
|
||||
return block.configurable && team == player.team() ? SystemCursor.hand : SystemCursor.arrow;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1358,6 +1358,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
@Final
|
||||
@Override
|
||||
public void update(){
|
||||
if(state.isEditor()) return;
|
||||
|
||||
timeScaleDuration -= Time.delta;
|
||||
if(timeScaleDuration <= 0f || !block.canOverdrive){
|
||||
timeScale = 1f;
|
||||
|
||||
@@ -142,7 +142,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw
|
||||
}
|
||||
}
|
||||
|
||||
type.hitTile(self(), tile, health);
|
||||
type.hitTile(self(), tile, health, true);
|
||||
|
||||
return !type.pierceBuilding;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
|
||||
}
|
||||
|
||||
boolean mining(){
|
||||
return mineTile != null && !(((Object)this) instanceof Builderc b && b.activelyBuilding());
|
||||
return mineTile != null && !this.<Unit>self().activelyBuilding();
|
||||
}
|
||||
|
||||
public boolean validMine(Tile tile, boolean checkDst){
|
||||
@@ -44,6 +44,10 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{
|
||||
return validMine(tile, true);
|
||||
}
|
||||
|
||||
public boolean canMine(){
|
||||
return type.mineSpeed > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(){
|
||||
Building core = closestCore();
|
||||
|
||||
@@ -48,11 +48,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
|
||||
transient float textFadeTime;
|
||||
|
||||
public boolean isBuilder(){
|
||||
return unit instanceof Builderc;
|
||||
}
|
||||
|
||||
public boolean isMiner(){
|
||||
return unit instanceof Minerc;
|
||||
return unit.canBuild();
|
||||
}
|
||||
|
||||
public @Nullable CoreBuild closestCore(){
|
||||
@@ -164,14 +160,6 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra
|
||||
return unit;
|
||||
}
|
||||
|
||||
public Minerc miner(){
|
||||
return !(unit instanceof Minerc) ? Nulls.miner : (Minerc)unit;
|
||||
}
|
||||
|
||||
public Builderc builder(){
|
||||
return !(unit instanceof Builderc) ? Nulls.builder : (Builderc)unit;
|
||||
}
|
||||
|
||||
public void unit(Unit unit){
|
||||
if(unit == null) throw new IllegalArgumentException("Unit cannot be null. Use clearUnit() instead.");
|
||||
if(this.unit == unit) return;
|
||||
|
||||
@@ -31,7 +31,7 @@ import mindustry.world.blocks.payloads.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
@Component(base = true)
|
||||
abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc{
|
||||
abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Commanderc, Displayable, Senseable, Ranged, Minerc, Builderc{
|
||||
|
||||
@Import boolean hovering, dead;
|
||||
@Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo, minFormationSpeed;
|
||||
@@ -88,8 +88,8 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
||||
|
||||
/** @return where the unit wants to look at. */
|
||||
public float prefRotation(){
|
||||
if(this instanceof Builderc builder && builder.activelyBuilding()){
|
||||
return angleTo(builder.buildPlan());
|
||||
if(activelyBuilding()){
|
||||
return angleTo(buildPlan());
|
||||
}else if(mineTile() != null){
|
||||
return angleTo(mineTile());
|
||||
}else if(moving()){
|
||||
|
||||
@@ -24,8 +24,8 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{
|
||||
|
||||
/** weapon mount array, never null */
|
||||
@SyncLocal WeaponMount[] mounts = {};
|
||||
@ReadOnly transient float aimX, aimY;
|
||||
@ReadOnly transient boolean isRotate;
|
||||
transient float aimX, aimY;
|
||||
boolean isShooting;
|
||||
float ammo;
|
||||
|
||||
@@ -117,6 +117,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{
|
||||
}else{
|
||||
mount.bullet.rotation(weaponRotation + 90);
|
||||
mount.bullet.set(shootX, shootY);
|
||||
mount.reload = weapon.reload;
|
||||
vel.add(Tmp.v1.trns(rotation + 180f, mount.bullet.type.recoil));
|
||||
if(weapon.shootSound != Sounds.none && !headless){
|
||||
if(mount.sound == null) mount.sound = new SoundLoop(weapon.shootSound, 1f);
|
||||
|
||||
@@ -142,6 +142,10 @@ public class AIController implements UnitController{
|
||||
mount.rotate = shoot;
|
||||
|
||||
unit.isShooting |= shoot;
|
||||
if(shoot){
|
||||
unit.aimX = mount.aimX;
|
||||
unit.aimY = mount.aimY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +43,8 @@ public class SectorInfo{
|
||||
public boolean waves = true;
|
||||
/** Whether attack mode is enabled here. */
|
||||
public boolean attack = false;
|
||||
/** Whether this sector has any enemy spawns. */
|
||||
public boolean hasSpawns = true;
|
||||
/** Wave # from state */
|
||||
public int wave = 1, winWave = -1;
|
||||
/** Waves this sector can survive if under attack. Based on wave in info. <0 means uncalculated. */
|
||||
@@ -168,6 +170,7 @@ public class SectorInfo{
|
||||
secondsPassed = 0;
|
||||
wavesPassed = 0;
|
||||
damage = 0;
|
||||
hasSpawns = spawner.countSpawns() > 0;
|
||||
|
||||
if(state.rules.sector != null){
|
||||
state.rules.sector.saveInfo();
|
||||
|
||||
@@ -206,7 +206,7 @@ public class Universe{
|
||||
}
|
||||
|
||||
//queue random invasions
|
||||
if(!sector.isAttacked() && turn > invasionGracePeriod){
|
||||
if(!sector.isAttacked() && turn > invasionGracePeriod && sector.info.hasSpawns){
|
||||
//invasion chance depends on # of nearby bases
|
||||
if(Mathf.chance(baseInvasionChance * sector.near().count(Sector::hasEnemyBase))){
|
||||
int waveMax = Math.max(sector.info.winWave, sector.isBeingPlayed() ? state.wave : sector.info.wave + sector.info.wavesPassed) + Mathf.random(2, 5) * 5;
|
||||
|
||||
@@ -28,7 +28,7 @@ public class OverlayRenderer{
|
||||
if(player.dead()) return;
|
||||
|
||||
if(player.isBuilder()){
|
||||
player.builder().drawBuildRequests();
|
||||
player.unit().drawBuildRequests();
|
||||
}
|
||||
|
||||
input.drawBottom();
|
||||
|
||||
@@ -71,8 +71,8 @@ public class Shaders{
|
||||
setUniformf("u_rcampos", Tmp.v31.set(camera.position).sub(planet.position));
|
||||
setUniformf("u_light", planet.getLightNormal());
|
||||
setUniformf("u_color", planet.atmosphereColor.r, planet.atmosphereColor.g, planet.atmosphereColor.b);
|
||||
setUniformf("u_innerRadius", planet.radius + 0.02f);
|
||||
setUniformf("u_outerRadius", planet.radius * 1.3f);
|
||||
setUniformf("u_innerRadius", planet.radius + planet.atmosphereRadIn);
|
||||
setUniformf("u_outerRadius", planet.radius + planet.atmosphereRadOut);
|
||||
|
||||
setUniformMatrix4("u_model", planet.getTransform(mat).val);
|
||||
setUniformMatrix4("u_projection", camera.combined.val);
|
||||
|
||||
@@ -77,8 +77,6 @@ public class MeshBuilder{
|
||||
|
||||
if(c.length > 5){
|
||||
verts(c[0].v, c[4].v, c[5].v, nor, color);
|
||||
}else{
|
||||
verts(c[0].v, c[3].v, c[4].v, nor, color);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@ public class PlanetRenderer implements Disposable{
|
||||
camPos.set(0, 0f, camLength);
|
||||
projector.setScaling(1f / 150f);
|
||||
cam.fov = 60f;
|
||||
cam.far = 150f;
|
||||
}
|
||||
|
||||
/** Render the entire planet scene to the screen. */
|
||||
@@ -93,6 +94,8 @@ public class PlanetRenderer implements Disposable{
|
||||
|
||||
renderPlanet(solarSystem);
|
||||
|
||||
renderTransparent(solarSystem);
|
||||
|
||||
endBloom();
|
||||
|
||||
Events.fire(Trigger.universeDrawEnd);
|
||||
@@ -125,11 +128,21 @@ public class PlanetRenderer implements Disposable{
|
||||
|
||||
renderOrbit(planet);
|
||||
|
||||
for(Planet child : planet.children){
|
||||
renderPlanet(child);
|
||||
}
|
||||
}
|
||||
|
||||
public void renderTransparent(Planet planet){
|
||||
if(!planet.visible()) return;
|
||||
|
||||
if(planet.isLandable() && planet == this.planet){
|
||||
renderSectors(planet);
|
||||
}
|
||||
|
||||
if(planet.parent != null && planet.hasAtmosphere && Core.settings.getBool("atmosphere")){
|
||||
Gl.depthMask(false);
|
||||
|
||||
Blending.additive.apply();
|
||||
|
||||
Shaders.atmosphere.camera = cam;
|
||||
@@ -140,10 +153,12 @@ public class PlanetRenderer implements Disposable{
|
||||
atmosphere.render(Shaders.atmosphere, Gl.triangles);
|
||||
|
||||
Blending.normal.apply();
|
||||
|
||||
Gl.depthMask(true);
|
||||
}
|
||||
|
||||
for(Planet child : planet.children){
|
||||
renderPlanet(child);
|
||||
renderTransparent(child);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,7 +167,7 @@ public class PlanetRenderer implements Disposable{
|
||||
|
||||
Vec3 center = planet.parent.position;
|
||||
float radius = planet.orbitRadius;
|
||||
int points = (int)(radius * 50);
|
||||
int points = (int)(radius * 10);
|
||||
Angles.circleVectors(points, radius, (cx, cy) -> batch.vertex(Tmp.v32.set(center).add(cx, 0, cy), Pal.gray));
|
||||
batch.flush(Gl.lineLoop);
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public class DesktopInput extends InputHandler{
|
||||
group.fill(t -> {
|
||||
t.bottom();
|
||||
t.visible(() -> {
|
||||
t.color.a = Mathf.lerpDelta(t.color.a, player.builder().isBuilding() ? 1f : 0f, 0.15f);
|
||||
t.color.a = Mathf.lerpDelta(t.color.a, player.unit().isBuilding() ? 1f : 0f, 0.15f);
|
||||
|
||||
return ui.hudfrag.shown && Core.settings.getBool("hints") && selectRequests.isEmpty() && t.color.a > 0.01f;
|
||||
});
|
||||
@@ -290,7 +290,7 @@ public class DesktopInput extends InputHandler{
|
||||
cursorType = cursor.build.getCursor();
|
||||
}
|
||||
|
||||
if(isPlacing() || !selectRequests.isEmpty()){
|
||||
if((isPlacing() && player.isBuilder()) || !selectRequests.isEmpty()){
|
||||
cursorType = SystemCursor.hand;
|
||||
}
|
||||
|
||||
@@ -366,7 +366,7 @@ public class DesktopInput extends InputHandler{
|
||||
int rawCursorX = World.toTile(Core.input.mouseWorld().x), rawCursorY = World.toTile(Core.input.mouseWorld().y);
|
||||
|
||||
// automatically pause building if the current build queue is empty
|
||||
if(Core.settings.getBool("buildautopause") && isBuilding && !player.builder().isBuilding()){
|
||||
if(Core.settings.getBool("buildautopause") && isBuilding && !player.unit().isBuilding()){
|
||||
isBuilding = false;
|
||||
buildWasAutoPaused = true;
|
||||
}
|
||||
@@ -383,12 +383,12 @@ public class DesktopInput extends InputHandler{
|
||||
schematicY += shiftY;
|
||||
}
|
||||
|
||||
if(Core.input.keyTap(Binding.deselect)){
|
||||
player.miner().mineTile(null);
|
||||
if(Core.input.keyTap(Binding.deselect) && !isPlacing()){
|
||||
player.unit().mineTile = null;
|
||||
}
|
||||
|
||||
if(Core.input.keyTap(Binding.clear_building)){
|
||||
player.builder().clearBuilding();
|
||||
player.unit().clearBuilding();
|
||||
}
|
||||
|
||||
if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard() && mode != breaking){
|
||||
@@ -480,8 +480,8 @@ public class DesktopInput extends InputHandler{
|
||||
deleting = true;
|
||||
}else if(selected != null){
|
||||
//only begin shooting if there's no cursor event
|
||||
if(!tileTapped(selected.build) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !player.builder().activelyBuilding() && !droppingItem &&
|
||||
!tryBeginMine(selected) && player.miner().mineTile() == null && !Core.scene.hasKeyboard()){
|
||||
if(!tileTapped(selected.build) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && !player.unit().activelyBuilding() && !droppingItem &&
|
||||
!tryBeginMine(selected) && player.unit().mineTile == null && !Core.scene.hasKeyboard()){
|
||||
player.shooting = shouldShoot;
|
||||
}
|
||||
}else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine
|
||||
@@ -506,7 +506,7 @@ public class DesktopInput extends InputHandler{
|
||||
if(Core.input.keyDown(Binding.select) && mode == none && !isPlacing() && deleting){
|
||||
BuildPlan req = getRequest(cursorX, cursorY);
|
||||
if(req != null && req.breaking){
|
||||
player.builder().plans().remove(req);
|
||||
player.unit().plans().remove(req);
|
||||
}
|
||||
}else{
|
||||
deleting = false;
|
||||
@@ -547,7 +547,7 @@ public class DesktopInput extends InputHandler{
|
||||
|
||||
if(sreq != null){
|
||||
if(getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null){
|
||||
player.builder().plans().remove(sreq, true);
|
||||
player.unit().plans().remove(sreq, true);
|
||||
}
|
||||
sreq = null;
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
|
||||
@Remote(variants = Variant.one)
|
||||
public static void removeQueueBlock(int x, int y, boolean breaking){
|
||||
player.builder().removeBuild(x, y, breaking);
|
||||
player.unit().removeBuild(x, y, breaking);
|
||||
}
|
||||
|
||||
@Remote(targets = Loc.both, called = Loc.server)
|
||||
@@ -383,7 +383,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
|
||||
public Eachable<BuildPlan> allRequests(){
|
||||
return cons -> {
|
||||
for(BuildPlan request : player.builder().plans()) cons.get(request);
|
||||
for(BuildPlan request : player.unit().plans()) cons.get(request);
|
||||
for(BuildPlan request : selectRequests) cons.get(request);
|
||||
for(BuildPlan request : lineRequests) cons.get(request);
|
||||
};
|
||||
@@ -401,7 +401,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
player.typing = ui.chatfrag.shown();
|
||||
|
||||
if(player.isBuilder()){
|
||||
player.builder().updateBuilding(isBuilding);
|
||||
player.unit().updateBuilding(isBuilding);
|
||||
}
|
||||
|
||||
if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && player.unit().ammo <= 0){
|
||||
@@ -653,7 +653,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
return r2.overlaps(r1);
|
||||
};
|
||||
|
||||
for(BuildPlan req : player.builder().plans()){
|
||||
for(BuildPlan req : player.unit().plans()){
|
||||
if(test.get(req)) return req;
|
||||
}
|
||||
|
||||
@@ -678,7 +678,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
Draw.color(Pal.remove);
|
||||
Lines.stroke(1f);
|
||||
|
||||
for(BuildPlan req : player.builder().plans()){
|
||||
for(BuildPlan req : player.unit().plans()){
|
||||
if(req.breaking) continue;
|
||||
if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){
|
||||
drawBreaking(req);
|
||||
@@ -740,7 +740,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
for(BuildPlan req : requests){
|
||||
if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){
|
||||
BuildPlan copy = req.copy();
|
||||
player.builder().addBuild(copy);
|
||||
player.unit().addBuild(copy);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -778,7 +778,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
|
||||
/** Remove everything from the queue in a selection. */
|
||||
protected void removeSelection(int x1, int y1, int x2, int y2, boolean flush){
|
||||
removeSelection(x1, y1, x2, y2, false, maxLength);
|
||||
removeSelection(x1, y1, x2, y2, flush, maxLength);
|
||||
}
|
||||
|
||||
/** Remove everything from the queue in a selection. */
|
||||
@@ -804,7 +804,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
//remove build requests
|
||||
Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize);
|
||||
|
||||
Iterator<BuildPlan> it = player.builder().plans().iterator();
|
||||
Iterator<BuildPlan> it = player.unit().plans().iterator();
|
||||
while(it.hasNext()){
|
||||
BuildPlan req = it.next();
|
||||
if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){
|
||||
@@ -925,7 +925,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
boolean tryBeginMine(Tile tile){
|
||||
if(canMine(tile)){
|
||||
//if a block is clicked twice, reset it
|
||||
player.miner().mineTile(player.miner().mineTile() == tile ? null : tile);
|
||||
player.unit().mineTile = player.unit().mineTile == tile ? null : tile;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -934,7 +934,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
boolean canMine(Tile tile){
|
||||
return !Core.scene.hasMouse()
|
||||
&& tile.drop() != null
|
||||
&& player.miner().validMine(tile)
|
||||
&& player.unit().validMine(tile)
|
||||
&& !(tile.floor().playerUnmineable && tile.overlay().itemDrop == null)
|
||||
&& player.unit().acceptsItem(tile.drop())
|
||||
&& tile.block() == Blocks.air;
|
||||
@@ -1044,7 +1044,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
}
|
||||
|
||||
public boolean canShoot(){
|
||||
return block == null && !onConfigurable() && !isDroppingItem() && !player.builder().activelyBuilding() &&
|
||||
return block == null && !onConfigurable() && !isDroppingItem() && !player.unit().activelyBuilding() &&
|
||||
!(player.unit() instanceof Mechc && player.unit().isFlying());
|
||||
}
|
||||
|
||||
@@ -1090,7 +1090,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
}
|
||||
|
||||
public boolean validPlace(int x, int y, Block type, int rotation, BuildPlan ignore){
|
||||
for(BuildPlan req : player.builder().plans()){
|
||||
for(BuildPlan req : player.unit().plans()){
|
||||
if(req != ignore
|
||||
&& !req.breaking
|
||||
&& req.block.bounds(req.x, req.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2))
|
||||
@@ -1108,15 +1108,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
public void placeBlock(int x, int y, Block block, int rotation){
|
||||
BuildPlan req = getRequest(x, y);
|
||||
if(req != null){
|
||||
player.builder().plans().remove(req);
|
||||
player.unit().plans().remove(req);
|
||||
}
|
||||
player.builder().addBuild(new BuildPlan(x, y, rotation, block, block.nextConfig()));
|
||||
player.unit().addBuild(new BuildPlan(x, y, rotation, block, block.nextConfig()));
|
||||
}
|
||||
|
||||
public void breakBlock(int x, int y){
|
||||
Tile tile = world.tile(x, y);
|
||||
if(tile != null && tile.build != null) tile = tile.build.tile;
|
||||
player.builder().addBuild(new BuildPlan(tile.x, tile.y));
|
||||
player.unit().addBuild(new BuildPlan(tile.x, tile.y));
|
||||
}
|
||||
|
||||
public void drawArrow(Block block, int x, int y, int rotation){
|
||||
|
||||
@@ -114,7 +114,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
}
|
||||
}
|
||||
|
||||
for(BuildPlan req : player.builder().plans()){
|
||||
for(BuildPlan req : player.unit().plans()){
|
||||
Tile other = world.tile(req.x, req.y);
|
||||
|
||||
if(other == null || req.breaking) continue;
|
||||
@@ -219,10 +219,10 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
BuildPlan copy = request.copy();
|
||||
|
||||
if(other == null){
|
||||
player.builder().addBuild(copy);
|
||||
player.unit().addBuild(copy);
|
||||
}else if(!other.breaking && other.x == request.x && other.y == request.y && other.block.size == request.block.size){
|
||||
player.builder().plans().remove(other);
|
||||
player.builder().addBuild(copy);
|
||||
player.unit().plans().remove(other);
|
||||
player.unit().addBuild(copy);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,10 +245,10 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
Boolp schem = () -> lastSchematic != null && !selectRequests.isEmpty();
|
||||
|
||||
group.fill(t -> {
|
||||
t.visible(() -> (player.builder().isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !schem.get());
|
||||
t.visible(() -> (player.unit().isBuilding() || block != null || mode == breaking || !selectRequests.isEmpty()) && !schem.get());
|
||||
t.bottom().left();
|
||||
t.button("@cancel", Icon.cancel, () -> {
|
||||
player.builder().clearBuilding();
|
||||
player.unit().clearBuilding();
|
||||
selectRequests.clear();
|
||||
mode = none;
|
||||
block = null;
|
||||
@@ -914,7 +914,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
}
|
||||
|
||||
//update shooting if not building + not mining
|
||||
if(!player.builder().isBuilding() && player.miner().mineTile() == null){
|
||||
if(!player.unit().isBuilding() && player.unit().mineTile == null){
|
||||
|
||||
//autofire targeting
|
||||
if(manualShooting){
|
||||
|
||||
@@ -14,6 +14,7 @@ import mindustry.world.*;
|
||||
/** "Compiles" a sequence of statements into instructions. */
|
||||
public class LAssembler{
|
||||
public static ObjectMap<String, Func<String[], LStatement>> customParsers = new ObjectMap<>();
|
||||
public static final int maxTokenLength = 40;
|
||||
|
||||
private int lastVar;
|
||||
/** Maps names to variable IDs. */
|
||||
@@ -122,7 +123,7 @@ public class LAssembler{
|
||||
if(c == '"'){
|
||||
inString = !inString;
|
||||
}else if(c == ' ' && !inString){
|
||||
tokens.add(line.substring(lastIdx, i));
|
||||
tokens.add(line.substring(lastIdx, Math.min(i, lastIdx + maxTokenLength)));
|
||||
lastIdx = i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -321,13 +321,8 @@ public class LExecutor{
|
||||
((LogicAI)unit.controller()).controller = exec.building(varThis);
|
||||
|
||||
//clear old state
|
||||
if(unit instanceof Minerc miner){
|
||||
miner.mineTile(null);
|
||||
}
|
||||
|
||||
if(unit instanceof Builderc builder){
|
||||
builder.clearBuilding();
|
||||
}
|
||||
unit.mineTile = null;
|
||||
unit.clearBuilding();
|
||||
|
||||
return (LogicAI)unit.controller();
|
||||
}
|
||||
@@ -357,12 +352,8 @@ public class LExecutor{
|
||||
|
||||
//stop mining/building
|
||||
if(type == LUnitControl.stop){
|
||||
if(unit instanceof Minerc miner){
|
||||
miner.mineTile(null);
|
||||
}
|
||||
if(unit instanceof Builderc build){
|
||||
build.clearBuilding();
|
||||
}
|
||||
unit.mineTile = null;
|
||||
unit.clearBuilding();
|
||||
}
|
||||
}
|
||||
case within -> {
|
||||
@@ -390,8 +381,8 @@ public class LExecutor{
|
||||
}
|
||||
case mine -> {
|
||||
Tile tile = world.tileWorld(x1, y1);
|
||||
if(unit instanceof Minerc miner){
|
||||
miner.mineTile(miner.validMine(tile) ? tile : null);
|
||||
if(unit.canMine()){
|
||||
unit.mineTile = unit.validMine(tile) ? tile : null;
|
||||
}
|
||||
}
|
||||
case payDrop -> {
|
||||
@@ -432,12 +423,12 @@ public class LExecutor{
|
||||
}
|
||||
}
|
||||
case build -> {
|
||||
if(unit instanceof Builderc builder && exec.obj(p3) instanceof Block block){
|
||||
if(unit.canBuild() && exec.obj(p3) instanceof Block block){
|
||||
int x = World.toTile(x1), y = World.toTile(y1);
|
||||
int rot = exec.numi(p4);
|
||||
|
||||
//reset state of last request when necessary
|
||||
if(ai.plan.x != x || ai.plan.y != y || ai.plan.block != block || builder.plans().isEmpty()){
|
||||
if(ai.plan.x != x || ai.plan.y != y || ai.plan.block != block || unit.plans.isEmpty()){
|
||||
ai.plan.progress = 0;
|
||||
ai.plan.initialized = false;
|
||||
ai.plan.stuck = false;
|
||||
@@ -446,11 +437,11 @@ public class LExecutor{
|
||||
ai.plan.set(x, y, rot, block);
|
||||
ai.plan.config = exec.obj(p5) instanceof Content c ? c : null;
|
||||
|
||||
builder.clearBuilding();
|
||||
unit.clearBuilding();
|
||||
|
||||
if(ai.plan.tile() != null){
|
||||
builder.updateBuilding(true);
|
||||
builder.addBuild(ai.plan);
|
||||
unit.updateBuilding = true;
|
||||
unit.addBuild(ai.plan);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public abstract class LStatement{
|
||||
|
||||
protected Cell<TextField> field(Table table, String value, Cons<String> setter){
|
||||
return table.field(value, Styles.nodeField, setter)
|
||||
.size(144f, 40f).pad(2f).color(table.color).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){
|
||||
|
||||
@@ -11,6 +11,7 @@ import mindustry.world.*;
|
||||
public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{
|
||||
protected IntSeq ints = new IntSeq();
|
||||
protected Sector sector;
|
||||
protected Simplex noise = new Simplex();
|
||||
|
||||
/** Should generate sector bases for a planet. */
|
||||
public void generateSector(Sector sector){
|
||||
@@ -46,6 +47,12 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float noise(float x, float y, double octaves, double falloff, double scl, double mag){
|
||||
Vec3 v = sector.rect.project(x, y);
|
||||
return (float)noise.octaveNoise3D(octaves, falloff, 1f / scl, v.x, v.y, v.z) * (float)mag;
|
||||
}
|
||||
|
||||
public void generate(Tiles tiles, Sector sec){
|
||||
this.tiles = tiles;
|
||||
this.sector = sec;
|
||||
|
||||
@@ -16,7 +16,6 @@ import mindustry.world.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class SerpuloPlanetGenerator extends PlanetGenerator{
|
||||
Simplex noise = new Simplex();
|
||||
RidgedPerlin rid = new RidgedPerlin(1, 2);
|
||||
BaseGenerator basegen = new BaseGenerator();
|
||||
float scl = 5f;
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package mindustry.maps.planet;
|
||||
|
||||
import arc.graphics.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import mindustry.maps.generators.*;
|
||||
|
||||
public class TantrosPlanetGenerator extends PlanetGenerator{
|
||||
Color c1 = Color.valueOf("5057a6"), c2 = Color.valueOf("272766"), out = new Color();
|
||||
|
||||
@Override
|
||||
public float getHeight(Vec3 position){
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Color getColor(Vec3 position){
|
||||
float depth = (float)noise.octaveNoise3D(2, 0.56, 1.7f, position.x, position.y, position.z) / 1.7f;
|
||||
return c1.write(out).lerp(c2, Mathf.clamp(Mathf.round(depth, 0.15f))).a(0.6f);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package mindustry.net;
|
||||
|
||||
import arc.struct.*;
|
||||
import arc.struct.Seq.*;
|
||||
import mindustry.gen.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
/** Handles player state for sending to every connected player*/
|
||||
public class WorldReloader{
|
||||
Seq<Player> players = new Seq<>();
|
||||
boolean wasServer = false;
|
||||
boolean began = false;
|
||||
|
||||
/** Begins reloading the world. Sends world begin packets to each user and stores player state.
|
||||
* If the current client is not a server, this resets state and disconnects. */
|
||||
public void begin(){
|
||||
//don't begin twice
|
||||
if(began) return;
|
||||
|
||||
if(wasServer = net.server()){
|
||||
players.clear();
|
||||
|
||||
for(Player p : Groups.player){
|
||||
if(p.isLocal()) continue;
|
||||
|
||||
players.add(p);
|
||||
p.clearUnit();
|
||||
}
|
||||
|
||||
logic.reset();
|
||||
|
||||
Call.worldDataBegin();
|
||||
}else{
|
||||
net.reset();
|
||||
logic.reset();
|
||||
}
|
||||
|
||||
began = true;
|
||||
}
|
||||
|
||||
/** Ends reloading the world. Sends world data to each player.
|
||||
* If the current client was not a server, does nothing.*/
|
||||
public void end(){
|
||||
if(wasServer){
|
||||
for(Player p : players){
|
||||
if(p.con == null) continue;
|
||||
|
||||
boolean wasAdmin = p.admin;
|
||||
p.reset();
|
||||
p.admin = wasAdmin;
|
||||
if(state.rules.pvp){
|
||||
p.team(netServer.assignTeam(p, new SeqIterable<>(players)));
|
||||
}
|
||||
netServer.sendWorldData(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ import static mindustry.Vars.*;
|
||||
|
||||
public class Planet extends UnlockableContent{
|
||||
/** Default spacing between planet orbits in world units. */
|
||||
private static final float orbitSpacing = 10f;
|
||||
private static final float orbitSpacing = 9f;
|
||||
/** intersect() temp var. */
|
||||
private static final Vec3 intersectResult = new Vec3();
|
||||
/** Mesh used for rendering. Created on load() - will be null on the server! */
|
||||
@@ -33,6 +33,8 @@ public class Planet extends UnlockableContent{
|
||||
public Seq<Sector> sectors;
|
||||
/** Radius of this planet's sphere. Does not take into account sattelites. */
|
||||
public float radius;
|
||||
/** Atmosphere radius adjustment parameters. */
|
||||
public float atmosphereRadIn = 0, atmosphereRadOut = 0.3f;
|
||||
/** Orbital radius around the sun. Do not change unless you know exactly what you are doing.*/
|
||||
public float orbitRadius;
|
||||
/** Total radius of this planet and all its children. */
|
||||
@@ -51,6 +53,8 @@ public class Planet extends UnlockableContent{
|
||||
public int startSector = 0;
|
||||
/** Whether the bloom render effect is enabled. */
|
||||
public boolean bloom = false;
|
||||
/** Whether this planet is displayed. */
|
||||
public boolean visible = true;
|
||||
/** For suns, this is the color that shines on other planets. Does nothing for children. */
|
||||
public Color lightColor = Color.white.cpy();
|
||||
/** Atmosphere tint for landable planets. */
|
||||
@@ -264,7 +268,7 @@ public class Planet extends UnlockableContent{
|
||||
}
|
||||
|
||||
public boolean visible(){
|
||||
return true;
|
||||
return visible;
|
||||
}
|
||||
|
||||
public void draw(Mat3D projection, Mat3D transform){
|
||||
|
||||
@@ -103,7 +103,7 @@ public class Sector{
|
||||
|
||||
/** @return whether the enemy has a generated base here. */
|
||||
public boolean hasEnemyBase(){
|
||||
return generateEnemyBase && (save == null || info.attack);
|
||||
return ((generateEnemyBase && preset == null) || (preset != null && preset.captureWave == 0)) && (save == null || info.attack);
|
||||
}
|
||||
|
||||
public boolean isBeingPlayed(){
|
||||
@@ -198,7 +198,7 @@ public class Sector{
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
return planet.name + "#" + id;
|
||||
return planet.name + "#" + id + " (" + name() + ")";
|
||||
}
|
||||
|
||||
/** Projects this sector onto a 4-corner square for use in map gen.
|
||||
|
||||
@@ -80,7 +80,7 @@ public class UnitType extends UnlockableContent{
|
||||
public int ammoCapacity = -1;
|
||||
public AmmoType ammoType = AmmoTypes.copper;
|
||||
public int mineTier = -1;
|
||||
public float buildSpeed = 1f, mineSpeed = 1f;
|
||||
public float buildSpeed = -1f, mineSpeed = 1f;
|
||||
public Sound mineSound = Sounds.minebeam;
|
||||
public float mineSoundVolume = 0.6f;
|
||||
|
||||
@@ -225,7 +225,7 @@ public class UnitType extends UnlockableContent{
|
||||
stats.addPercent(Stat.mineSpeed, mineSpeed);
|
||||
stats.add(Stat.mineTier, new BlockFilterValue(b -> b instanceof Floor f && f.itemDrop != null && f.itemDrop.hardness <= mineTier && !f.playerUnmineable));
|
||||
}
|
||||
if(inst instanceof Builderc){
|
||||
if(buildSpeed > 0){
|
||||
stats.addPercent(Stat.buildSpeed, buildSpeed);
|
||||
}
|
||||
if(inst instanceof Payloadc){
|
||||
@@ -374,7 +374,7 @@ public class UnitType extends UnlockableContent{
|
||||
if(stacks != null){
|
||||
ItemStack[] out = new ItemStack[stacks.length];
|
||||
for(int i = 0; i < out.length; i++){
|
||||
out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50)));
|
||||
out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.11) * 50)));
|
||||
}
|
||||
|
||||
return out;
|
||||
|
||||
@@ -31,9 +31,13 @@ public class Bar extends Element{
|
||||
this.fraction = fraction;
|
||||
lastValue = value = Mathf.clamp(fraction.get());
|
||||
update(() -> {
|
||||
this.name = name.get();
|
||||
this.blinkColor.set(color.get());
|
||||
setColor(color.get());
|
||||
try{
|
||||
this.name = name.get();
|
||||
this.blinkColor.set(color.get());
|
||||
setColor(color.get());
|
||||
}catch(Exception e){ //getting the fraction may involve referring to invalid data
|
||||
this.name = "";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -95,6 +95,7 @@ public class Fonts{
|
||||
var region = new TextureRegion();
|
||||
int code = Iconc.codes.get(name, '\uF8D4');
|
||||
var glyph = iconLarge.getData().getGlyph((char)code);
|
||||
if(glyph == null) return Core.atlas.find("error");
|
||||
region.set(iconLarge.getRegion().texture);
|
||||
region.set(glyph.u, glyph.v2, glyph.u2, glyph.v);
|
||||
return region;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package mindustry.ui.dialogs;
|
||||
|
||||
import arc.*;
|
||||
import mindustry.core.GameState.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.game.*;
|
||||
import mindustry.type.*;
|
||||
@@ -15,6 +16,8 @@ public class GameOverDialog extends BaseDialog{
|
||||
super("@gameover");
|
||||
setFillParent(true);
|
||||
shown(this::rebuild);
|
||||
|
||||
Events.on(ResetEvent.class, e -> hide());
|
||||
}
|
||||
|
||||
public void show(Team winner){
|
||||
@@ -49,47 +52,51 @@ public class GameOverDialog extends BaseDialog{
|
||||
cont.pane(t -> {
|
||||
t.margin(13f);
|
||||
t.left().defaults().left();
|
||||
t.add(Core.bundle.format("stat.wave", state.stats.wavesLasted));
|
||||
t.row();
|
||||
t.add(Core.bundle.format("stat.enemiesDestroyed", state.stats.enemyUnitsDestroyed));
|
||||
t.row();
|
||||
t.add(Core.bundle.format("stat.built", state.stats.buildingsBuilt));
|
||||
t.row();
|
||||
t.add(Core.bundle.format("stat.destroyed", state.stats.buildingsDestroyed));
|
||||
t.row();
|
||||
t.add(Core.bundle.format("stat.deconstructed", state.stats.buildingsDeconstructed));
|
||||
t.row();
|
||||
t.add(Core.bundle.format("stat.wave", state.stats.wavesLasted)).row();
|
||||
t.add(Core.bundle.format("stat.enemiesDestroyed", state.stats.enemyUnitsDestroyed)).row();
|
||||
t.add(Core.bundle.format("stat.built", state.stats.buildingsBuilt)).row();
|
||||
t.add(Core.bundle.format("stat.destroyed", state.stats.buildingsDestroyed)).row();
|
||||
t.add(Core.bundle.format("stat.deconstructed", state.stats.buildingsDeconstructed)).row();
|
||||
if(control.saves.getCurrent() != null){
|
||||
t.add(Core.bundle.format("stat.playtime", control.saves.getCurrent().getPlayTime()));
|
||||
t.row();
|
||||
t.add(Core.bundle.format("stat.playtime", control.saves.getCurrent().getPlayTime())).row();
|
||||
}
|
||||
if(state.isCampaign() && !state.stats.itemsDelivered.isEmpty()){
|
||||
t.add("@stat.delivered");
|
||||
t.row();
|
||||
t.add("@stat.delivered").row();
|
||||
for(Item item : content.items()){
|
||||
if(state.stats.itemsDelivered.get(item, 0) > 0){
|
||||
t.table(items -> {
|
||||
items.add(" [lightgray]" + state.stats.itemsDelivered.get(item, 0));
|
||||
items.image(item.icon(Cicon.small)).size(8 * 3).pad(4);
|
||||
}).left();
|
||||
t.row();
|
||||
}).left().row();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(state.isCampaign() && net.client()){
|
||||
t.add("@gameover.waiting").padTop(20f).row();
|
||||
}
|
||||
|
||||
}).pad(12);
|
||||
|
||||
if(state.isCampaign()){
|
||||
buttons.button("@continue", () -> {
|
||||
hide();
|
||||
logic.reset();
|
||||
ui.planet.show();
|
||||
}).size(130f, 60f);
|
||||
if(net.client()){
|
||||
buttons.button("@gameover.disconnect", () -> {
|
||||
logic.reset();
|
||||
net.reset();
|
||||
hide();
|
||||
state.set(State.menu);
|
||||
}).size(170f, 60f);
|
||||
}else{
|
||||
buttons.button("@continue", () -> {
|
||||
hide();
|
||||
ui.planet.show();
|
||||
}).size(170f, 60f);
|
||||
}
|
||||
}else{
|
||||
buttons.button("@menu", () -> {
|
||||
hide();
|
||||
logic.reset();
|
||||
}).size(130f, 60f);
|
||||
}).size(140f, 60f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,6 +103,8 @@ public class LaunchLoadoutDialog extends BaseDialog{
|
||||
ButtonGroup<Button> group = new ButtonGroup<>();
|
||||
selected = universe.getLoadout(core);
|
||||
|
||||
cont.add(Core.bundle.format("launch.from", sector.name())).row();
|
||||
|
||||
cont.pane(t -> {
|
||||
int i = 0;
|
||||
|
||||
|
||||
@@ -283,7 +283,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
||||
}
|
||||
}
|
||||
|
||||
Sector current = state.getSector() != null && state.getSector().isBeingPlayed() ? state.getSector() : null;
|
||||
Sector current = state.getSector() != null && state.getSector().isBeingPlayed() && state.getSector().planet == planets.planet ? state.getSector() : null;
|
||||
|
||||
if(current != null){
|
||||
planets.fill(current, hoverColor, -0.001f);
|
||||
@@ -418,6 +418,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
||||
Planet planet = content.planets().get(i);
|
||||
if(planet.accessible){
|
||||
pt.button(planet.localizedName, Styles.clearTogglet, () -> {
|
||||
selected = null;
|
||||
launchSector = null;
|
||||
renderer.planets.planet = planet;
|
||||
}).width(200).height(40).growX().update(bb -> bb.setChecked(renderer.planets.planet == planet));
|
||||
pt.row();
|
||||
@@ -485,6 +487,10 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
||||
hoverLabel.remove();
|
||||
}
|
||||
|
||||
if(launching && selected != null){
|
||||
lookAt(selected, 0.1f);
|
||||
}
|
||||
|
||||
if(showing()){
|
||||
Sector to = newPresets.peek();
|
||||
|
||||
@@ -673,7 +679,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
|
||||
if(sector.info.wavesSurvived >= 0 && sector.info.wavesSurvived - sector.info.wavesPassed >= 0 && !sector.isBeingPlayed()){
|
||||
int toCapture = sector.info.attack || sector.info.winWave <= 1 ? -1 : sector.info.winWave - (sector.info.wave + sector.info.wavesPassed);
|
||||
boolean plus = (sector.info.wavesSurvived - sector.info.wavesPassed) >= SectorDamage.maxRetWave - 1;
|
||||
stable.add("[accent]Survives " + Math.min(sector.info.wavesSurvived - sector.info.wavesPassed, toCapture) +
|
||||
stable.add("[accent]Survives " + Math.min(sector.info.wavesSurvived - sector.info.wavesPassed, toCapture <= 0 ? 200 : 0) +
|
||||
(plus ? "+" : "") + (toCapture < 0 ? "" : "/" + toCapture) + " waves");
|
||||
stable.row();
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ public class ResearchDialog extends BaseDialog{
|
||||
for(Sector sector : planet.sectors){
|
||||
if(sector.hasSave() && sector.hasBase()){
|
||||
ItemSeq cached = sector.items();
|
||||
cache.put(sector, cached);
|
||||
cached.each((item, amount) -> {
|
||||
values[item.id] += amount;
|
||||
total += amount;
|
||||
|
||||
@@ -749,6 +749,14 @@ public class HudFragment extends Fragment{
|
||||
return builder;
|
||||
}
|
||||
|
||||
if(!state.rules.waves && state.isCampaign()){
|
||||
builder.append("[lightgray]").append(Core.bundle.get("sector.curcapture"));
|
||||
}
|
||||
|
||||
if(!state.rules.waves){
|
||||
return builder;
|
||||
}
|
||||
|
||||
if(state.rules.winWave > 1 && state.rules.winWave >= state.wave && state.isCampaign()){
|
||||
builder.append(wavefc.get(state.wave, state.rules.winWave));
|
||||
}else{
|
||||
@@ -774,9 +782,6 @@ public class HudFragment extends Fragment{
|
||||
return builder;
|
||||
}).growX().pad(8f);
|
||||
|
||||
table.update(() -> {
|
||||
//table.background(state.rules.waves ? Tex.wavepane : null);
|
||||
});
|
||||
table.touchable(() -> state.rules.waves ? Touchable.enabled : Touchable.disabled);
|
||||
|
||||
return table;
|
||||
|
||||
@@ -102,7 +102,7 @@ public class PlacementFragment extends Fragment{
|
||||
Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block;
|
||||
Object tryConfig = tile == null ? null : tile.config();
|
||||
|
||||
for(BuildPlan req : player.builder().plans()){
|
||||
for(BuildPlan req : player.unit().plans()){
|
||||
if(!req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).contains(Core.input.mouseWorld())){
|
||||
tryRecipe = req.block;
|
||||
tryConfig = req.config;
|
||||
|
||||
@@ -179,7 +179,7 @@ public class ConstructBlock extends Block{
|
||||
if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){
|
||||
control.input.isBuilding = true;
|
||||
}
|
||||
player.builder().addBuild(new BuildPlan(tile.x, tile.y, rotation, cblock, lastConfig), false);
|
||||
player.unit().addBuild(new BuildPlan(tile.x, tile.y, rotation, cblock, lastConfig), false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
package mindustry.world.blocks.campaign;
|
||||
|
||||
import arc.Graphics.*;
|
||||
import arc.Graphics.Cursor.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.util.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
import mindustry.world.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class Accelerator extends Block{
|
||||
public @Load("launch-arrow") TextureRegion arrowRegion;
|
||||
|
||||
public Block launching = Blocks.coreNucleus;
|
||||
public int[] capacities = new int[content.items().size];
|
||||
|
||||
public Accelerator(String name){
|
||||
super(name);
|
||||
update = true;
|
||||
solid = true;
|
||||
hasItems = true;
|
||||
itemCapacity = 8000;
|
||||
configurable = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
for(ItemStack stack : launching.requirements){
|
||||
capacities[stack.item.id] = stack.amount;
|
||||
}
|
||||
consumes.items(launching.requirements);
|
||||
super.init();
|
||||
}
|
||||
|
||||
public class AcceleratorBuild extends Building{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
super.draw();
|
||||
|
||||
for(int l = 0; l < 4; l++){
|
||||
float length = 7f + l * 5f;
|
||||
Draw.color(team.color, Pal.darkMetal, Mathf.absin(Time.time() + l*50f, 10f, 1f));
|
||||
|
||||
for(int i = 0; i < 4; i++){
|
||||
float rot = i*90f + 45f;
|
||||
Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f);
|
||||
}
|
||||
}
|
||||
|
||||
float rad = size * tilesize / 2f * 0.74f;
|
||||
float scl = 2f;
|
||||
|
||||
Draw.z(Layer.bullet - 0.0001f);
|
||||
Lines.stroke(1.75f, Pal.accent);
|
||||
Lines.square(x, y, rad * 1.22f, 45f);
|
||||
|
||||
Lines.stroke(3f, Pal.accent);
|
||||
Lines.square(x, y, rad, Time.time() / scl);
|
||||
Lines.square(x, y, rad, -Time.time() / scl);
|
||||
|
||||
Draw.color(team.color);
|
||||
|
||||
for(int i = 0; i < 4; i++){
|
||||
float rot = i*90f + 45f + (-Time.time()/3f)%360f;
|
||||
float length = 26f;
|
||||
Draw.rect(arrowRegion, x + Angles.trnsx(rot, length), y + Angles.trnsy(rot, length), rot + 180f);
|
||||
}
|
||||
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor getCursor(){
|
||||
return !state.isCampaign() || !consValid() ? SystemCursor.arrow : super.getCursor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildConfiguration(Table table){
|
||||
deselect();
|
||||
|
||||
if(!state.isCampaign() || !consValid()) return;
|
||||
|
||||
ui.showInfo("@indev.campaign");
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaximumAccepted(Item item){
|
||||
return capacities[item.id];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean acceptItem(Building source, Item item){
|
||||
return items.get(item) < getMaximumAccepted(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,8 @@
|
||||
package mindustry.world.blocks.campaign;
|
||||
|
||||
import arc.*;
|
||||
import arc.Graphics.*;
|
||||
import arc.Graphics.Cursor.*;
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
@@ -54,6 +56,11 @@ public class LaunchPad extends Block{
|
||||
|
||||
public class LaunchPadBuild extends Building{
|
||||
|
||||
@Override
|
||||
public Cursor getCursor(){
|
||||
return !state.isCampaign() ? SystemCursor.arrow : super.getCursor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
super.draw();
|
||||
|
||||
@@ -66,7 +66,7 @@ public abstract class Turret extends ReloadTurret{
|
||||
protected Vec2 tr = new Vec2();
|
||||
protected Vec2 tr2 = new Vec2();
|
||||
|
||||
public @Load(value = "base-@", fallback = "block-@size") TextureRegion baseRegion;
|
||||
public @Load(value = "@-base", fallback = "block-@size") TextureRegion baseRegion;
|
||||
public @Load("@-heat") TextureRegion heatRegion;
|
||||
|
||||
public Cons<TurretBuild> drawer = tile -> Draw.rect(region, tile.x + tr2.x, tile.y + tr2.y, tile.rotation - 90);
|
||||
@@ -101,7 +101,7 @@ public abstract class Turret extends ReloadTurret{
|
||||
super.setStats();
|
||||
|
||||
stats.add(Stat.inaccuracy, (int)inaccuracy, StatUnit.degrees);
|
||||
stats.add(Stat.reload, 60f / reloadTime * shots, StatUnit.none);
|
||||
stats.add(Stat.reload, 60f / reloadTime * (alternate ? 1 : shots), StatUnit.none);
|
||||
stats.add(Stat.targetsAir, targetAir);
|
||||
stats.add(Stat.targetsGround, targetGround);
|
||||
}
|
||||
|
||||