Merge pull request #13 from Timmeey86/baltitenger

Merged master changes and fixed conflicts
This commit is contained in:
Baltazár Radics
2018-12-11 06:56:49 +01:00
committed by GitHub
33 changed files with 414 additions and 533 deletions

View File

@@ -7,7 +7,7 @@ text.link.github.description = Code source du jeu
text.link.dev-builds.description = Versions instables de développement text.link.dev-builds.description = Versions instables de développement
text.link.trello.description = Planning Trello officiel pour les fonctionnalités planifiées. text.link.trello.description = Planning Trello officiel pour les fonctionnalités planifiées.
text.link.itch.io.description = Page web itch.io avec les versions ordinateurs téléchargeables et la version web text.link.itch.io.description = Page web itch.io avec les versions ordinateurs téléchargeables et la version web
text.link.google-play.description = Page Google Play Store du jeu text.link.google-play.description = Page Google Play du jeu
text.link.wiki.description = Wiki officiel de Mindustry text.link.wiki.description = Wiki officiel de Mindustry
text.linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier. text.linkfail = L'ouverture du lien a échoué!\nL'URL a été copiée dans votre presse-papier.
text.screenshot = Capture d'écran enregistrée sur {0} text.screenshot = Capture d'écran enregistrée sur {0}
@@ -414,6 +414,8 @@ mode.freebuild.name = Construction libre
mode.freebuild.description = Ressources limitées et pas de compte à rebours pour les vagues. mode.freebuild.description = Ressources limitées et pas de compte à rebours pour les vagues.
mode.pvp.name = PvP mode.pvp.name = PvP
mode.pvp.description = Lutter contre d'autres joueurs pour gagner ! mode.pvp.description = Lutter contre d'autres joueurs pour gagner !
mode.attack.name = Attaque
mode.attack.descrption = Pas de vagues, le but est de détruire la base ennemie.
content.item.name = Objets content.item.name = Objets
content.liquid.name = Liquides content.liquid.name = Liquides
content.unit.name = Unités content.unit.name = Unités

View File

@@ -1,4 +1,4 @@
text.credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недороботки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[GREEN]xga\n[BLACK]XZimur text.credits.text = Создатель [ROYAL] Anuken. - [SKY]anukendev@gmail.com[][]\n\nЕсть недоработки в переводе?\nПишите в офф. discord-сервер mindustry в канал #русский.\n\nПереводчики на русский язык:\n[YELLOW]Prosta4ok_ua\n[GREEN]xga\n[BLACK]XZimur
text.credits = Авторы text.credits = Авторы
text.contributors = Переводчики и контрибьюторы text.contributors = Переводчики и контрибьюторы
text.discord = Присоединяйтесь к нашему Discord! text.discord = Присоединяйтесь к нашему Discord!
@@ -12,7 +12,7 @@ text.link.wiki.description = Официальная вики Mindustry(англ.
text.linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена. text.linkfail = Не удалось открыть ссылку!\nURL-адрес был скопирован в буфер обмена.
text.gameover = Игра окончена text.gameover = Игра окончена
text.gameover.pvp = [accent] {0}[] команда победила! text.gameover.pvp = [accent] {0}[] команда победила!
text.sector.gameover = Этот сектор потерян. Высадится повторно? text.sector.gameover = Этот сектор потерян. Высадиться повторно?
text.sector.retry = Повторить попытку text.sector.retry = Повторить попытку
text.highscore = [YELLOW]Новый рекорд! text.highscore = [YELLOW]Новый рекорд!
text.wave.lasted = Вы продержались до [accent]{0}[]-ой волны. text.wave.lasted = Вы продержались до [accent]{0}[]-ой волны.
@@ -49,9 +49,9 @@ text.mission.main = Главная мисия:[LIGHT_GRAY] {0}
text.mission.info = Информация о миссии text.mission.info = Информация о миссии
text.mission.complete = Миссия выполнена! text.mission.complete = Миссия выполнена!
text.mission.complete.body = Сектор {0},{1} был завоёван. text.mission.complete.body = Сектор {0},{1} был завоёван.
text.mission.wave = Осталось[accent] {0}[] волн из[accent] {1}[]\nВолна через {2} text.mission.wave = Волна[accent] {0}[] из[accent] {1}[]\nВолна через {2}
text.mission.wave.enemies = Осталось[accent] {0}/{1}[] волн:\n{2} враг. text.mission.wave.enemies = Волна[accent] {0} из {1}[]\n{2} враг.
text.mission.wave.enemy = Осталось[accent] {0}/{1}[] волн\n{2} враг text.mission.wave.enemy = Волна[accent] {0} из {1}[]\n{2} враг
text.mission.wave.menu = Пережить[accent] {0} []волн text.mission.wave.menu = Пережить[accent] {0} []волн
text.mission.battle = Уничтожьте ядро противника. text.mission.battle = Уничтожьте ядро противника.
text.mission.resource.menu = Добыть {0} х{1} text.mission.resource.menu = Добыть {0} х{1}
@@ -266,7 +266,7 @@ text.error.invalidaddress = Некорректный адрес.
text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный! text.error.timedout = Время ожидания истекло!\nУбедитесь, что хост настроен для перенаправления портов и адрес корректный!
text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry! text.error.mismatch = Ошибка пакета:\nвозможное несоответствие версии клиента/сервера. \nУбедитесь, что у Вас и у владельца сервера установлена последняя версия Mindustry!
text.error.alreadyconnected = Вы уже подключены. text.error.alreadyconnected = Вы уже подключены.
text.error.mapnotfound = Map file not found! text.error.mapnotfound = Не найден файл карты!
text.error.any = Неизвестная сетевая ошибка. text.error.any = Неизвестная сетевая ошибка.
text.settings.language = Язык text.settings.language = Язык
text.settings.reset = Сбросить по умолчанию text.settings.reset = Сбросить по умолчанию
@@ -345,7 +345,7 @@ text.category.power = Энергия
text.category.liquids = Жидкости text.category.liquids = Жидкости
text.category.items = Предметы text.category.items = Предметы
text.category.crafting = Создание text.category.crafting = Создание
text.category.shooting = Cтрельба text.category.shooting = Стрельба
text.category.optional = Дополнительные улучшения text.category.optional = Дополнительные улучшения
setting.autotarget.name = Авто-цель setting.autotarget.name = Авто-цель
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
@@ -407,8 +407,8 @@ mode.waves.name = Волны
mode.waves.description = Обычный режим. В режиме "Волны" надо самим добывать ресурсы и сами волны идут безостановочно. mode.waves.description = Обычный режим. В режиме "Волны" надо самим добывать ресурсы и сами волны идут безостановочно.
mode.sandbox.name = Песочница mode.sandbox.name = Песочница
mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну. mode.sandbox.description = Бесконечные ресурсы и нет таймера для волн, но можно самим вызвать волну.
mode.freebuild.name = Cвободная\nстрой mode.freebuild.name = Свободная\nстройка
mode.freebuild.description = ограниченные ресурсы и нет таймера для волн. mode.freebuild.description = Ограниченные ресурсы и нет таймера для волн.
mode.pvp.name = Противо-\nстояние mode.pvp.name = Противо-\nстояние
mode.pvp.description = боритесь против других игроков. mode.pvp.description = боритесь против других игроков.
content.item.name = Предметы content.item.name = Предметы
@@ -435,7 +435,7 @@ item.silicon.description = Очень полезный полупроводни
item.plastanium.name = Пластиний item.plastanium.name = Пластиний
item.plastanium.description = Легкий, пластичный материал, используемый в современных самолетах и боеприпасах для фрагментации. item.plastanium.description = Легкий, пластичный материал, используемый в современных самолетах и боеприпасах для фрагментации.
item.phase-fabric.name = Фазовая ткань item.phase-fabric.name = Фазовая ткань
item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. item.phase-fabric.description = Невесомое вещество, используемое в современной электронике и технологии самовосстановления. Непригодна для вышивания.
item.surge-alloy.name = Высокопрочный сплав item.surge-alloy.name = Высокопрочный сплав
item.surge-alloy.description = Передовой сплав с уникальными электрическими свойствами. item.surge-alloy.description = Передовой сплав с уникальными электрическими свойствами.
item.biomatter.name = Биоматерия item.biomatter.name = Биоматерия
@@ -461,7 +461,7 @@ mech.delta-mech.description = Быстрый, легкобронированны
mech.tau-mech.name = Тау mech.tau-mech.name = Тау
mech.tau-mech.weapon = Восстановительный лазер mech.tau-mech.weapon = Восстановительный лазер
mech.tau-mech.ability = Регенирирующая вспышка mech.tau-mech.ability = Регенирирующая вспышка
mech.tau-mech.description = Мех поддержки. Исцеляет союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления. mech.tau-mech.description = Мех поддержки. Чинит союзные блоки, стреляя в них. Может исцелить союзников радиусом с его способностью восстанавления.
mech.omega-mech.name = Омега mech.omega-mech.name = Омега
mech.omega-mech.weapon = Ракетомётный пулемётконфигурация mech.omega-mech.weapon = Ракетомётный пулемётконфигурация
mech.omega-mech.ability = Защитная mech.omega-mech.ability = Защитная
@@ -498,7 +498,7 @@ block.constructing = {0}[LIGHT_GRAY](В процессе)
block.spawn.name = Точка появления врагов block.spawn.name = Точка появления врагов
block.core.name = Ядро block.core.name = Ядро
block.space.name = Пустота block.space.name = Пустота
block.metalfloor.name = Мeталичeский пoл block.metalfloor.name = Металлическая плита
block.deepwater.name = Глубоководье block.deepwater.name = Глубоководье
block.water.name = Вода block.water.name = Вода
block.lava.name = Лава block.lava.name = Лава
@@ -731,8 +731,8 @@ block.solar-panel-large.description = Зелёная энергия. Больш
block.thorium-reactor.description = Производит энергию в большом количестве. Может взорваться. Требуется торий и жидкость для охлаждения (вода или криогенная). block.thorium-reactor.description = Производит энергию в большом количестве. Может взорваться. Требуется торий и жидкость для охлаждения (вода или криогенная).
block.rtg-generator.description = Радиоизотопный термоэлектрический генератор, который не требует охлаждения, но обеспечивает меньшую мощность, чем ториевый реактор. block.rtg-generator.description = Радиоизотопный термоэлектрический генератор, который не требует охлаждения, но обеспечивает меньшую мощность, чем ториевый реактор.
block.unloader.description = Выгружает из ядра или хранилища верхний левый предмет. block.unloader.description = Выгружает из ядра или хранилища верхний левый предмет.
block.container.description = Хранит небольшое количество предметов(250). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. block.container.description = Хранит небольшое количество предметов(200). Используйте его для создания буферов, когда существует непостоянная потребность в материалах. [LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища.
block.vault.description = Хранит большое количество предметов(1000). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища. block.vault.description = Хранит большое количество предметов(900). Используйте его для создания буферов, когда существует непостоянная потребность в материалах.[LIGHT_GRAY] Разгрузчик[] можно использовать для извлечения элементов из хранилища.
block.mechanical-drill.description = Самый первый доступный бур. \n\nДобывает медь, свинец, уголь, песок. \n\nМожно подвести к нему [BLUE] воду[] для увеличения скорости сверления. block.mechanical-drill.description = Самый первый доступный бур. \n\nДобывает медь, свинец, уголь, песок. \n\nМожно подвести к нему [BLUE] воду[] для увеличения скорости сверления.
block.pneumatic-drill.description = Улучшенная версия механического бура.\n\nДобывает тоже самое, что и механический бур. Также может добывать титан и камень.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления. block.pneumatic-drill.description = Улучшенная версия механического бура.\n\nДобывает тоже самое, что и механический бур. Также может добывать титан и камень.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления.
block.laser-drill.description = Улучшенная версия пневматического бура.\n\nДобывает тоже самое, что и пневматический бур. Также может добывать торий.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления. block.laser-drill.description = Улучшенная версия пневматического бура.\n\nДобывает тоже самое, что и пневматический бур. Также может добывать торий.\n\nМожно подвести к нему[BLUE] воду[] для увеличения скорости сверления.

View File

@@ -1,5 +1,6 @@
text.credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](In case you can't tell, this text is currently unfinished.\nTranslators, don't edit it yet!) text.credits.text = [ROYAL]Anuken[]製作 - [SKY]anukendev@gmail.com[]
text.credits = 致謝名單 text.credits = 致謝名單
text.contributors = 翻譯員和貢獻者
text.discord = 加入 Mindustry 的 Discord 聊天室! text.discord = 加入 Mindustry 的 Discord 聊天室!
text.link.discord.description = 官方 Mindustry Discord 聊天室 text.link.discord.description = 官方 Mindustry Discord 聊天室
text.link.github.description = 遊戲原始碼 text.link.github.description = 遊戲原始碼
@@ -9,8 +10,9 @@ text.link.itch.io.description = itch.io 電腦版下載與網頁版
text.link.google-play.description = Google Play 商店頁面 text.link.google-play.description = Google Play 商店頁面
text.link.wiki.description = 官方 Mindustry 維基 text.link.wiki.description = 官方 Mindustry 維基
text.linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。 text.linkfail = 無法打開連結!\n我們已將該網址複製到您的剪貼簿。
text.screenshot = 截圖保存到{0}
text.gameover = 核心已被摧毀。 text.gameover = 核心已被摧毀。
text.gameover.pvp = [accent]{0}[]隊得到勝利 text.gameover.pvp = [accent]{0}[]隊獲勝
text.sector.gameover = 這個區域失守了,重新部署? text.sector.gameover = 這個區域失守了,重新部署?
text.sector.retry = 重試 text.sector.retry = 重試
text.highscore = [accent]新的高分紀錄! text.highscore = [accent]新的高分紀錄!
@@ -71,6 +73,7 @@ text.nextmission = 下一個任務
text.maps.none = [LIGHT_GRAY]找不到地圖! text.maps.none = [LIGHT_GRAY]找不到地圖!
text.about.button = 關於 text.about.button = 關於
text.name = 名稱: text.name = 名稱:
text.noname = 先選擇一個[accent]玩家名稱[]。
text.filename = 檔案名稱︰ text.filename = 檔案名稱︰
text.unlocked = 新方塊已解鎖! text.unlocked = 新方塊已解鎖!
text.unlocked.plural = 新方塊已解鎖! text.unlocked.plural = 新方塊已解鎖!
@@ -250,7 +253,7 @@ text.menu = 主選單
text.play = 開始 text.play = 開始
text.load = 載入 text.load = 載入
text.save = 儲存 text.save = 儲存
text.fps = 螢幕刷新率{0} text.fps = FPS{0}
text.tps = TPS{0} text.tps = TPS{0}
text.ping = 延遲:{0}ms text.ping = 延遲:{0}ms
text.language.restart = 請重新啟動遊戲以使選取的語言生效。 text.language.restart = 請重新啟動遊戲以使選取的語言生效。
@@ -259,6 +262,7 @@ text.tutorial = 教學
text.editor = 地圖編輯器 text.editor = 地圖編輯器
text.mapeditor = 地圖編輯器 text.mapeditor = 地圖編輯器
text.donate = 贊助 text.donate = 贊助
text.connectfail = [crimson]無法連線到伺服器:[accent]{0} text.connectfail = [crimson]無法連線到伺服器:[accent]{0}
text.error.unreachable = 無法到達伺服器。 text.error.unreachable = 無法到達伺服器。
text.error.invalidaddress = 無效地址。 text.error.invalidaddress = 無效地址。
@@ -267,6 +271,7 @@ text.error.mismatch = 包裹錯誤:\n客戶端/伺服器版本可能不匹配
text.error.alreadyconnected = 已連接。 text.error.alreadyconnected = 已連接。
text.error.mapnotfound = 找不到地圖! text.error.mapnotfound = 找不到地圖!
text.error.any = 未知網絡錯誤。 text.error.any = 未知網絡錯誤。
text.settings.language = 語言 text.settings.language = 語言
text.settings.reset = 重設為預設設定 text.settings.reset = 重設為預設設定
text.settings.rebind = 重新綁定 text.settings.rebind = 重新綁定
@@ -289,7 +294,7 @@ text.error.crashtitle = 發生錯誤
text.blocks.unknown = [LIGHT_GRAY]??? text.blocks.unknown = [LIGHT_GRAY]???
text.blocks.blockinfo = 方塊資訊 text.blocks.blockinfo = 方塊資訊
text.blocks.powercapacity = 蓄電量 text.blocks.powercapacity = 蓄電量
text.blocks.powershot = /射擊 text.blocks.powershot = /射擊
text.blocks.targetsair = 攻擊空中目標 text.blocks.targetsair = 攻擊空中目標
text.blocks.itemspeed = 移動速度 text.blocks.itemspeed = 移動速度
text.blocks.shootrange = 範圍 text.blocks.shootrange = 範圍
@@ -297,13 +302,13 @@ text.blocks.size = 尺寸
text.blocks.liquidcapacity = 液體容量 text.blocks.liquidcapacity = 液體容量
text.blocks.maxitemssecond = 最高產量 text.blocks.maxitemssecond = 最高產量
text.blocks.powerrange = 輸出範圍 text.blocks.powerrange = 輸出範圍
text.blocks.poweruse = 使用 text.blocks.poweruse = 使用
text.blocks.powerdamage = /傷害 text.blocks.powerdamage = /傷害
text.blocks.inputitemcapacity = 最大輸入 text.blocks.inputitemcapacity = 最大輸入
text.blocks.outputitemcapacity = 最大輸出 text.blocks.outputitemcapacity = 最大輸出
text.blocks.itemcapacity = 物品容量 text.blocks.itemcapacity = 物品容量
text.blocks.basepowergeneration = 基本能量生产 text.blocks.basepowergeneration = 基本能量生产
text.blocks.powertransferspeed = 傳輸 text.blocks.powertransferspeed = 傳輸
text.blocks.craftspeed = 產生速度 text.blocks.craftspeed = 產生速度
text.blocks.inputliquid = 輸入液體 text.blocks.inputliquid = 輸入液體
text.blocks.inputliquidaux = 輔助液體 text.blocks.inputliquidaux = 輔助液體
@@ -319,8 +324,8 @@ text.blocks.coolant = 冷卻劑
text.blocks.coolantuse = 使用冷卻劑 text.blocks.coolantuse = 使用冷卻劑
text.blocks.inputliquidfuel = 輸入液體燃料 text.blocks.inputliquidfuel = 輸入液體燃料
text.blocks.liquidfueluse = 使用液體燃料速度 text.blocks.liquidfueluse = 使用液體燃料速度
text.blocks.boostitem = Boost Item text.blocks.boostitem = 強化物品
text.blocks.boostliquid = Boost Liquid text.blocks.boostliquid = 強化液體
text.blocks.health = 耐久度 text.blocks.health = 耐久度
text.blocks.inaccuracy = 誤差 text.blocks.inaccuracy = 誤差
text.blocks.shots = 射擊數 text.blocks.shots = 射擊數
@@ -330,26 +335,27 @@ text.blocks.fuelburntime = 燃燒燃料時間
text.blocks.inputcapacity = 輸入容量 text.blocks.inputcapacity = 輸入容量
text.blocks.outputcapacity = 輸出容量 text.blocks.outputcapacity = 輸出容量
text.unit.blocks = 方塊 text.unit.blocks = 方塊
text.unit.powersecond = 單位/秒 text.unit.powersecond = 單位/秒
text.unit.liquidsecond = 液體單位/秒 text.unit.liquidsecond = 液體單位/秒
text.unit.itemssecond = 物品/秒 text.unit.itemssecond = 物品/秒
text.unit.pixelssecond = 像素/秒 text.unit.pixelssecond = 像素/秒
text.unit.liquidunits = 液體單位 text.unit.liquidunits = 液體單位
text.unit.powerunits = 單位 text.unit.powerunits = 單位
text.unit.degrees = text.unit.degrees =
text.unit.seconds = text.unit.seconds =
text.unit.items = 物品 text.unit.items = 物品
text.category.general = 一般 text.category.general = 一般
text.category.power = text.category.power =
text.category.liquids = 液體 text.category.liquids = 液體
text.category.items = 物品 text.category.items = 物品
text.category.crafting = 合成 text.category.crafting = 合成
text.category.shooting = 射擊 text.category.shooting = 射擊
text.category.optional = Optional Enhancements text.category.optional = 可選的強化
setting.indicators.name = 盟友指標
setting.autotarget.name = 自動射擊 setting.autotarget.name = 自動射擊
setting.fpscap.name = 最大螢幕刷新率 setting.fpscap.name = 最大FPS
setting.fpscap.none = 没有 setting.fpscap.none = 没有
setting.fpscap.text = {0}螢幕刷新率 setting.fpscap.text = {0}FPS
setting.difficulty.training = 訓練 setting.difficulty.training = 訓練
setting.difficulty.easy = 簡單 setting.difficulty.easy = 簡單
setting.difficulty.normal = 普通 setting.difficulty.normal = 普通
@@ -362,7 +368,7 @@ setting.sensitivity.name = 控制器靈敏度
setting.saveinterval.name = 自動存檔間隔 setting.saveinterval.name = 自動存檔間隔
setting.seconds = {0}秒 setting.seconds = {0}秒
setting.fullscreen.name = 全螢幕 setting.fullscreen.name = 全螢幕
setting.fps.name = 顯示螢幕刷新率 setting.fps.name = 顯示FPS
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
setting.lasers.name = 顯示雷射光束 setting.lasers.name = 顯示雷射光束
setting.minimap.name = 顯示小地圖 setting.minimap.name = 顯示小地圖
@@ -370,7 +376,7 @@ setting.musicvol.name = 音樂音量
setting.mutemusic.name = 靜音 setting.mutemusic.name = 靜音
setting.sfxvol.name = 音效音量 setting.sfxvol.name = 音效音量
setting.mutesound.name = 靜音 setting.mutesound.name = 靜音
setting.crashreport.name = Send Anonymous Crash Reports setting.crashreport.name = 發送匿名崩潰報告
text.keybind.title = 重新綁定按鍵 text.keybind.title = 重新綁定按鍵
category.general.name = 一般 category.general.name = 一般
category.view.name = 查看 category.view.name = 查看
@@ -378,8 +384,9 @@ category.multiplayer.name = 多人
command.attack = 攻擊 command.attack = 攻擊
command.retreat = 撤退 command.retreat = 撤退
command.patrol = 巡邏 command.patrol = 巡邏
keybind.press = 按一下鍵 keybind.press = 按一下鍵……
keybind.press.axis = 按一下軸心或鍵 keybind.press.axis = 按一下軸心或鍵……
keybind.screenshot.name = 地圖截圖
keybind.move_x.name = 水平移動 keybind.move_x.name = 水平移動
keybind.move_y.name = 垂直移動 keybind.move_y.name = 垂直移動
keybind.select.name = 選取 keybind.select.name = 選取
@@ -410,6 +417,8 @@ mode.freebuild.name = 自由建造
mode.freebuild.description = 有限的資源,與不倒數計時的波次。 mode.freebuild.description = 有限的資源,與不倒數計時的波次。
mode.pvp.name = 對戰 mode.pvp.name = 對戰
mode.pvp.description = 和其他玩家鬥爭。 mode.pvp.description = 和其他玩家鬥爭。
mode.attack.name = 攻擊
mode.attack.description = 沒有波次,目標是摧毀敵人的基地。
content.item.name = 物品 content.item.name = 物品
content.liquid.name = 液體 content.liquid.name = 液體
content.unit.name = 機組 content.unit.name = 機組
@@ -535,8 +544,8 @@ block.sorter.name = 分類器
block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從左邊和右邊輸出。 block.sorter.description = 對物品進行分類。如果物品與所選種類匹配,則允許其通過。否則,物品將從左邊和右邊輸出。
block.overflow-gate.name = 溢流器 block.overflow-gate.name = 溢流器
block.overflow-gate.description = 分離器和分配器的組合。如果前面被擋住,則向從左邊和右邊輸出物品。 block.overflow-gate.description = 分離器和分配器的組合。如果前面被擋住,則向從左邊和右邊輸出物品。
block.smelter.name = block.smelter.name = 煉廠
block.arc-smelter.name = 電弧煉 block.arc-smelter.name = 電弧煉廠
block.silicon-smelter.name = 煉矽廠 block.silicon-smelter.name = 煉矽廠
block.phase-weaver.name = 相織布編織器 block.phase-weaver.name = 相織布編織器
block.pulverizer.name = 粉碎機 block.pulverizer.name = 粉碎機
@@ -546,8 +555,8 @@ block.incinerator.name = 焚化爐
block.biomattercompressor.name = 生物物質壓縮機 block.biomattercompressor.name = 生物物質壓縮機
block.separator.name = 分離機 block.separator.name = 分離機
block.centrifuge.name = 離心機 block.centrifuge.name = 離心機
block.power-node.name = 節點 block.power-node.name = 節點
block.power-node-large.name = 大型能節點 block.power-node-large.name = 大型能節點
block.battery.name = 電池 block.battery.name = 電池
block.battery-large.name = 大型電池 block.battery-large.name = 大型電池
block.combustion-generator.name = 燃燒發電機 block.combustion-generator.name = 燃燒發電機
@@ -568,9 +577,9 @@ block.tau-mech-pad.name = Tau機甲墊
block.conduit.name = 管線 block.conduit.name = 管線
block.mechanical-pump.name = 機械泵 block.mechanical-pump.name = 機械泵
block.itemsource.name = 物品源 block.itemsource.name = 物品源
block.itemvoid.name = 物品 block.itemvoid.name = 物品虚
block.liquidsource.name = 液體源 block.liquidsource.name = 液體源
block.powervoid.name = 空虛 block.powervoid.name = 空虛
block.powerinfinite.name = 無限能量 block.powerinfinite.name = 無限能量
block.unloader.name = 裝卸器 block.unloader.name = 裝卸器
block.vault.name = 存儲庫 block.vault.name = 存儲庫
@@ -578,7 +587,7 @@ block.wave.name = 波浪炮
block.swarmer.name = 群炮 block.swarmer.name = 群炮
block.salvo.name = 齊射炮 block.salvo.name = 齊射炮
block.ripple.name = 波紋炮 block.ripple.name = 波紋炮
block.phase-conveyor.name = 相織傳送帶 block.phase-conveyor.name = 相織傳送帶
block.bridge-conveyor.name = 傳送帶橋 block.bridge-conveyor.name = 傳送帶橋
block.plastanium-compressor.name = 塑料壓縮機 block.plastanium-compressor.name = 塑料壓縮機
block.pyratite-mixer.name = 硫混合器 block.pyratite-mixer.name = 硫混合器
@@ -587,21 +596,21 @@ block.solidifer.name = 凝固器
block.solar-panel.name = 太陽能板 block.solar-panel.name = 太陽能板
block.solar-panel-large.name = 大型太陽能板 block.solar-panel-large.name = 大型太陽能板
block.oil-extractor.name = 石油鑽井 block.oil-extractor.name = 石油鑽井
block.spirit-factory.name = 精神無人機工廠 block.spirit-factory.name = 輕型無人機工廠
block.phantom-factory.name = Phantom Drone Factory block.phantom-factory.name = 幻影無人機工廠
block.wraith-factory.name = Wraith Fighter Factory block.wraith-factory.name = 怨靈戰鬥機工廠
block.ghoul-factory.name = Ghoul Bomber Factory block.ghoul-factory.name = 食屍鬼轟炸機工廠
block.dagger-factory.name = Dagger Mech Factory block.dagger-factory.name = 匕首機甲工廠
block.titan-factory.name = Titan Mech Factory block.titan-factory.name = 泰坦機甲工廠
block.fortress-factory.name = Fortress Mech Factory block.fortress-factory.name = 堡壘機甲工廠
block.revenant-factory.name = Revenant Fighter Factory block.revenant-factory.name = 亡魂戰鬥機工廠
block.repair-point.name = 維修點 block.repair-point.name = 維修點
block.pulse-conduit.name = 脈衝管線 block.pulse-conduit.name = 脈衝管線
block.phase-conduit.name = 相織管線 block.phase-conduit.name = 相織管線
block.liquid-router.name = 液體分配器 block.liquid-router.name = 液體分配器
block.liquid-tank.name = 液體儲罐 block.liquid-tank.name = 液體儲罐
block.liquid-junction.name = 液體連接點 block.liquid-junction.name = 液體連接點
block.bridge-conduit.name = 管橋 block.bridge-conduit.name =
block.rotary-pump.name = 迴旋泵 block.rotary-pump.name = 迴旋泵
block.thorium-reactor.name = 釷反應堆 block.thorium-reactor.name = 釷反應堆
block.command-center.name = 指令中心 block.command-center.name = 指令中心
@@ -619,7 +628,7 @@ block.shock-mine.name = 休克地雷
block.overdrive-projector.name = 超速投影器 block.overdrive-projector.name = 超速投影器
block.force-projector.name = 力牆投影器 block.force-projector.name = 力牆投影器
block.arc.name = 電弧 block.arc.name = 電弧
block.rtg-generator.name = 放射性同位素熱發電機 block.rtg-generator.name = 放射性同位素熱發電機
block.spectre.name = 幽靈炮 block.spectre.name = 幽靈炮
block.meltdown.name = 熔毀炮 block.meltdown.name = 熔毀炮
block.container.name = 容器 block.container.name = 容器
@@ -631,150 +640,150 @@ team.none.name = 灰
team.green.name = team.green.name =
team.purple.name = team.purple.name =
unit.alpha-drone.name = 阿爾法無人機 unit.alpha-drone.name = 阿爾法無人機
unit.spirit.name = 精神無人機 unit.spirit.name = 輕型無人機
unit.spirit.description = The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks. unit.spirit.description = 起始的無人機。默認在核心產生。自動挖掘礦石、收集物品和修理方塊。
unit.phantom.name = Phantom Drone unit.phantom.name = 幻影無人機
unit.phantom.description = An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone. unit.phantom.description = 一種高級的無人機。自動挖掘礦石、收集物品和修理方塊。比輕型無人機明顯更有效。
unit.dagger.name = Dagger unit.dagger.name = 匕首
unit.dagger.description = A basic ground unit. Useful in swarms. unit.dagger.description = 一種基本的地面單位。最好一群地使用。
unit.titan.name = Titan unit.titan.name = 泰坦
unit.titan.description = An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets. unit.titan.description = 一種高級的具有裝甲的地面單位。使用碳化物作為彈藥。攻擊地面單位和空中單位。
unit.ghoul.name = Ghoul Bomber unit.ghoul.name = 食屍鬼轟炸機
unit.ghoul.description = A heavy carpet bomber. Uses blast compound or pyratite as ammo. unit.ghoul.description = 一種重型的鋪蓋性的轟炸機。使用爆炸化合物或黃鐵礦作為彈藥。
unit.wraith.name = Wraith Fighter unit.wraith.name = 怨靈戰鬥機
unit.wraith.description = A fast, hit-and-run interceptor unit. unit.wraith.description = 一種快速、打了就跑的攔截機。
unit.fortress.name = Fortress unit.fortress.name = 堡壘
unit.fortress.description = A heavy artillery ground unit. unit.fortress.description = 一種具有重型大砲的地面單位。
unit.revenant.name = Revenant unit.revenant.name = 亡魂
unit.revenant.description = A heavy laser platform. unit.revenant.description = 一種重型的激光平台。
tutorial.begin = Your mission here is to eradicate the[LIGHT_GRAY] enemy[].\n\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this. tutorial.begin = 你的任務是毀滅[LIGHT_GRAY]敵人[]\n\n首先[accent]挖掘銅礦[]。點擊核心附近的銅脈以開始。
tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nPlace one on a copper vein. tutorial.drill = 手動挖掘礦石是低效率的。\n[accent]鑽頭[]能夠自動挖掘礦石。\n在銅脈上放置一個鑽頭。
tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core. tutorial.conveyor = [accent]輸送帶[]能夠將物品運輸到核心。\n製作一條從鑽頭開始到核心的輸送帶。
tutorial.morecopper = More copper is required.\n\nEither mine it manually, or place more drills. tutorial.morecopper = 需要更多銅。\n\n請手動挖掘銅礦或放置更多鑽頭。
tutorial.turret = Defensive structures must be built to repel the[LIGHT_GRAY] enemy[].\nBuild a duo turret near your base. tutorial.turret = 防禦建築是必須的以擊退[LIGHT_GRAY]敵人[]\n於核心附近建造一個雙炮。
tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill next to the turret to supply it with mined copper. tutorial.drillturret = 雙炮需要[accent]銅彈[]以射擊。\n在雙炮旁邊放置一個鑽頭以供應銅。
tutorial.waves = The[LIGHT_GRAY] enemy[] approaches.\n\nDefend your core for 2 waves. Build more turrets. tutorial.waves = [LIGHT_GRAY]敵人[]來臨。\n\n防衛核心2波。建造更多的砲塔以防衛。
tutorial.lead = More ores are available. Explore and mine[accent] lead[].\n\nDrag from your unit to the core to transfer resources. tutorial.lead = 有更多的礦石可用。探索和挖掘[accent][]\n\n點擊您的單位拖動到核心以傳輸資源。
tutorial.smelter = Copper and lead are weak metals.\nSuperior[accent] Dense Alloy[] can be created in a smelter.\n\nBuild one. tutorial.smelter = 銅和鉛是柔軟的金屬。\n優良的[accent]稠密合金[]可以在冶煉廠中生產。\n\n建造一個冶煉廠。
tutorial.densealloy = The smelter will now produce alloy.\nGet some.\nImprove the production if necessary. tutorial.densealloy = 冶煉廠現在將生產稠密合金。\n請獲取更多的稠密合金。\n必要時改善生產系統。
tutorial.siliconsmelter = The core will now create a[accent] spirit drone[] for mining and repairing blocks.\n\nFactories for other units can be created with [accent] silicon.\nMake a silicon smelter. tutorial.siliconsmelter = 核心現在將製作一個[accent]輕型無人機[]以挖掘礦石和修理方塊。\n\n製作其他單位的工廠可以使用[accent]矽[]以建造。\n建造一個冶矽廠。
tutorial.silicondrill = Silicon requires[accent] coal[] and[accent] sand[].\nStart by making drills. tutorial.silicondrill = 矽需要[accent]煤[]和[accent]沙[]以製作。\n放置鑽頭以開始。
tutorial.generator = This technology requires power.\nCreate a[accent] combustion generator[] for it. tutorial.generator = 這項技術需要能量。\n建造一個[accent]燃燒發電機[]。
tutorial.generatordrill = Combustion generators need fuel.\nFuel it with coal from a drill. tutorial.generatordrill = 燃燒發電機需要燃料。\n用鑽頭挖的煤為它加燃料。
tutorial.node = Power requires transport.\nCreate a[accent] power node[] next to your combustion generator to transfer its power. tutorial.node = 電源需要運輸。\n在燃燒發電機旁邊建造一個[accent]能量節點[]以傳遞其能量。
tutorial.nodelink = Power can be transferred through contacting power blocks and generators, or by linked power nodes.\n\nLink power by tapping the node and selecting the generator and silicon smelter. tutorial.nodelink = 能量可透過接觸的能量方塊和發電機,或者通過連接的能量節點傳遞。\n\n點擊能量節點並選擇發電機和冶矽廠以連接能量。
tutorial.silicon = Silicon is being produced. Get some.\n\nImproving the production system is advised. tutorial.silicon = 正在製作矽。請獲取更多的矽。\n\n建議改善生產系統。
tutorial.daggerfactory = Construct a[accent] dagger mech factory.[]\n\nThis will be used to create attack mechs. tutorial.daggerfactory = 建造一個[accent]匕首機甲工廠[]\n\n這將製作攻擊機甲。
tutorial.router = Factories need resources to function.\nCreate a router to split conveyor resources. tutorial.router = 工廠需要資源以運作。\n建造一個分配器以均分輸送帶的資源。
tutorial.dagger = Link power nodes to the factory.\nOnce requirements are met, a mech will be created.\n\nCreate more drills, generators and conveyors as necessary. tutorial.dagger = 連接能量節點至工廠。\n一旦要求滿足將製作一個機甲。\n\n根據需要建造更多鑽頭、發電機和輸送帶。發電機和輸送帶。
tutorial.battle = The[LIGHT_GRAY] enemy[] has revealed their core.\nDestroy it with your unit and dagger mechs. tutorial.battle = [LIGHT_GRAY]敵人[]透露了他們的核心。\n用你的單位和匕首機甲以摧毀它。
block.copper-wall.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves. block.copper-wall.description = 一種便宜的防衛方塊。\n用於前幾波防衛核心和砲塔。
block.copper-wall-large.description = A cheap defensive block.\nUseful for protecting the core and turrets in the first few waves.\nSpans multiple tiles. block.copper-wall-large.description = 一種便宜的防衛方塊。\n用於前幾波防衛核心和砲塔\n佔據多個方塊。
block.dense-alloy-wall.description = A standard defensive block.\nAdequate protection from enemies. block.dense-alloy-wall.description = 一種標準的防衛方塊。\n充分地防衛敵人。
block.dense-alloy-wall-large.description = A standard defensive block.\nAdequate protection from enemies.\nSpans multiple tiles. block.dense-alloy-wall-large.description = 一種標準的防衛方塊。\n充分地防衛敵人。\n佔據多個方塊。
block.thorium-wall.description = A strong defensive block.\nGood protection from enemies. block.thorium-wall.description = 一種堅強的防衛方塊。\n良好地防衛敵人。
block.thorium-wall-large.description = A strong defensive block.\nGood protection from enemies.\nSpans multiple tiles. block.thorium-wall-large.description = 一種堅強的防衛方塊。\n良好地防衛敵人。\n佔據多個方塊。
block.phase-wall.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful. block.phase-wall.description = 沒有釷牆那麼強但會使不太強的子彈偏離。
block.phase-wall-large.description = Not as strong as a thorium wall but will deflect bullets unless they are too powerful.\nSpans multiple tiles. block.phase-wall-large.description = 沒有釷牆那麼強但會使不太強的子彈偏離。\n佔據多個方塊。
block.surge-wall.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker. block.surge-wall.description = 最強的防衛方塊。\n有小的機會對攻擊者觸發閃電。
block.surge-wall-large.description = The strongest defensive block.\nHas a small chance of triggering lightning towards the attacker.\nSpans multiple tiles. block.surge-wall-large.description = 最強的防衛方塊。\n有小的機會對攻擊者觸發閃電。\n佔據多個方塊。
block.door.description = A small door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through. block.door.description = 可以通過點擊打開和關閉的一扇小門。\n如果打開敵人可以穿過它射擊和移動。
block.door-large.description = A large door that can be opened and closed by tapping on it.\nIf opened, enemies can shoot and move through.\nSpans multiple tiles. block.door-large.description = 可以通過點擊打開和關閉的一扇大門。\n如果打開敵人可以穿過它射擊和移動。\n佔據多個方塊。
block.mend-projector.description = Periodically heals buildings in its vicinity. block.mend-projector.description = 定期修復附近的建築物。
block.overdrive-projector.description = Increases the speed of nearby buildings like drills and conveyors. block.overdrive-projector.description = 提高附近建築物的速度,如鑽頭和輸送帶。
block.force-projector.description = Creates a hexagonal force field around itself, protecting buildings and units inside from damage through bullets. block.force-projector.description = 在自身周圍形成一個六角形力場,保護內部的建築物和單位免受子彈的傷害。
block.shock-mine.description = Damages enemies stepping on the mine. Nearly invisible to the enemy. block.shock-mine.description = 傷害踩到地雷的敵人。敵人幾乎看不見。
block.duo.description = A small, cheap turret. block.duo.description = 一種小而便宜的砲塔。
block.arc.description = A small turret which shoots electricity in a random arc towards the enemy. block.arc.description = 一種向敵人射出隨機電弧的小砲塔。
block.hail.description = A small artillery turret. block.hail.description = 一種小型火砲。
block.lancer.description = A medium-sized turret which shoots charged electricity beams. block.lancer.description = 一種射出電子束的中型砲塔。
block.wave.description = A medium-sized rapid-fire turret which shoots liquid bubbles. block.wave.description = 一種可以快速射出液體氣泡的中型砲塔。
block.salvo.description = A medium-sized turret which fires shots in salvos. block.salvo.description = 一種齊射的中型砲塔。
block.swarmer.description = A medium-sized turret which shoots burst missiles. block.swarmer.description = 一種射出爆炸導彈的中型砲塔。
block.ripple.description = A large artillery turret which fires several shots simultaneously. block.ripple.description = 一種一次射出幾發子彈的大型火砲。
block.cyclone.description = A large rapid fire turret. block.cyclone.description = 一種快速射擊的大型砲塔。
block.fuse.description = A large turret which shoots powerful short-range beams. block.fuse.description = 一種射出強大的短程射線的大型砲塔。
block.spectre.description = A large turret which shoots two powerful bullets at once. block.spectre.description = 一種一次射出兩顆強大的子彈的大型砲塔。
block.meltdown.description = A large turret which shoots powerful long-range beams. block.meltdown.description = 一種射出強大的遠程光束的大型砲塔。
block.conveyor.description = Basic item transport block. Moved items forward and automatically deposits them into turrets or crafters. Rotatable. block.conveyor.description = 基本物品傳輸方塊。將物品向前移動並自動將它們放入砲塔或機器中。能夠旋轉方向。
block.titanium-conveyor.description = Advanced item transport block. Moves items faster than standard conveyors. block.titanium-conveyor.description = 高級物品傳輸方塊。比標準輸送帶更快地移動物品。
block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles. block.phase-conveyor.description = 高級物品傳輸方塊。使用能量將物品傳送到幾個方塊外連接的相織輸送帶。
block.junction.description = Acts as a bridge for two crossing conveyor belts. Useful in situations with two different conveyors carrying different materials to different locations. block.junction.description = 作為兩個交叉輸送帶的橋樑。適用於兩條不同輸送帶將不同物品運送到不同位置的情況。
block.mass-driver.description = Ultimate item transport block. Collects several items and then shoots them to another mass driver over a long range. block.mass-driver.description = 終極物品運輸方塊。收集幾件物品,然後將它們射向另一個長距離的質量驅動器。
block.smelter.description = Burns coal for smelting copper and lead into dense alloy. block.smelter.description = 燒煤以冶煉銅和鉛成稠密合金。
block.arc-smelter.description = Smelts copper and lead into dense alloy by using an external power source. block.arc-smelter.description = 使用外部能量以冶煉銅和鉛成稠密合金。
block.silicon-smelter.description = Reduces sand with highly pure coke in order to produce silicon. block.silicon-smelter.description = 使用高純度焦炭還原沙子以生產矽。
block.plastanium-compressor.description = Produces plastanium from oil and titanium. block.plastanium-compressor.description = 使用油和鈦以生產塑料。
block.phase-weaver.description = Produces phase fabric from radioactive thorium and high amounts of sand. block.phase-weaver.description = 使用放射性的釷和大量的沙子以生產相織布。
block.alloy-smelter.description = Produces surge alloy from titanium, lead, silicon and copper. block.alloy-smelter.description = 使用鈦、鉛、矽和銅以生產波動合金。
block.pulverizer.description = Crushes stone into sand. Useful when there is a lack of natural sand. block.pulverizer.description = 將石頭壓成沙子。當缺少天然沙子時有用。
block.pyratite-mixer.description = Mixes coal, lead and sand into highly flammable pyratite. block.pyratite-mixer.description = 混合煤、鉛和沙子成為易燃的硫。
block.blast-mixer.description = Uses oil for transforming pyratite into the less flammable but more explosive blast compound. block.blast-mixer.description = 使用油將硫變成比較不易燃但更具爆炸性的爆炸混合器。
block.cryofluidmixer.description = Combines water and titanium into cryofluid which is much more efficient for cooling. block.cryofluidmixer.description = 合水和鈦成冷卻效率更高的冷凍液。
block.solidifer.description = Cools lava to stone at a fast pace. block.solidifer.description = 快速冷卻熔岩至石頭。
block.melter.description = Heats up stone to very high temperatures to obtain lava. block.melter.description = 將石頭加熱到很高的溫度以獲得熔岩。
block.incinerator.description = Gets rid of any excess item or liquid. block.incinerator.description = 清除任何多餘的物品或液體。
block.biomattercompressor.description = Compresses biomatter in order to retrieve oil. block.biomattercompressor.description = 壓縮生物物質以提取油。
block.separator.description = Exposes stone to water pressure in order to obtain various minerals contained in the stone. block.separator.description = 將石頭暴露在水壓下以獲得石頭中的各種礦物質。
block.centrifuge.description = More efficient than the separator, but also more expensive to build and requires power. block.centrifuge.description = 比分離器更有效,但建造更昂貴和需要能量以操作。
block.power-node.description = Transmits power to connected nodes. Up to four power sources, sinks or nodes can be connected. The node will receive power from or supply power to any adjacent blocks. block.power-node.description = 將能量傳輸到連接的節點。最多可連接四個能量來源、接收或節點。節點將從任何相鄰方塊接收能量或向其供能量。
block.power-node-large.description = Has a larger radius than the power node and connects to up to six power sources, sinks or nodes. block.power-node-large.description = 範圍大於能量節點,最多可連接六個能量來源、接收或節點。
block.battery.description = Stores power whenever there is an abundance and provides power whenever there is a shortage, as long as there is capacity left. block.battery.description = 有能量剩餘時,存儲電力並在能量短缺時提供能量。
block.battery-large.description = Stores much more power than a regular battery. block.battery-large.description = 比普通電池存儲更多的能量。
block.combustion-generator.description = Generates power by burning oil or flammable materials. block.combustion-generator.description = 透過燃燒油或可燃物品以產生能量。
block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. block.turbine-generator.description = 比燃燒發電機更有效,但需要水以操作。
block.thermal-generator.description = Generates a large amount of power from lava. block.thermal-generator.description = 使用熔岩產生大量的能量。
block.solar-panel.description = Provides a small amount of power from the sun. block.solar-panel.description = 透過太陽產生少量的能量。
block.solar-panel-large.description = Provides much better power supply than a standard solar panel, but is also much more expensive to build. block.solar-panel-large.description = 比標準太陽能板產生更多的能量,但建造起來昂貴得多。
block.thorium-reactor.description = Generates huge amounts of power from highly radioactive thorium. Requires constant cooling. Will explode violently if insufficient amounts of coolant are supplied. block.thorium-reactor.description = 從高度放射性釷產生大量能量。需要持續冷卻。如果供應的冷卻劑不足,會劇烈爆炸。
block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.rtg-generator.description = 一種放射性同位素熱發電機,不需要冷卻,但比釷反應堆產生的能量少。
block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping on the unloader. block.unloader.description = 將物品從容器、存儲庫或核心卸載到傳輸帶上或直接卸載到相鄰的方塊中。透過點擊卸載器來更改要卸載的物品類型。
block.container.description = Stores a small amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the container. block.container.description = 存儲少量物品。當物品需求非恆定時,使用它來創建緩衝。使用[LIGHT_GRAY]裝卸器[]以從容器提取物品。
block.vault.description = Stores a large amount of items. Use it for creating buffers when there is a non-constant demand of materials. An[LIGHT_GRAY] unloader[] can be used to retrieve items from the vault. block.vault.description = 存儲大量物品。當物品需求非恆定時,使用它來創建緩衝。使用[LIGHT_GRAY]裝卸器[]以從存儲庫提取物品。
block.mechanical-drill.description = A cheap drill. When placed on appropriate tiles, outputs items at a slow pace indefinitely. block.mechanical-drill.description = 一種便宜的鑽頭。當放置在適當的方塊上時,以緩慢的速度無限期地輸出物品。
block.pneumatic-drill.description = An improved drill which is faster and able to process harder materials by making use of air pressure. block.pneumatic-drill.description = 一種改進的鑽頭。它挖掘更快,能夠利用氣壓挖掘更硬的材料。
block.laser-drill.description = Allows drilling even faster through laser technology, but requires power. Additionally, radioactive thorium can be retrieved with this drill. block.laser-drill.description = 通過激光技術可以更快地挖掘,但需要能量。此外,這種鑽頭可以挖掘放射性釷。
block.blast-drill.description = The ultimate drill. Requires large amounts of power. block.blast-drill.description = 終極的鑽頭。需要大量能量。
block.water-extractor.description = Extracts water from the ground. Use it when there is no lake nearby. block.water-extractor.description = 從地下提取水。當附近沒有湖泊時使用它。
block.cultivator.description = Cultivates the soil with water in order to obtain biomatter. block.cultivator.description = 用水培養土壤以獲得生物物質。
block.oil-extractor.description = Uses large amounts of power in order to extract oil from sand. Use it when there is no direct source of oil nearby. block.oil-extractor.description = 使用大量的能量從沙子中提取油。當附近沒有直接的石油來源時使用它。
block.dart-ship-pad.description = Leave your current vessel and change into a basic fighter aircraft.\nUse the pad by double tapping while standing on it. block.dart-ship-pad.description = 離開現有的船隻,換成基本的戰鬥機。\n站在上面雙擊墊以使用它。
block.trident-ship-pad.description = Leave your current vessel and change into a reasonably well armored heavy bomber.\nUse the pad by double tapping while standing on it. block.trident-ship-pad.description = 離開現在的船隻,換成具有相當不錯裝甲的重型轟炸機。\n站在上面雙擊墊以使用它。
block.javelin-ship-pad.description = Leave your current vessel and change into a strong and fast interceptor with lightning weapons.\nUse the pad by double tapping while standing on it. block.javelin-ship-pad.description = 離開現在的船隻,換成具有閃電武器、強大而快速的攔截器。\n站在上面雙擊墊以使用它。
block.glaive-ship-pad.description = Leave your current vessel and change into a large, well-armored gunship.\nUse the pad by double tapping while standing on it. block.glaive-ship-pad.description = 離開現在的船隻,換成具有重裝甲的武裝直升機。\n站在上面雙擊墊以使用它。
block.tau-mech-pad.description = Leave your current vessel and change into a support mech which can heal friendly buildings and units.\nUse the pad by double tapping while standing on it. block.tau-mech-pad.description = 離開現有的船隻,換成可以治愈友好的建築物和單位的支援機甲。\n站在上面雙擊墊以使用它。
block.delta-mech-pad.description = Leave your current vessel and change into a fast, lightly-armored mech made for hit-and-run attacks.\nUse the pad by double tapping while standing on it. block.delta-mech-pad.description = 離開現在的船隻,換成快速、具有輕裝甲的機甲,用於打了就跑的攻擊。\n站在上面雙擊墊以使用它。
block.omega-mech-pad.description = Leave your current vessel and change into a bulky and well-armored mech, made for front-line assaults.\nUse the pad by double tapping while standing on it. block.omega-mech-pad.description = 離開現在的船隻,換成龐大、具有重裝甲的機甲,用於前線攻擊。\n站在上面雙擊墊以使用它。
block.spirit-factory.description = Produces light drones which mine ore and repair blocks. block.spirit-factory.description = 生產輕型無人機,用於開採礦石和修復方塊。
block.phantom-factory.description = Produces advanced drone units which are significantly more effective than a spirit drone. block.phantom-factory.description = 生產高級的無人機,比輕型無人機明顯更有效。
block.wraith-factory.description = Produces fast, hit-and-run interceptor units. block.wraith-factory.description = 生產快速、打了就跑的攔截機單位。
block.ghoul-factory.description = Produces heavy carpet bombers. block.ghoul-factory.description = 生產重型鋪蓋轟炸機。
block.dagger-factory.description = Produces basic ground units. block.dagger-factory.description = 產生基本地面單位。
block.titan-factory.description = Produces advanced, armored ground units. block.titan-factory.description = 生產具有裝甲的高級地面單位。
block.fortress-factory.description = Produces heavy artillery ground units. block.fortress-factory.description = 生產重型火砲地面單位。
block.revenant-factory.description = Produces heavy laser ground units. block.revenant-factory.description = 生產重型激光地面單位。
block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. block.repair-point.description = 持續治療附近最近的受損單位。
block.command-center.description = Allows changing friendly AI behavior. Currently, attack, retreat and patrol commands are supported. block.command-center.description = 允許更改友好的AI行為。目前支持攻擊、撤退和巡邏命令。
block.conduit.description = Basic liquid transport block. Works like a conveyor, but with liquids. Best used with extractors, pumps or other conduits. block.conduit.description = 基本液體運輸方塊。像輸送帶一樣工作,但是液體用的。最適用於提取器、泵或其他管線。
block.pulse-conduit.description = Advanced liquid transport block. Transports liquids faster and stores more than standard conduits. block.pulse-conduit.description = 高級的液體運輸方塊。比標準管線更快地輸送並儲存更多液體。
block.phase-conduit.description = Advanced liquid transport block. Uses power to teleport liquids to a connected phase conduit over several tiles. block.phase-conduit.description = 高級的液體運輸方塊。使用能量將液體傳送到多個方塊外連接的相織管線。
block.liquid-router.description = Accepts liquids from one direction and outputs them to up to 3 other directions equally. Can also store a certain amount of liquid. Useful for splitting the liquids from one source to multiple targets. block.liquid-router.description = 接受來自一個方向的液體並將它們平均輸出到最多3個其他方向。可以儲存一定量的液體。用於將液體從一個來源分成多個目標。
block.liquid-tank.description = Stores a large amount of liquids. Use it for creating buffers when there is a non-constant demand of materials or as a safeguard for cooling vital blocks. block.liquid-tank.description = 存儲大量液體。當液體需求非恆定時,使用它來創建緩衝或作為冷卻重要方塊的保障。
block.liquid-junction.description = Acts as a bridge for two crossing conduits. Useful in situations with two different conduits carrying different liquids to different locations. block.liquid-junction.description = 作為兩個交叉管線的橋樑。適用於兩條不同管線將不同液體運送到不同位置的情況。
block.bridge-conduit.description = Advanced liquid transport block. Allows transporting liquids over up to 3 tiles of any terrain or building. block.bridge-conduit.description = 高級的液體運輸方塊。允許跨過最多3個任何地形或建築物的方塊運輸液體。
block.mechanical-pump.description = A cheap pump with slow output, but no power consumption. block.mechanical-pump.description = 一種便宜的泵,輸出速度慢,但不使用能量。
block.rotary-pump.description = An advanced pump which doubles up speed by using power. block.rotary-pump.description = 高級的泵,透過使用能量使輸出速度加倍。
block.thermal-pump.description = The ultimate pump. Three times as fast as a mechanical pump and the only pump which is able to retrieve lava. block.thermal-pump.description = 終極泵。輸出速度是機械泵的三倍並且是唯一能夠抽熔岩的泵。
block.router.description = Accepts items from one direction and outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets. block.router.description = 接受來自一個方向的物品並將它們平均輸出到最多3個其他方向。 用於將物品從一個來源分割為多個目標。
block.distributor.description = An advanced router which splits items to up to 7 other directions equally. block.distributor.description = 高級的分配器可將物品均分到最多7個其他方向。
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building. block.bridge-conveyor.description = 高級的物品運輸方塊。允許跨過最多3個任何地形或建築物的方塊運輸物品。
block.alpha-mech-pad.description = When given enough power, rebuilds your ship into the[accent] Alpha[] mech. block.alpha-mech-pad.description = 當給予足夠能量時,將你的船重建為[accent]阿爾法[]機甲。
block.itemsource.description = Infinitely outputs items. Sandbox only. block.itemsource.description = 不限地輸出物品。僅限沙盒。
block.liquidsource.description = Infinitely outputs liquids. Sandbox only. block.liquidsource.description = 不限地輸出液體。僅限沙盒。
block.itemvoid.description = Destroys any items which go into it without using power. Sandbox only. block.itemvoid.description = 不使用能量銷毀任何進入它的物品。僅限沙盒。
block.powerinfinite.description = Infinitely outputs power. Sandbox only. block.powerinfinite.description = 不限地輸出能量。僅限沙盒。
block.powervoid.description = Voids all power inputted into it. Sandbox only. block.powervoid.description = 銷毀所有輸入的能量。僅限沙盒。
liquid.water.description = Commonly used for cooling machines and waste processing. liquid.water.description = 常用於冷卻機器和廢物處理。
liquid.lava.description = Can be transformed into[LIGHT_GRAY] stone[], used for generating power or used as ammo for certain turrets. liquid.lava.description = 可以轉換為[LIGHT_GRAY]石頭[]、用於發電或用作某些砲塔的彈藥。
liquid.oil.description = Can be burnt, exploded or used as a coolant. liquid.oil.description = 可以燃燒、爆炸或用作冷卻劑。
liquid.cryofluid.description = The most efficient liquid for cooling things down. liquid.cryofluid.description = 冷卻東西最有效的液體。

View File

@@ -83,7 +83,7 @@ public class Items implements ContentList{
}}; }};
biomatter = new Item("biomatter", Color.valueOf("648b55")){{ biomatter = new Item("biomatter", Color.valueOf("648b55")){{
flammability = 0.4f; flammability = 0.55f;
fluxiness = 0.3f; fluxiness = 0.3f;
}}; }};

View File

@@ -26,7 +26,7 @@ public class Liquids implements ContentList{
lava = new Liquid("lava", Color.valueOf("e37341")){ lava = new Liquid("lava", Color.valueOf("e37341")){
{ {
temperature = 0.8f; temperature = 1f;
viscosity = 0.8f; viscosity = 0.8f;
tier = 2; tier = 2;
effect = StatusEffects.melting; effect = StatusEffects.melting;

View File

@@ -123,6 +123,7 @@ public class Mechs implements ContentList{
speed = 0.44f; speed = 0.44f;
drag = 0.35f; drag = 0.35f;
boostSpeed = 0.8f; boostSpeed = 0.8f;
canHeal = true;
weapon = Weapons.healBlaster; weapon = Weapons.healBlaster;
armor = 15f; armor = 15f;
trailColorTo = Palette.heal; trailColorTo = Palette.heal;
@@ -287,8 +288,8 @@ public class Mechs implements ContentList{
trident = new Mech("trident-ship", true){ trident = new Mech("trident-ship", true){
{ {
drillPower = 2; drillPower = 2;
speed = 0.12f; speed = 0.14f;
drag = 0.035f; drag = 0.034f;
mass = 2.5f; mass = 2.5f;
turnCursor = false; turnCursor = false;
armor = 20f; armor = 20f;

View File

@@ -42,17 +42,23 @@ public class Recipes implements ContentList{
new Recipe(defense, DefenseBlocks.surgeWall, new ItemStack(Items.surgealloy, 12)); new Recipe(defense, DefenseBlocks.surgeWall, new ItemStack(Items.surgealloy, 12));
new Recipe(defense, DefenseBlocks.surgeWallLarge, new ItemStack(Items.surgealloy, 12 * 4)); new Recipe(defense, DefenseBlocks.surgeWallLarge, new ItemStack(Items.surgealloy, 12 * 4));
new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200));
new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250));
//core disabled due to being broken
new Recipe(effect, StorageBlocks.core,
new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500),
new ItemStack(Items.silicon, 1500), new ItemStack(Items.thorium, 500),
new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750)
);
//projectors //projectors
new Recipe(effect, DefenseBlocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180)); new Recipe(effect, DefenseBlocks.mendProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 50), new ItemStack(Items.silicon, 180));
new Recipe(effect, DefenseBlocks.overdriveProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); new Recipe(effect, DefenseBlocks.overdriveProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250));
new Recipe(effect, DefenseBlocks.forceProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250)); new Recipe(effect, DefenseBlocks.forceProjector, new ItemStack(Items.lead, 200), new ItemStack(Items.densealloy, 150), new ItemStack(Items.titanium, 150), new ItemStack(Items.silicon, 250));
new Recipe(effect, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60));
new Recipe(effect, StorageBlocks.container, new ItemStack(Items.densealloy, 200));
new Recipe(effect, StorageBlocks.vault, new ItemStack(Items.densealloy, 500), new ItemStack(Items.thorium, 250));
new Recipe(effect, DefenseBlocks.shockMine, new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 25)) new Recipe(effect, DefenseBlocks.shockMine, new ItemStack(Items.lead, 50), new ItemStack(Items.silicon, 25))
.setDependencies(Items.blastCompound); .setDependencies(Items.blastCompound);
//TURRETS //TURRETS
new Recipe(turret, TurretBlocks.duo, new ItemStack(Items.copper, 40)).setAlwaysUnlocked(true); new Recipe(turret, TurretBlocks.duo, new ItemStack(Items.copper, 40)).setAlwaysUnlocked(true);
@@ -82,6 +88,7 @@ public class Recipes implements ContentList{
new Recipe(distribution, DistributionBlocks.sorter, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 4)); new Recipe(distribution, DistributionBlocks.sorter, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 4));
new Recipe(distribution, DistributionBlocks.overflowGate, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 8)); new Recipe(distribution, DistributionBlocks.overflowGate, new ItemStack(Items.densealloy, 4), new ItemStack(Items.copper, 8));
new Recipe(distribution, DistributionBlocks.itemBridge, new ItemStack(Items.densealloy, 8), new ItemStack(Items.copper, 8)); new Recipe(distribution, DistributionBlocks.itemBridge, new ItemStack(Items.densealloy, 8), new ItemStack(Items.copper, 8));
new Recipe(distribution, StorageBlocks.unloader, new ItemStack(Items.densealloy, 50), new ItemStack(Items.silicon, 60));
new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.densealloy, 250), new ItemStack(Items.silicon, 150), new ItemStack(Items.lead, 250), new ItemStack(Items.thorium, 100)); new Recipe(distribution, DistributionBlocks.massDriver, new ItemStack(Items.densealloy, 250), new ItemStack(Items.silicon, 150), new ItemStack(Items.lead, 250), new ItemStack(Items.thorium, 100));
//CRAFTING //CRAFTING
@@ -134,13 +141,6 @@ public class Recipes implements ContentList{
new Recipe(power, PowerBlocks.thoriumReactor, new ItemStack(Items.lead, 600), new ItemStack(Items.silicon, 400), new ItemStack(Items.densealloy, 300), new ItemStack(Items.thorium, 300)); new Recipe(power, PowerBlocks.thoriumReactor, new ItemStack(Items.lead, 600), new ItemStack(Items.silicon, 400), new ItemStack(Items.densealloy, 300), new ItemStack(Items.thorium, 300));
new Recipe(power, PowerBlocks.rtgGenerator, new ItemStack(Items.lead, 200), new ItemStack(Items.silicon, 150), new ItemStack(Items.phasefabric, 50), new ItemStack(Items.plastanium, 150), new ItemStack(Items.thorium, 100)); new Recipe(power, PowerBlocks.rtgGenerator, new ItemStack(Items.lead, 200), new ItemStack(Items.silicon, 150), new ItemStack(Items.phasefabric, 50), new ItemStack(Items.plastanium, 150), new ItemStack(Items.thorium, 100));
//core disabled due to being broken
/*new Recipe(distribution, StorageBlocks.core,
new ItemStack(Items.copper, 2000), new ItemStack(Items.densealloy, 1500),
new ItemStack(Items.silicon, 1500), new ItemStack(Items.thorium, 500),
new ItemStack(Items.surgealloy, 500), new ItemStack(Items.phasefabric, 750)
);*/
//DRILLS, PRODUCERS //DRILLS, PRODUCERS
new Recipe(production, ProductionBlocks.mechanicalDrill, new ItemStack(Items.copper, 45)).setAlwaysUnlocked(true); new Recipe(production, ProductionBlocks.mechanicalDrill, new ItemStack(Items.copper, 45)).setAlwaysUnlocked(true);
new Recipe(production, ProductionBlocks.pneumaticDrill, new ItemStack(Items.copper, 60), new ItemStack(Items.densealloy, 50)); new Recipe(production, ProductionBlocks.pneumaticDrill, new ItemStack(Items.copper, 60), new ItemStack(Items.densealloy, 50));

View File

@@ -152,7 +152,7 @@ public class Weapons implements ContentList{
bomberTrident = new Weapon("bomber"){{ bomberTrident = new Weapon("bomber"){{
length = 0f; length = 0f;
width = 2f; width = 2f;
reload = 9f; reload = 8f;
shots = 2; shots = 2;
roundrobin = true; roundrobin = true;
ejectEffect = Fx.none; ejectEffect = Fx.none;

View File

@@ -192,9 +192,9 @@ public class CraftingBlocks extends BlockList implements ContentList{
biomatterCompressor = new Compressor("biomattercompressor"){{ biomatterCompressor = new Compressor("biomattercompressor"){{
liquidCapacity = 60f; liquidCapacity = 60f;
itemCapacity = 50; itemCapacity = 50;
craftTime = 25f; craftTime = 20f;
outputLiquid = Liquids.oil; outputLiquid = Liquids.oil;
outputLiquidAmount = 1.5f; outputLiquidAmount = 2.5f;
size = 2; size = 2;
health = 320; health = 320;
hasLiquids = true; hasLiquids = true;

View File

@@ -99,13 +99,13 @@ public class ProductionBlocks extends BlockList implements ContentList{
cultivator = new Cultivator("cultivator"){{ cultivator = new Cultivator("cultivator"){{
result = Items.biomatter; result = Items.biomatter;
drillTime = 260; drillTime = 200;
size = 2; size = 2;
hasLiquids = true; hasLiquids = true;
hasPower = true; hasPower = true;
consumes.powerDirect(0.08f); consumes.powerDirect(0.08f);
consumes.liquid(Liquids.water, 0.2f); consumes.liquid(Liquids.water, 0.15f);
}}; }};
} }

View File

@@ -13,20 +13,21 @@ public class StorageBlocks extends BlockList implements ContentList{
public void load(){ public void load(){
core = new CoreBlock("core"){{ core = new CoreBlock("core"){{
health = 1100; health = 1100;
itemCapacity = 3000;
}}; }};
vault = new Vault("vault"){{ vault = new Vault("vault"){{
size = 3; size = 3;
itemCapacity = 900; itemCapacity = 1000;
}}; }};
container = new Vault("container"){{ container = new Vault("container"){{
size = 2; size = 2;
itemCapacity = 200; itemCapacity = 300;
}}; }};
unloader = new SortedUnloader("unloader"){{ unloader = new SortedUnloader("unloader"){{
speed = 12f; speed = 7f;
}}; }};
} }
} }

View File

@@ -69,7 +69,7 @@ public class TurretBlocks extends BlockList implements ContentList{
inaccuracy = 5f; inaccuracy = 5f;
shootCone = 50f; shootCone = 50f;
shootEffect = ShootFx.shootLiquid; shootEffect = ShootFx.shootLiquid;
range = 70f; range = 90f;
health = 360; health = 360;
drawer = (tile, entity) -> { drawer = (tile, entity) -> {

View File

@@ -334,7 +334,7 @@ public class TurretBullets extends BulletList implements ContentList{
lifetime = 200f; lifetime = 200f;
despawneffect = BlockFx.smeltsmoke; despawneffect = BlockFx.smeltsmoke;
hiteffect = BulletFx.hitBulletBig; hiteffect = BulletFx.hitBulletBig;
drag = 0.01f; drag = 0.005f;
} }
@Override @Override

View File

@@ -645,7 +645,8 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
} }
protected void updateFlying(){ protected void updateFlying(){
if(Units.invalidateTarget(target, this)){ if(Units.invalidateTarget(target, this) && !(target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team &&
mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){
target = null; target = null;
} }
@@ -726,11 +727,22 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
isShooting = false; isShooting = false;
if(Settings.getBool("autotarget")){ if(Settings.getBool("autotarget")){
target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange()); target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
if(mech.canHeal && target == null){
target = Geometry.findClosest(x, y, world.indexer.getDamaged(Team.blue));
if(target != null && distanceTo(target) > getWeapon().getAmmo().getRange()){
target = null;
}else if(target != null){
target = ((Tile)target).entity;
}
}
if(target != null){ if(target != null){
setMineTile(null); setMineTile(null);
} }
} }
}else if(target.isValid()){ }else if(target.isValid() || (target instanceof TileEntity && ((TileEntity) target).damaged() && target.getTeam() == team &&
mech.canHeal && distanceTo(target) < getWeapon().getAmmo().getRange())){
//rotate toward and shoot the target //rotate toward and shoot the target
if(mech.turnCursor){ if(mech.turnCursor){
rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f); rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f);

View File

@@ -2,6 +2,7 @@ package io.anuke.mindustry.entities.traits;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Queue; import com.badlogic.gdx.utils.Queue;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.Blocks;
@@ -29,9 +30,7 @@ import io.anuke.ucore.graphics.Fill;
import io.anuke.ucore.graphics.Lines; import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Shapes; import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.Angles; import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf; import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Translator;
import java.io.DataInput; import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
@@ -47,6 +46,7 @@ public interface BuilderTrait extends Entity{
//these are not instance variables! //these are not instance variables!
float placeDistance = 150f; float placeDistance = 150f;
float mineDistance = 70f; float mineDistance = 70f;
Array<BuildRequest> removal = new Array<>();
/**Returns the queue for storing build requests.*/ /**Returns the queue for storing build requests.*/
Queue<BuildRequest> getPlaceQueue(); Queue<BuildRequest> getPlaceQueue();
@@ -171,6 +171,19 @@ public interface BuilderTrait extends Entity{
* This includes mining. * This includes mining.
*/ */
default void updateBuilding(Unit unit){ default void updateBuilding(Unit unit){
//remove already completed build requests
removal.clear();
for(BuildRequest request : getPlaceQueue()){
if((request.breaking && world.tile(request.x, request.y).block() == Blocks.air) ||
(!request.breaking && world.tile(request.x, request.y).block() == request.recipe.result)){
removal.add(request);
}
}
for(BuildRequest req : removal){
getPlaceQueue().removeValue(req, true);
}
BuildRequest current = getCurrentRequest(); BuildRequest current = getCurrentRequest();
//update mining here //update mining here
@@ -373,5 +386,18 @@ public interface BuilderTrait extends Entity{
this.recipe = Recipe.getByResult(world.tile(x, y).block()); this.recipe = Recipe.getByResult(world.tile(x, y).block());
this.breaking = true; this.breaking = true;
} }
@Override
public String toString(){
return "BuildRequest{" +
"x=" + x +
", y=" + y +
", rotation=" + rotation +
", recipe=" + recipe +
", breaking=" + breaking +
", progress=" + progress +
", initialized=" + initialized +
'}';
}
} }
} }

View File

@@ -76,7 +76,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
Effects.effect(ExplosionFx.explosion, unit); Effects.effect(ExplosionFx.explosion, unit);
Effects.shake(2f, 2f, unit); Effects.shake(2f, 2f, unit);
//must run afterwards so the unit's group is not null //must run afterwards so the unit's group is not null when sending the removal packet
threads.runDelay(unit::remove); threads.runDelay(unit::remove);
} }

View File

@@ -22,8 +22,7 @@ import java.io.DataInput;
import java.io.DataOutput; import java.io.DataOutput;
import java.io.IOException; import java.io.IOException;
import static io.anuke.mindustry.Vars.headless; import static io.anuke.mindustry.Vars.*;
import static io.anuke.mindustry.Vars.players;
public class AlphaDrone extends FlyingUnit { public class AlphaDrone extends FlyingUnit {
static final float followDistance = 80f; static final float followDistance = 80f;
@@ -62,7 +61,7 @@ public class AlphaDrone extends FlyingUnit {
} }
} }
if(!leader.isShooting && distanceTo(leader) < 8f){ if(!leader.isShooting && distanceTo(leader) < 7f){
Call.onAlphaDroneFade(AlphaDrone.this); Call.onAlphaDroneFade(AlphaDrone.this);
} }
} }
@@ -71,8 +70,9 @@ public class AlphaDrone extends FlyingUnit {
@Remote(called = Loc.server) @Remote(called = Loc.server)
public static void onAlphaDroneFade(BaseUnit drone){ public static void onAlphaDroneFade(BaseUnit drone){
if(drone == null) return; if(drone == null) return;
drone.remove();
Effects.effect(UnitFx.pickup, drone); Effects.effect(UnitFx.pickup, drone);
//must run afterwards so the unit's group is not null when sending the removal packet
threads.runDelay(drone::remove);
} }
@Override @Override

View File

@@ -352,7 +352,7 @@ public class Drone extends FlyingUnit implements BuilderTrait{
@Override @Override
public boolean canCreateBlocks(){ public boolean canCreateBlocks(){
return false; return true;
} }
@Override @Override

View File

@@ -13,7 +13,6 @@ public enum GameMode{
}}, }},
attack{{ attack{{
disableWaves = true; disableWaves = true;
hidden = true;
enemyCheat = true; enemyCheat = true;
}}, }},
victory{{ victory{{

View File

@@ -215,10 +215,10 @@ public class DesktopInput extends InputHandler{
}else if(selected != null){ }else if(selected != null){
//only begin shooting if there's no cursor event //only begin shooting if there's no cursor event
if (!tileTapped(selected) && !tryTapPlayer(Graphics.mouseWorld().x, Graphics.mouseWorld().y) && player.getPlaceQueue().size == 0 && !droppingItem && if (!tileTapped(selected) && !tryTapPlayer(Graphics.mouseWorld().x, Graphics.mouseWorld().y) && player.getPlaceQueue().size == 0 && !droppingItem &&
!tryBeginMine(selected) && player.getMineTile() == null) { !tryBeginMine(selected) && player.getMineTile() == null && !ui.chatfrag.chatOpen()) {
player.isShooting = true; player.isShooting = true;
} }
}else{ //if it's out of bounds, shooting is just fine }else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine
player.isShooting = true; player.isShooting = true;
} }
}else if(Inputs.keyTap(section, "deselect") && (recipe != null || mode != none || player.isBuilding()) && }else if(Inputs.keyTap(section, "deselect") && (recipe != null || mode != none || player.isBuilding()) &&

View File

@@ -96,6 +96,9 @@ public class MobileInput extends InputHandler implements GestureListener{
TileEntity entity = tile.entity; TileEntity entity = tile.entity;
player.setMineTile(null); player.setMineTile(null);
player.target = entity; player.target = entity;
}else if(tile != null && player.mech.canHeal && tile.entity != null && tile.getTeam() == player.getTeam() && tile.entity.damaged()){
player.setMineTile(null);
player.target = tile.entity;
} }
} }
} }
@@ -221,11 +224,6 @@ public class MobileInput extends InputHandler implements GestureListener{
} }
}).update(l -> l.setChecked(mode == breaking)); }).update(l -> l.setChecked(mode == breaking));
//rotate button
table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4))
.update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center))
.visible(() -> recipe != null && recipe.result.rotate);
//cancel button //cancel button
table.addImageButton("icon-cancel", "clear-partial", 16 * 2f, () -> { table.addImageButton("icon-cancel", "clear-partial", 16 * 2f, () -> {
player.clearBuilding(); player.clearBuilding();
@@ -233,6 +231,11 @@ public class MobileInput extends InputHandler implements GestureListener{
recipe = null; recipe = null;
}).visible(() -> player.isBuilding() || recipe != null || mode == breaking); }).visible(() -> player.isBuilding() || recipe != null || mode == breaking);
//rotate button
table.addImageButton("icon-arrow", "clear-partial", 16 * 2f, () -> rotation = Mathf.mod(rotation + 1, 4))
.update(i -> i.getImage().setRotationOrigin(rotation * 90, Align.center))
.visible(() -> recipe != null && recipe.result.rotate);
//confirm button //confirm button
table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> { table.addImageButton("icon-check", "clear-partial", 16 * 2f, () -> {
for(PlaceRequest request : selection){ for(PlaceRequest request : selection){

View File

@@ -14,7 +14,7 @@ import java.util.zip.InflaterInputStream;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
public class SaveIO{ public class SaveIO{
public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58); public static final IntArray breakingVersions = IntArray.with(47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 63);
public static final IntMap<SaveFileVersion> versions = new IntMap<>(); public static final IntMap<SaveFileVersion> versions = new IntMap<>();
public static final Array<SaveFileVersion> versionArray = Array.with( public static final Array<SaveFileVersion> versionArray = Array.with(
new Save16() new Save16()

View File

@@ -34,6 +34,7 @@ public class Mech extends UnlockableContent{
public Color trailColorTo = Palette.boostTo; public Color trailColorTo = Palette.boostTo;
public int itemCapacity = 30; public int itemCapacity = 30;
public boolean turnCursor = true; public boolean turnCursor = true;
public boolean canHeal = false;
public float weaponOffsetX, weaponOffsetY; public float weaponOffsetX, weaponOffsetY;
public Weapon weapon = Weapons.blaster; public Weapon weapon = Weapons.blaster;

View File

@@ -45,9 +45,9 @@ public class Build{
for(int dx = 0; dx < previous.size; dx++){ for(int dx = 0; dx < previous.size; dx++){
for(int dy = 0; dy < previous.size; dy++){ for(int dy = 0; dy < previous.size; dy++){
int worldx = dx + offsetx + x; int worldx = dx + offsetx + tile.x;
int worldy = dy + offsety + y; int worldy = dy + offsety + tile.y;
if(!(worldx == x && worldy == y)){ if(!(worldx == tile.x && worldy == tile.y)){
Tile toplace = world.tile(worldx, worldy); Tile toplace = world.tile(worldx, worldy);
if(toplace != null){ if(toplace != null){
toplace.setLinked((byte) (dx + offsetx), (byte) (dy + offsety)); toplace.setLinked((byte) (dx + offsetx), (byte) (dy + offsety));

View File

@@ -1,16 +1,8 @@
package io.anuke.mindustry.world.blocks.distribution; package io.anuke.mindustry.world.blocks.distribution;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
public class LiquidTank extends LiquidRouter{ public class LiquidTank extends LiquidRouter{
public LiquidTank(String name){ public LiquidTank(String name){
super(name); super(name);
} }
@Override
public boolean canDumpLiquid(Tile tile, Tile to, Liquid liquid){
return super.canDumpLiquid(tile, to, liquid) && !(to.block() instanceof LiquidTank);
}
} }

View File

@@ -46,7 +46,8 @@ public class PowerNode extends PowerBlock{
@Remote(targets = Loc.both, called = Loc.server, forward = true) @Remote(targets = Loc.both, called = Loc.server, forward = true)
public static void linkPowerNodes(Player player, Tile tile, Tile other){ public static void linkPowerNodes(Player player, Tile tile, Tile other){
if(tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other)) return; if(tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other)
|| tile.entity.power.links.size >= ((PowerNode)tile.block()).maxNodes) return;
TileEntity entity = tile.entity(); TileEntity entity = tile.entity();

View File

@@ -51,7 +51,6 @@ public class CoreBlock extends StorageBlock{
update = true; update = true;
size = 3; size = 3;
hasItems = true; hasItems = true;
itemCapacity = 2000;
viewRange = 200f; viewRange = 200f;
flags = EnumSet.of(BlockFlag.resupplyPoint, BlockFlag.target); flags = EnumSet.of(BlockFlag.resupplyPoint, BlockFlag.target);
} }
@@ -83,8 +82,18 @@ public class CoreBlock extends StorageBlock{
if(entity != null) entity.solid = solid; if(entity != null) entity.solid = solid;
} }
@Override
public int getMaximumAccepted(Tile tile, Item item){
return itemCapacity * state.teams.get(tile.getTeam()).cores.size;
}
@Override @Override
public void onProximityUpdate(Tile tile) { public void onProximityUpdate(Tile tile) {
for(Tile other : state.teams.get(tile.getTeam()).cores){
if(other != tile){
tile.entity.items = other.entity.items;
}
}
state.teams.get(tile.getTeam()).cores.add(tile); state.teams.get(tile.getTeam()).cores.add(tile);
} }
@@ -96,6 +105,11 @@ public class CoreBlock extends StorageBlock{
@Override @Override
public void removed(Tile tile){ public void removed(Tile tile){
state.teams.get(tile.getTeam()).cores.remove(tile); state.teams.get(tile.getTeam()).cores.remove(tile);
int max = itemCapacity * state.teams.get(tile.getTeam()).cores.size;
for(Item item : content.items()){
tile.entity.items.set(item, Math.min(tile.entity.items.get(item), max));
}
} }
@Override @Override
@@ -222,7 +236,7 @@ public class CoreBlock extends StorageBlock{
return new CoreEntity(); return new CoreEntity();
} }
public class CoreEntity extends StorageEntity implements SpawnerTrait{ public class CoreEntity extends TileEntity implements SpawnerTrait{
public Unit currentUnit; public Unit currentUnit;
int droneID = -1; int droneID = -1;
boolean solid = true; boolean solid = true;

View File

@@ -7,6 +7,7 @@ import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.SelectionTrait; import io.anuke.mindustry.world.blocks.SelectionTrait;
import io.anuke.ucore.graphics.Draw; import io.anuke.ucore.graphics.Draw;
@@ -19,15 +20,30 @@ import java.io.IOException;
import static io.anuke.mindustry.Vars.content; import static io.anuke.mindustry.Vars.content;
import static io.anuke.mindustry.Vars.threads; import static io.anuke.mindustry.Vars.threads;
public class SortedUnloader extends Unloader implements SelectionTrait{ public class SortedUnloader extends Block implements SelectionTrait{
protected float speed = 1f; protected float speed = 1f;
protected final int timerUnload = timers++;
private static Item lastItem; private static Item lastItem;
public SortedUnloader(String name){ public SortedUnloader(String name){
super(name); super(name);
update = true;
solid = true;
health = 70;
hasItems = true;
configurable = true; configurable = true;
} }
@Override
public boolean canDump(Tile tile, Tile to, Item item){
Block block = to.target().block();
return !(block instanceof StorageBlock);
}
@Override
public void setBars(){}
@Override @Override
public void playerPlaced(Tile tile){ public void playerPlaced(Tile tile){
threads.runDelay(() -> Call.setSortedUnloaderItem(null, tile, lastItem)); threads.runDelay(() -> Call.setSortedUnloaderItem(null, tile, lastItem));

View File

@@ -1,20 +1,10 @@
package io.anuke.mindustry.world.blocks.storage; package io.anuke.mindustry.world.blocks.storage;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.entities.TileEntity; import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.BarType; import io.anuke.mindustry.world.BarType;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
import static io.anuke.mindustry.Vars.tilesize;
public abstract class StorageBlock extends Block{ public abstract class StorageBlock extends Block{
@@ -23,6 +13,16 @@ public abstract class StorageBlock extends Block{
hasItems = true; hasItems = true;
} }
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
return tile.entity.items.get(item) < getMaximumAccepted(tile, item);
}
@Override
public int getMaximumAccepted(Tile tile, Item item){
return itemCapacity;
}
@Override @Override
public void setBars(){ public void setBars(){
super.setBars(); super.setBars();
@@ -34,85 +34,6 @@ public abstract class StorageBlock extends Block{
return false; return false;
} }
@Override
public void onProximityAdded(Tile tile){
StorageEntity entity = tile.entity();
entity.graph.set(tile);
for(Tile prox : tile.entity.proximity()){
if(prox.block() instanceof StorageBlock){
StorageEntity other = prox.entity();
entity.graph.merge(other.graph);
}
}
}
@Override
public void onProximityRemoved(Tile tile){
StorageEntity entity = tile.entity();
entity.graph.remove(tile);
}
@Override
public void drawSelect(Tile tile){
StorageEntity entity = tile.entity();
if(entity.graph.getTiles().size > 1){
Shaders.outline.color.set(Palette.accent);
Graphics.beginShaders(Shaders.outline);
for(Tile other : entity.graph.getTiles()){
Fill.square(other.drawx(), other.drawy(), other.block().size * tilesize);
}
Draw.color(Color.CLEAR);
Graphics.endShaders();
Draw.color();
}
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
StorageEntity entity = tile.entity();
return entity.graph.accept(item);
}
@Override
public int acceptStack(Item item, int amount, Tile tile, Unit source){
StorageEntity entity = tile.entity();
if(acceptItem(item, tile, tile) && hasItems && (source == null || source.getTeam() == tile.getTeam())){
return Math.min(entity.graph.accept(item, amount), amount);
}else{
return 0;
}
}
@Override
public float inventoryScaling(Tile tile){
StorageEntity entity = tile.entity();
return 1f / entity.graph.getTiles().size;
}
@Override
public TileEntity newEntity(){
return new StorageEntity();
}
@Override
public Array<Object> getDebugInfo(Tile tile){
Array<Object> arr = super.getDebugInfo(tile);
StorageEntity entity = tile.entity();
arr.addAll("storage graph", entity.graph.getID(),
"graph capacity", entity.graph.getCapacity(),
"graph tiles", entity.graph.getTiles().size,
"graph item ID", entity.graph.items().getID());
return arr;
}
/** /**
* Removes an item and returns it. If item is not null, it should return the item. * Removes an item and returns it. If item is not null, it should return the item.
* Returns null if no items are there. * Returns null if no items are there.
@@ -144,8 +65,4 @@ public abstract class StorageBlock extends Block{
return entity.items.has(item); return entity.items.has(item);
} }
} }
public class StorageEntity extends TileEntity{
public StorageGraph graph = new StorageGraph();
}
} }

View File

@@ -1,151 +0,0 @@
package io.anuke.mindustry.world.blocks.storage;
import com.badlogic.gdx.utils.IntSet;
import com.badlogic.gdx.utils.ObjectSet;
import com.badlogic.gdx.utils.Queue;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.storage.StorageBlock.StorageEntity;
import io.anuke.mindustry.world.modules.ItemModule;
public class StorageGraph{
private static IntSet closedSet = new IntSet();
private static Queue<Tile> queue = new Queue<>();
private static ObjectSet<ItemModule> itemSet = new ObjectSet<>();
private static int lastID;
private final int id = lastID++;
private ObjectSet<Tile> tiles = new ObjectSet<>();
private ItemModule items = new ItemModule();
private int capacity;
public void set(Tile tile){
items.addAll(tile.entity.items);
items.setID(tile.entity.items.getID());
add(tile);
}
public void add(Tile tile){
if(!tiles.add(tile)) return;
StorageEntity e = tile.entity();
e.graph = this;
capacity += tile.block().itemCapacity;
if(tile.entity.items != null && tile.entity.items.getID() != items.getID()){
items.addAll(tile.entity.items);
}
tile.entity.items = items;
}
public void remove(Tile tile){
if(!tiles.contains(tile)) return;
for(Tile other : tiles){
if(other == tile) continue;
StorageEntity entity = other.entity();
entity.graph = null;
entity.items = new ItemModule();
float fraction = (float)other.block().itemCapacity / capacity;
items.forEach((item, amount) -> {
int added = (int)(fraction * amount);
entity.items.add(item, added);
items.remove(item, added);
});
}
//handle remaining items that didn't get added
Item taken;
while((taken = items.take()) != null){
for(Tile other : tiles){
if(other == tile) continue;
//insert item into first found block
if(other.entity.items.get(taken) < other.block().itemCapacity){
other.entity.items.add(taken, 1);
break;
}
}
}
items.clear();
capacity = 0;
for(Tile other : tile.entity.proximity()){
if(other.block() instanceof StorageBlock && other.<StorageEntity>entity().graph == null){
StorageGraph graph = new StorageGraph();
other.<StorageEntity>entity().graph = graph;
graph.reflow(tile, other);
}
}
}
public void reflow(Tile base, Tile tile){
queue.clear();
queue.addLast(tile);
closedSet.clear();
itemSet.clear();
while(queue.size > 0){
Tile child = queue.removeFirst();
StorageEntity entity = child.entity();
entity.graph = this;
if(!itemSet.add(child.entity.items)) child.entity.items = null;
add(child);
for(Tile next : child.entity.proximity()){
if(next != base && next.block() instanceof StorageBlock && next.<StorageEntity>entity().graph == null && !closedSet.contains(next.pos())){
queue.addLast(next);
closedSet.add(next.pos());
}
}
}
}
public void merge(StorageGraph other){
if(this == other || other == null) return;
itemSet.clear();
for(Tile tile : other.tiles){
if(!itemSet.add(tile.entity.items)){
tile.entity.items = null;
}
}
for(Tile tile : other.tiles){
add(tile);
}
}
public boolean accept(Item item){
return accept(item, 1) == 1;
}
public int accept(Item item, int amount){
return Math.min(capacity - items.get(item), amount);
}
public ObjectSet<Tile> getTiles(){
return tiles;
}
public int getID(){
return id;
}
public int getCapacity(){
return capacity;
}
public ItemModule items(){
return items;
}
}

View File

@@ -1,26 +0,0 @@
package io.anuke.mindustry.world.blocks.storage;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
public abstract class Unloader extends Block{
protected final int timerUnload = timers++;
public Unloader(String name){
super(name);
update = true;
solid = true;
health = 70;
hasItems = true;
}
@Override
public boolean canDump(Tile tile, Tile to, Item item){
Block block = to.target().block();
return !(block instanceof StorageBlock);
}
@Override
public void setBars(){}
}

View File

@@ -7,7 +7,6 @@ public class Vault extends StorageBlock{
solid = true; solid = true;
update = false; update = false;
destructible = true; destructible = true;
itemCapacity = 1000;
} }
} }

View File

@@ -5,21 +5,22 @@ import com.badlogic.gdx.math.GridPoint2;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.Items; import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.content.UnitTypes; import io.anuke.mindustry.content.UnitTypes;
import io.anuke.mindustry.content.blocks.Blocks; import io.anuke.mindustry.content.blocks.*;
import io.anuke.mindustry.content.blocks.CraftingBlocks;
import io.anuke.mindustry.content.blocks.PowerBlocks;
import io.anuke.mindustry.content.blocks.StorageBlocks;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.core.Logic; import io.anuke.mindustry.core.Logic;
import io.anuke.mindustry.core.NetServer; import io.anuke.mindustry.core.NetServer;
import io.anuke.mindustry.core.World; import io.anuke.mindustry.core.World;
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.units.BaseUnit; import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.types.Spirit;
import io.anuke.mindustry.game.Content; import io.anuke.mindustry.game.Content;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.io.BundleLoader; import io.anuke.mindustry.io.BundleLoader;
import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.type.ContentType;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.Recipe;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Edges;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -229,6 +230,70 @@ public class ApplicationTests{
assertEquals(8, edges2.length); assertEquals(8, edges2.length);
} }
@Test
void buildingOverlap(){
initBuilding();
Spirit d1 = (Spirit) UnitTypes.spirit.create(Team.blue);
Spirit d2 = (Spirit) UnitTypes.spirit.create(Team.blue);
d1.set(10f, 20f);
d2.set(10f, 20f);
d1.addBuildRequest(new BuildRequest(0, 0, 0, Recipe.getByResult(DefenseBlocks.copperWallLarge)));
d2.addBuildRequest(new BuildRequest(1, 1, 0, Recipe.getByResult(DefenseBlocks.copperWallLarge)));
Timers.setDeltaProvider(() -> 9999999f);
d1.updateBuilding(d1);
d2.updateBuilding(d2);
assertEquals(DefenseBlocks.copperWallLarge, world.tile(0, 0).block());
assertEquals(Blocks.air, world.tile(2, 2).block());
assertEquals(Blocks.blockpart, world.tile(1, 1).block());
}
@Test
void buildingDestruction(){
initBuilding();
Spirit d1 = (Spirit) UnitTypes.spirit.create(Team.blue);
Spirit d2 = (Spirit) UnitTypes.spirit.create(Team.blue);
d1.set(10f, 20f);
d2.set(10f, 20f);
d1.addBuildRequest(new BuildRequest(0, 0, 0, Recipe.getByResult(DefenseBlocks.copperWallLarge)));
d2.addBuildRequest(new BuildRequest(1, 1));
Timers.setDeltaProvider(() -> 3f);
d1.updateBuilding(d1);
Timers.setDeltaProvider(() -> 1f);
d2.updateBuilding(d2);
assertEquals(content.getByName(ContentType.block, "build2"), world.tile(0, 0).block());
Timers.setDeltaProvider(() -> 9999f);
d1.updateBuilding(d1);
d2.updateBuilding(d2);
assertEquals(Blocks.air, world.tile(0, 0).block());
assertEquals(Blocks.air, world.tile(2, 2).block());
assertEquals(Blocks.air, world.tile(1, 1).block());
}
void initBuilding(){
createMap();
Tile core = world.tile(5, 5);
world.setBlock(core, StorageBlocks.core, Team.blue);
for(Item item : content.items()){
core.entity.items.set(item, 3000);
}
assertEquals(core, state.teams.get(Team.blue).cores.first());
}
void depositTest(Block block, Item item){ void depositTest(Block block, Item item){
BaseUnit unit = UnitTypes.alphaDrone.create(Team.none); BaseUnit unit = UnitTypes.alphaDrone.create(Team.none);
Tile tile = new Tile(0, 0, Blocks.air.id, block.id); Tile tile = new Tile(0, 0, Blocks.air.id, block.id);