Merge branch 'master' of https://github.com/Anuken/Mindustry into 7.0-features
Conflicts: core/src/mindustry/content/Planets.java tools/src/mindustry/tools/Generators.java
@@ -22,8 +22,8 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void process(RoundEnvironment env) throws Exception{
|
public void process(RoundEnvironment env) throws Exception{
|
||||||
processSounds("Sounds", rootDirectory + "/core/assets/sounds", "arc.audio.Sound");
|
processSounds("Sounds", rootDirectory + "/core/assets/sounds", "arc.audio.Sound", true);
|
||||||
processSounds("Musics", rootDirectory + "/core/assets/music", "arc.audio.Music");
|
processSounds("Musics", rootDirectory + "/core/assets/music", "arc.audio.Music", false);
|
||||||
processUI(env.getElementsAnnotatedWith(StyleDefaults.class));
|
processUI(env.getElementsAnnotatedWith(StyleDefaults.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,25 +117,27 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
JavaFile.builder(packageName, type.build()).build().writeTo(BaseProcessor.filer);
|
JavaFile.builder(packageName, type.build()).build().writeTo(BaseProcessor.filer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void processSounds(String classname, String path, String rtype) throws Exception{
|
void processSounds(String classname, String path, String rtype, boolean genid) throws Exception{
|
||||||
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
TypeSpec.Builder type = TypeSpec.classBuilder(classname).addModifiers(Modifier.PUBLIC);
|
||||||
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
MethodSpec.Builder loadBegin = MethodSpec.methodBuilder("load").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||||
CodeBlock.Builder staticb = CodeBlock.builder();
|
CodeBlock.Builder staticb = CodeBlock.builder();
|
||||||
|
|
||||||
type.addField(FieldSpec.builder(IntMap.class, "idToSound", Modifier.STATIC, Modifier.PRIVATE).initializer("new IntMap()").build());
|
if(genid){
|
||||||
type.addField(FieldSpec.builder(ObjectIntMap.class, "soundToId", Modifier.STATIC, Modifier.PRIVATE).initializer("new ObjectIntMap()").build());
|
type.addField(FieldSpec.builder(IntMap.class, "idToSound", Modifier.STATIC, Modifier.PRIVATE).initializer("new IntMap()").build());
|
||||||
|
type.addField(FieldSpec.builder(ObjectIntMap.class, "soundToId", Modifier.STATIC, Modifier.PRIVATE).initializer("new ObjectIntMap()").build());
|
||||||
|
|
||||||
type.addMethod(MethodSpec.methodBuilder("getSoundId")
|
type.addMethod(MethodSpec.methodBuilder("getSoundId")
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
.addParameter(Sound.class, "sound")
|
.addParameter(Sound.class, "sound")
|
||||||
.returns(int.class)
|
.returns(int.class)
|
||||||
.addStatement("return soundToId.get(sound, -1)").build());
|
.addStatement("return soundToId.get(sound, -1)").build());
|
||||||
|
|
||||||
type.addMethod(MethodSpec.methodBuilder("getSound")
|
type.addMethod(MethodSpec.methodBuilder("getSound")
|
||||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
|
||||||
.addParameter(int.class, "id")
|
.addParameter(int.class, "id")
|
||||||
.returns(Sound.class)
|
.returns(Sound.class)
|
||||||
.addStatement("return (Sound)idToSound.get(id, () -> Sounds.none)").build());
|
.addStatement("return (Sound)idToSound.get(id, () -> Sounds.none)").build());
|
||||||
|
}
|
||||||
|
|
||||||
HashSet<String> names = new HashSet<>();
|
HashSet<String> names = new HashSet<>();
|
||||||
Seq<Fi> files = new Seq<>();
|
Seq<Fi> files = new Seq<>();
|
||||||
@@ -157,17 +159,23 @@ public class AssetsProcess extends BaseProcessor{
|
|||||||
|
|
||||||
String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length());
|
String filepath = path.substring(path.lastIndexOf("/") + 1) + p.path().substring(p.path().lastIndexOf(path) + path.length());
|
||||||
|
|
||||||
staticb.addStatement("soundToId.put($L, $L)", name, id);
|
if(genid){
|
||||||
|
staticb.addStatement("soundToId.put($L, $L)", name, id);
|
||||||
|
|
||||||
loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; soundToId.put(a, $L); idToSound.put($L, a); }",
|
loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; soundToId.put(a, $L); idToSound.put($L, a); }",
|
||||||
Core.class, filepath, rtype, name, rtype, id, id);
|
Core.class, filepath, rtype, name, rtype, id, id);
|
||||||
|
}else{
|
||||||
|
loadBegin.addStatement("$T.assets.load($S, $L.class).loaded = a -> { $L = ($L)a; }", Core.class, filepath, rtype, name, rtype);
|
||||||
|
}
|
||||||
|
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
|
||||||
|
|
||||||
id ++;
|
id ++;
|
||||||
}
|
}
|
||||||
|
|
||||||
type.addStaticBlock(staticb.build());
|
if(genid){
|
||||||
|
type.addStaticBlock(staticb.build());
|
||||||
|
}
|
||||||
|
|
||||||
if(classname.equals("Sounds")){
|
if(classname.equals("Sounds")){
|
||||||
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
|
type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), "none", Modifier.STATIC, Modifier.PUBLIC).initializer("new " + rtype + "()").build());
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
@@ -415,6 +415,7 @@ wavemode.health = health
|
|||||||
editor.default = [lightgray]<Default>
|
editor.default = [lightgray]<Default>
|
||||||
details = Details...
|
details = Details...
|
||||||
edit = Edit...
|
edit = Edit...
|
||||||
|
variables = Vars
|
||||||
editor.name = Name:
|
editor.name = Name:
|
||||||
editor.spawn = Spawn Unit
|
editor.spawn = Spawn Unit
|
||||||
editor.removeunit = Remove Unit
|
editor.removeunit = Remove Unit
|
||||||
|
|||||||
@@ -415,6 +415,7 @@ wavemode.health = vie
|
|||||||
editor.default = [lightgray]<par défaut>
|
editor.default = [lightgray]<par défaut>
|
||||||
details = Détails...
|
details = Détails...
|
||||||
edit = Modifier...
|
edit = Modifier...
|
||||||
|
variables = Vars
|
||||||
editor.name = Nom :
|
editor.name = Nom :
|
||||||
editor.spawn = Ajouter une unité
|
editor.spawn = Ajouter une unité
|
||||||
editor.removeunit = Retirer l'unité
|
editor.removeunit = Retirer l'unité
|
||||||
@@ -1299,6 +1300,7 @@ block.plated-conduit.name = Conduit Plaqué
|
|||||||
block.phase-conduit.name = Conduit Phasé
|
block.phase-conduit.name = Conduit Phasé
|
||||||
block.liquid-router.name = Routeur de Liquides
|
block.liquid-router.name = Routeur de Liquides
|
||||||
block.liquid-tank.name = Réservoir à Liquides
|
block.liquid-tank.name = Réservoir à Liquides
|
||||||
|
block.liquid-container.name = Conteneur de liquide
|
||||||
block.liquid-junction.name = Jonction à Liquides
|
block.liquid-junction.name = Jonction à Liquides
|
||||||
block.bridge-conduit.name = Pont à Liquide
|
block.bridge-conduit.name = Pont à Liquide
|
||||||
block.rotary-pump.name = Pompe Rotative
|
block.rotary-pump.name = Pompe Rotative
|
||||||
@@ -1346,9 +1348,16 @@ block.silicon-crucible.name = Grande Fonderie de Silicium
|
|||||||
block.overdrive-dome.name = Dôme Accélérant
|
block.overdrive-dome.name = Dôme Accélérant
|
||||||
block.interplanetary-accelerator.name = Accélérateur Interplanétaire
|
block.interplanetary-accelerator.name = Accélérateur Interplanétaire
|
||||||
#experimental, may be removed
|
#experimental, may be removed
|
||||||
block.block-forge.name = Forgeur de Blocs
|
block.constructor.name = Constructeur
|
||||||
block.block-loader.name = Chargeur de Blocs
|
block.constructor.description = Fabrique des structures d'une taille maximale de 2x2 (tuiles).
|
||||||
block.block-unloader.name = Déchargeur de Blocs
|
block.large-constructor.name = Grand Constructeur
|
||||||
|
block.large-constructor.description = Fabrique des structures d'une taille maximale de 4x4 (tuiles).
|
||||||
|
block.deconstructor.name = Déconstructeur
|
||||||
|
block.deconstructor.description = Déconstruit les structures et les unités. Retourne 100% du coût de construction.
|
||||||
|
block.payload-loader.name = Chargeur de charge utile
|
||||||
|
block.payload-loader.description = Chargez les liquides et les articles dans les blocs.
|
||||||
|
block.payload-unloader.name = Déchargeur de charge utile
|
||||||
|
block.payload-unloader.description = Décharge les liquides et les articles des blocs.
|
||||||
|
|
||||||
block.switch.name = Interrupteur
|
block.switch.name = Interrupteur
|
||||||
block.micro-processor.name = Micro Processeur
|
block.micro-processor.name = Micro Processeur
|
||||||
@@ -1504,6 +1513,7 @@ block.conduit.description = Bloc de transport de liquide de base, faisant avance
|
|||||||
block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards.
|
block.pulse-conduit.description = Conduit avancé permettant le transport de liquide. Transporte les liquides plus rapidement et en stocke plus que les conduits standards.
|
||||||
block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire.
|
block.plated-conduit.description = Déplace les liquides au même rythme que les conduits à impulsion, mais est renforcé et empêche les fuites en cas de rupture. N'accepte pas les liquides provenant des côtés, seuls les autres conduits peuvent le faire.
|
||||||
block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide.
|
block.liquid-router.description = Accepte les liquides depuis une direction et les distribue jusqu'à 3 directions équitablement. Utile pour envoyer un liquide à plusieurs endroits. Peut aussi stocker une certaine quantité de liquide.
|
||||||
|
block.liquid-container.description = Stocke une quantité considérable de liquide. Sort de tous les côtés, de la même manière qu'un routeur de liquide.
|
||||||
block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants.
|
block.liquid-tank.description = Stocke une grande quantité de liquide et peut les distribuer dans tous les côtés, un peu comme un routeur liquide.\nUtile pour réguler la demande en liquide si elle est inconstante ou comme sécurité pour refroidir des bâtiments importants.
|
||||||
block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits.
|
block.liquid-junction.description = Agit comme un pont pour deux conduits se croisant. Utile si deux conduits amènent différents liquides à différents endroits.
|
||||||
block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
|
block.bridge-conduit.description = Bloc de transport de liquide avancé permettant de traverser jusqu'à 3 blocs, au-dessus de n'importe quel terrain ou bâtiment.
|
||||||
@@ -1769,6 +1779,7 @@ lenum.itemdrop = Lâche un objet.
|
|||||||
lenum.itemtake = Prend un objet depuis un bâtiment.
|
lenum.itemtake = Prend un objet depuis un bâtiment.
|
||||||
lenum.paydrop = Lâche le chargement actuel.
|
lenum.paydrop = Lâche le chargement actuel.
|
||||||
lenum.paytake = Prend un chargement à la position actuelle.
|
lenum.paytake = Prend un chargement à la position actuelle.
|
||||||
|
lenum.payenter = Entrez/atterrissez sur le bloc de charge utile sur lequel se trouve l'unité.
|
||||||
lenum.flag = Drapeau numérique d'une unité.
|
lenum.flag = Drapeau numérique d'une unité.
|
||||||
lenum.mine = Mine à une position donnée.
|
lenum.mine = Mine à une position donnée.
|
||||||
lenum.build = Construit une structure.
|
lenum.build = Construit une structure.
|
||||||
|
|||||||
@@ -1295,6 +1295,7 @@ block.plated-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-container.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 = 동력 펌프
|
||||||
@@ -1341,10 +1342,16 @@ block.disassembler.name = 광재 분해기
|
|||||||
block.silicon-crucible.name = 실리콘 도가니
|
block.silicon-crucible.name = 실리콘 도가니
|
||||||
block.overdrive-dome.name = 대형 과부하 프로젝터
|
block.overdrive-dome.name = 대형 과부하 프로젝터
|
||||||
block.interplanetary-accelerator.name = 성간 코어 가속기
|
block.interplanetary-accelerator.name = 성간 코어 가속기
|
||||||
#experimental, may be removed / 이 아래의 블록들은 테스트용 임시 블록들이였습니다.
|
block.constructor.name = 제작대
|
||||||
block.block-forge.name = 블록 제작대
|
block.constructor.description = 최대 2x2 크기의 블록을 제작합니다.
|
||||||
block.block-loader.name = 블록 로더
|
block.large-constructor.name = 대형 제작대
|
||||||
block.block-unloader.name = 블록 언로더
|
block.large-constructor.description = 최대 4x4 크기의 블록을 제작합니다.
|
||||||
|
block.deconstructor.name = 분해기
|
||||||
|
block.deconstructor.description = 블록과 유닛을 분해합니다. 건설 비용의 100%를 돌려받습니다.
|
||||||
|
block.payload-loader.name = 블록 로더
|
||||||
|
block.payload-loader.description = 들어간 블록에 액체와 아이템을 저장합니다.
|
||||||
|
block.payload-unloader.name = 블록 언로더
|
||||||
|
block.payload-unloader.description = 들어간 블록에서 액체와 아이템을 가져옵니다.
|
||||||
|
|
||||||
block.switch.name = 스위치
|
block.switch.name = 스위치
|
||||||
block.micro-processor.name = 마이크로 프로세서
|
block.micro-processor.name = 마이크로 프로세서
|
||||||
@@ -1500,6 +1507,7 @@ block.conduit.description = 기본 액체 운송 블록. 액체를 앞으로 이
|
|||||||
block.pulse-conduit.description = 고급 액체 운송 블록. 액체를 더 빠르게 운반하고 표준 파이프보다 더 많이 저장합니다.
|
block.pulse-conduit.description = 고급 액체 운송 블록. 액체를 더 빠르게 운반하고 표준 파이프보다 더 많이 저장합니다.
|
||||||
block.plated-conduit.description = 펄스 파이프와 같은 속도로 이동하지만 더 높은 방어력을 가지고 있습니다. 측면에서 액체들을 받아들이지 않습니다.\n액체가 누설하지 않습니다.
|
block.plated-conduit.description = 펄스 파이프와 같은 속도로 이동하지만 더 높은 방어력을 가지고 있습니다. 측면에서 액체들을 받아들이지 않습니다.\n액체가 누설하지 않습니다.
|
||||||
block.liquid-router.description = 한 방향에서 액체를 받아 최대 3개의 다른 방향으로 같이 출력합니다. 일정량의 액체를 저장할 수도 있으며 한 소스에서 여러 대상으로 액체를 나누는 데 유용합니다.
|
block.liquid-router.description = 한 방향에서 액체를 받아 최대 3개의 다른 방향으로 같이 출력합니다. 일정량의 액체를 저장할 수도 있으며 한 소스에서 여러 대상으로 액체를 나누는 데 유용합니다.
|
||||||
|
block.liquid-container.description = 상당한 양의 액체를 저장합니다. 액체 라우터와 유사하게 모든 면에 출력할 수 있습니다.
|
||||||
block.liquid-tank.description = 대량의 액체를 저장합니다. 재료가 일정하지 않은 상황에서 버퍼를 생성하거나 중요한 블록을 냉각하기 위한 보호 장치로 사용하세요.
|
block.liquid-tank.description = 대량의 액체를 저장합니다. 재료가 일정하지 않은 상황에서 버퍼를 생성하거나 중요한 블록을 냉각하기 위한 보호 장치로 사용하세요.
|
||||||
block.liquid-junction.description = 두 개의 교차 파이프를 위한 다리 역할을 합니다. 다른 액체를 다른 위치로 운반하는 두 개의 다른 파이프가 있는 상황에서 유용합니다.
|
block.liquid-junction.description = 두 개의 교차 파이프를 위한 다리 역할을 합니다. 다른 액체를 다른 위치로 운반하는 두 개의 다른 파이프가 있는 상황에서 유용합니다.
|
||||||
block.bridge-conduit.description = 고급 액체 운송 블록. 지형이나 건물을 넘어 최대 3개 타일 위로 액체를 운반할 수 있습니다.
|
block.bridge-conduit.description = 고급 액체 운송 블록. 지형이나 건물을 넘어 최대 3개 타일 위로 액체를 운반할 수 있습니다.
|
||||||
@@ -1765,6 +1773,7 @@ lenum.itemdrop = 아이템 투하
|
|||||||
lenum.itemtake = 건물에서 아이템 수송
|
lenum.itemtake = 건물에서 아이템 수송
|
||||||
lenum.paydrop = 현재 화물 투하
|
lenum.paydrop = 현재 화물 투하
|
||||||
lenum.paytake = 현재 위치에서 화물 수송
|
lenum.paytake = 현재 위치에서 화물 수송
|
||||||
|
lenum.payenter = 아래 화물 건물에 착륙
|
||||||
lenum.flag = 깃발 수 설정
|
lenum.flag = 깃발 수 설정
|
||||||
lenum.mine = 특정 위치에서 채광
|
lenum.mine = 특정 위치에서 채광
|
||||||
lenum.build = 구조물 건설
|
lenum.build = 구조물 건설
|
||||||
|
|||||||
@@ -407,6 +407,7 @@ wavemode.health = всего прочности
|
|||||||
editor.default = [lightgray]<По умолчанию>
|
editor.default = [lightgray]<По умолчанию>
|
||||||
details = Подробности…
|
details = Подробности…
|
||||||
edit = Редактировать…
|
edit = Редактировать…
|
||||||
|
variables = Переменные
|
||||||
editor.name = Название:
|
editor.name = Название:
|
||||||
editor.spawn = Создать боевую единицу
|
editor.spawn = Создать боевую единицу
|
||||||
editor.removeunit = Удалить боевую единицу
|
editor.removeunit = Удалить боевую единицу
|
||||||
@@ -1290,6 +1291,7 @@ block.plated-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-container.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 = Роторный насос
|
||||||
@@ -1341,6 +1343,16 @@ block.block-forge.name = Завод блоков
|
|||||||
block.block-loader.name = Загрузчик блоков
|
block.block-loader.name = Загрузчик блоков
|
||||||
block.block-unloader.name = Разгрузчик блоков
|
block.block-unloader.name = Разгрузчик блоков
|
||||||
block.interplanetary-accelerator.name = Межпланетный ускоритель
|
block.interplanetary-accelerator.name = Межпланетный ускоритель
|
||||||
|
block.constructor.name = Конструктор
|
||||||
|
block.constructor.description = Производит грузы размером 1x1 и 2x2
|
||||||
|
block.large-constructor.name = Большой конструктор
|
||||||
|
block.large-constructor.description = Производит грузы размером 3x3 и 4x4
|
||||||
|
block.deconstructor.name = Деконструктор
|
||||||
|
block.deconstructor.description = Разбирает грузы и боевые единицы с возвращением 100% использованных ресурсов на их производство
|
||||||
|
block.payload-loader.name = Грузовой загрузчик
|
||||||
|
block.payload-loader.description = Загружает жидкости и ресурсы в груз
|
||||||
|
block.payload-unloader.name = Грузовой разгрузчик
|
||||||
|
block.payload-unloader.description = Выгружает жидкости и ресурсы из груза
|
||||||
|
|
||||||
block.switch.name = Переключатель
|
block.switch.name = Переключатель
|
||||||
block.micro-processor.name = Микропроцессор
|
block.micro-processor.name = Микропроцессор
|
||||||
@@ -1496,6 +1508,7 @@ block.liquid-router.description = Принимает жидкости из од
|
|||||||
block.liquid-tank.description = Хранит большое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору.
|
block.liquid-tank.description = Хранит большое количество жидкости. Выводит жидкости во все стороны, подобно жидкостному маршрутизатору.
|
||||||
block.liquid-junction.description = Действует как мост для двух пересекающихся трубопроводов.
|
block.liquid-junction.description = Действует как мост для двух пересекающихся трубопроводов.
|
||||||
block.bridge-conduit.description = Перемещает жидкости над любой местностью или зданиями.
|
block.bridge-conduit.description = Перемещает жидкости над любой местностью или зданиями.
|
||||||
|
block.liquid-container.description = Хранит большое количество жидкости. Выводит их во все стороны, как жидкостный маршрутизатор.
|
||||||
block.phase-conduit.description = Перемещает жидкости над любой местностью или зданиями. Большая дистанция, чем у жидкостного моста, но требует энергию.
|
block.phase-conduit.description = Перемещает жидкости над любой местностью или зданиями. Большая дистанция, чем у жидкостного моста, но требует энергию.
|
||||||
block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки.
|
block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки.
|
||||||
block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью.
|
block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью.
|
||||||
|
|||||||
@@ -1294,6 +1294,7 @@ block.pulse-conduit.name = ท่อน้ำพัลซ์
|
|||||||
block.plated-conduit.name = ท่อน้ำเสริมเกราะ
|
block.plated-conduit.name = ท่อน้ำเสริมเกราะ
|
||||||
block.phase-conduit.name = ท่อน้ำเฟส
|
block.phase-conduit.name = ท่อน้ำเฟส
|
||||||
block.liquid-router.name = เร้าเตอร์ของเหลว
|
block.liquid-router.name = เร้าเตอร์ของเหลว
|
||||||
|
block.liquid-container.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 = สะพานของเหลว
|
||||||
@@ -1341,10 +1342,16 @@ block.disassembler.name = เครื่องถอดแยกส่วนป
|
|||||||
block.silicon-crucible.name = เบ้าหลอมซิลิคอน
|
block.silicon-crucible.name = เบ้าหลอมซิลิคอน
|
||||||
block.overdrive-dome.name = โดมเร่งประสิทธิภาพ
|
block.overdrive-dome.name = โดมเร่งประสิทธิภาพ
|
||||||
block.interplanetary-accelerator.name = ฐานเร่งความเร็วระหว่างดาวเคราะห์
|
block.interplanetary-accelerator.name = ฐานเร่งความเร็วระหว่างดาวเคราะห์
|
||||||
#experimental, may be removed
|
block.constructor.name = เครื่องก่อสร้าง
|
||||||
block.block-forge.name = เครื่องสร้างบล็อก
|
block.constructor.description = สรรค์สร้างสิ่งก่อสร้างขนาดจนถึง 2x2 ช่อง
|
||||||
block.block-loader.name = เครื่องโหลดบล็อก
|
block.large-constructor.name = เครื่องก่อสร้างขนาดใหญ่
|
||||||
block.block-unloader.name = เครื่องถ่ายบล็อก
|
block.large-constructor.description = สรรค์สร้างสิ่งก่อสร้างขนาดจนถึง 4x4 ช่อง
|
||||||
|
block.deconstructor.name = เครื่องลบทำลาย
|
||||||
|
block.deconstructor.description = ลบทำลายสิ่งก่อสร้างและยูนิต คืน 100% ของทรัพยากรที่ใช้ในการสร้าง
|
||||||
|
block.payload-loader.name = เครื่องโหลดสิ่งบรรทุก
|
||||||
|
block.payload-loader.description = โหลดของเหลวและไอเท็มเข้าไปในบล็อก
|
||||||
|
block.payload-unloader.name = เครื่องถ่ายสิ่งบรรทุก
|
||||||
|
block.payload-unloader.description = ถ่ายของเหลวและไอเท็มออกจากบล็อก
|
||||||
|
|
||||||
block.switch.name = สวิตช์
|
block.switch.name = สวิตช์
|
||||||
block.micro-processor.name = ตัวประมวลผลขนาดเล็ก
|
block.micro-processor.name = ตัวประมวลผลขนาดเล็ก
|
||||||
@@ -1445,7 +1452,7 @@ liquid.cryofluid.details = ของเหลวเฉื่อยและไ
|
|||||||
|
|
||||||
block.derelict = [lightgray]ถูกทิ้งร้าง
|
block.derelict = [lightgray]ถูกทิ้งร้าง
|
||||||
block.armored-conveyor.description = เลื่อนไอเท็มไปข้างหน้า เร็วเท่าสายพานไทเทเนี่ยม แต่มีเกราะที่แข็งแรงกว่า ไม่รับไอเท็มจากด้านข้างยกเว้นเป็นสายพานด้วยกันเอง
|
block.armored-conveyor.description = เลื่อนไอเท็มไปข้างหน้า เร็วเท่าสายพานไทเทเนี่ยม แต่มีเกราะที่แข็งแรงกว่า ไม่รับไอเท็มจากด้านข้างยกเว้นเป็นสายพานด้วยกันเอง
|
||||||
block.illuminator.description = ตัวเปล่งแสงขนาดกะทัดรัด ส่องสว่างในที่มืดได้ดี\nแถมยังกำหนดสีของแสงได้ด้วย... เจ๋งใช่มั้ยล่ะ
|
block.illuminator.description = ตัวเปล่งแสงขนาดกะทัดรัด ส่องสว่างในที่มืดได้ดี\nแถมยังกำหนดค่าสีของแสงได้ด้วย... เจ๋งใช่มั้ยล่ะ
|
||||||
block.message.description = เก็บข้อความ ใช้สื่อสารกับพันธมิตร
|
block.message.description = เก็บข้อความ ใช้สื่อสารกับพันธมิตร
|
||||||
block.graphite-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์
|
block.graphite-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์
|
||||||
block.multi-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์ ใช้น้ำและพลังงานในการแปรรูปถ่านหินให้เร็วและมีประสิทธิภาพมากขึ้น
|
block.multi-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์ ใช้น้ำและพลังงานในการแปรรูปถ่านหินให้เร็วและมีประสิทธิภาพมากขึ้น
|
||||||
@@ -1515,13 +1522,14 @@ block.conduit.description = เคลื่อนย้ายของเหล
|
|||||||
block.pulse-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า เคลื่อนย้ายได้เร็วขึ้นและเก็บของเหลวได้เยอะกว่าท่อน้ำธรรมดา
|
block.pulse-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า เคลื่อนย้ายได้เร็วขึ้นและเก็บของเหลวได้เยอะกว่าท่อน้ำธรรมดา
|
||||||
block.plated-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า ไม่รับของเหลวจากด้านข้างนอกจากท่อน้ำด้วยกันเอง\nไม่รั่ว และมีเกราะที่หนากว่า
|
block.plated-conduit.description = เคลื่อนย้ายของเหลวไปข้างหน้า ไม่รับของเหลวจากด้านข้างนอกจากท่อน้ำด้วยกันเอง\nไม่รั่ว และมีเกราะที่หนากว่า
|
||||||
block.liquid-router.description = รับของเหลวจากทางเดียวแล้วส่งออกสามทางเท่าๆกัน สามารถเก็บของเหลวได้จำนวนหนึ่ง\nมีประโยชน์สำหรับการส่งของเหลวจากปั้มไปยังหลายที่
|
block.liquid-router.description = รับของเหลวจากทางเดียวแล้วส่งออกสามทางเท่าๆกัน สามารถเก็บของเหลวได้จำนวนหนึ่ง\nมีประโยชน์สำหรับการส่งของเหลวจากปั้มไปยังหลายที่
|
||||||
block.liquid-tank.description = เก็บของเหลวจำนวนมาก ส่งออกไปรอบด้านคล้ายกับเร้าเตอร์ของเหลว\nใช้สำหรับสร้างกันชนในเวลาที่ของเหลวไม่คงที่หรือเวลาที่ใช้ของเหลว\nเป็นจำนวนมาก
|
block.liquid-container.description = เก็บของเหลวจำนวนปานกลาง ส่งออกไปรอบด้านคล้ายกับเร้าเตอร์ของเหลว\nเหมาะในการใช้กับเครื่องโหลดและถ่ายสิ่งบรรทุกสำหรับการขนส่งของเหลวทางไกล
|
||||||
|
block.liquid-tank.description = เก็บของเหลวจำนวนมาก ส่งออกไปรอบด้านคล้ายกับเร้าเตอร์ของเหลว\nเหมาะในการใช้เพื่อสร้างกันชนในเวลาที่ของเหลวไม่คงที่\nหรือเวลาที่ใช้ของเหลวเป็นจำนวนมาก
|
||||||
block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับท่อน้ำสองท่อตัดกันที่มีของเหลวสองชนิดแล้วจะไปคนละที่
|
block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับท่อน้ำสองท่อตัดกันที่มีของเหลวสองชนิดแล้วจะไปคนละที่
|
||||||
block.bridge-conduit.description = เคลื่อนย้ายของเหลวข้ามสิ่งก่อสร้างหรือกำแพง
|
block.bridge-conduit.description = เคลื่อนย้ายของเหลวข้ามสิ่งก่อสร้างหรือกำแพง
|
||||||
block.phase-conduit.description = เคลื่อนย้ายของเหลวข้ามสิ่งก่อสร้างหรือกำแพงด้วยความเร็วแสง\nมีระยะที่ไกลกว่าสะพานของเหลว แต่ต้องใช้พลังงาน
|
block.phase-conduit.description = เคลื่อนย้ายของเหลวข้ามสิ่งก่อสร้างหรือกำแพงด้วยความเร็วแสง\nมีระยะที่ไกลกว่าสะพานของเหลว แต่ต้องใช้พลังงาน
|
||||||
block.power-node.description = ส่งพลังงานไปยังตัวจ่ายพลังงานที่เชื่อมต่อ ตัวจ่ายจะรับพลังงานจากตัวจ่ายอื่น\nหรือแหล่งพลังงานแล้วส่งไปยังบล็อกที่ติดกัน
|
block.power-node.description = ส่งพลังงานไปยังตัวจ่ายพลังงานที่เชื่อมต่อ ตัวจ่ายจะรับพลังงานจากตัวจ่ายอื่น\nหรือแหล่งพลังงานแล้วส่งไปยังบล็อกที่ติดกัน
|
||||||
block.power-node-large.description = ตัวจ่ายพลังงานขั้นสูง มีระยะเชื่อมต่อกว้างขึ้น เชื่อมต่อได้มากขึ้น
|
block.power-node-large.description = ตัวจ่ายพลังงานขั้นสูง มีระยะเชื่อมต่อกว้างขึ้น เชื่อมต่อได้มากขึ้น
|
||||||
block.surge-tower.description = ตัวจ่ายพลังงานที่มีระยะเชื่อมต่อไกลมากแต่เชื่อมต่อได้น้อย\nไว้ใช้สำหรับส่งพลังงานไปที่ไกลๆ
|
block.surge-tower.description = ตัวจ่ายพลังงานที่มีระยะเชื่อมต่อไกลมากแต่เชื่อมต่อได้น้อย\nเหมาะในการใช้เพื่อส่งพลังงานไปที่ไกลๆ
|
||||||
block.diode.description = พลังงานแบตเตอรี่สามารถไหลผ่านบล็อกนี้ได้เพียงทางเดียว แต่เฉพาะเวลาที่อีกด้านมีพลังงานน้อยกว่าเท่านั้น
|
block.diode.description = พลังงานแบตเตอรี่สามารถไหลผ่านบล็อกนี้ได้เพียงทางเดียว แต่เฉพาะเวลาที่อีกด้านมีพลังงานน้อยกว่าเท่านั้น
|
||||||
block.battery.description = เก็บพลังงานเป็นกันชนเวลาที่มีพลังงานเกิน และส่งออกพลังงานเมื่อพลังงานไม่พอ
|
block.battery.description = เก็บพลังงานเป็นกันชนเวลาที่มีพลังงานเกิน และส่งออกพลังงานเมื่อพลังงานไม่พอ
|
||||||
block.battery-large.description = เก็บพลังงานเป็นกันชนเวลาที่มีพลังงานเกิน และส่งออกพลังงานเมื่อพลังงานไม่พอ\nเก็บพลังงานได้เยอะกว่าแบตเตอรี่ธรรมดา
|
block.battery-large.description = เก็บพลังงานเป็นกันชนเวลาที่มีพลังงานเกิน และส่งออกพลังงานเมื่อพลังงานไม่พอ\nเก็บพลังงานได้เยอะกว่าแบตเตอรี่ธรรมดา
|
||||||
@@ -1781,6 +1789,7 @@ lenum.itemdrop = ปล่อยไอเท็ม
|
|||||||
lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง
|
lenum.itemtake = หยิบไอเท็มจากสิ่งก่อสร้าง
|
||||||
lenum.paydrop = ปล่อยสิ่งที่บรรทุกอยู่
|
lenum.paydrop = ปล่อยสิ่งที่บรรทุกอยู่
|
||||||
lenum.paytake = หยิบสิ่งบรรทุก ณ จุดที่อยู่
|
lenum.paytake = หยิบสิ่งบรรทุก ณ จุดที่อยู่
|
||||||
|
lenum.payenter = เข้าไป/ลงจอดบนบล็อกบรรทุก ณ จุดที่ยูนิตอยู่
|
||||||
lenum.flag = ปักธงยูนิตเป็นหมายเลข
|
lenum.flag = ปักธงยูนิตเป็นหมายเลข
|
||||||
lenum.mine = ขุดที่ตำแหน่งเป้าหมาย
|
lenum.mine = ขุดที่ตำแหน่งเป้าหมาย
|
||||||
lenum.build = สร้างสิ่งก่อสร้าง
|
lenum.build = สร้างสิ่งก่อสร้าง
|
||||||
|
|||||||
@@ -168,8 +168,9 @@ planetmap = Gezegen Haritası
|
|||||||
launchcore = Kalkış
|
launchcore = Kalkış
|
||||||
filename = Dosya Adı:
|
filename = Dosya Adı:
|
||||||
unlocked = Yeni içerik açıldı!
|
unlocked = Yeni içerik açıldı!
|
||||||
completed = [accent]Tamamlandı
|
|
||||||
available = Yeni Araştırma Mümkün!
|
available = Yeni Araştırma Mümkün!
|
||||||
|
unlock.incampaign = < Detaylar için Mücadelede Araştır >
|
||||||
|
completed = [accent]Tamamlandı
|
||||||
techtree = Teknoloji Ağacı
|
techtree = Teknoloji Ağacı
|
||||||
research.legacy = [accent]5.0[] Araştırma Datası Bulnudu.\n[accent]Bu datayı Yüklemek ister misin?[], yoksa [accent]silip[] baştan mı başlamak istersin? (önerilir)?
|
research.legacy = [accent]5.0[] Araştırma Datası Bulnudu.\n[accent]Bu datayı Yüklemek ister misin?[], yoksa [accent]silip[] baştan mı başlamak istersin? (önerilir)?
|
||||||
research.load = Yükle
|
research.load = Yükle
|
||||||
@@ -362,6 +363,7 @@ publish.confirm = Bunu yayınlamak istediğinize emin misiniz?\n[lightgray]önce
|
|||||||
publish.error = Nesneyi yayınlarken hata oluştu: {0}
|
publish.error = Nesneyi yayınlarken hata oluştu: {0}
|
||||||
steam.error = Steam hatası.\nHata kodu: {0}
|
steam.error = Steam hatası.\nHata kodu: {0}
|
||||||
|
|
||||||
|
editor.cliffs = Duvardan Kayalığa
|
||||||
editor.brush = Fırça
|
editor.brush = Fırça
|
||||||
editor.openin = Düzenleyici'de Aç
|
editor.openin = Düzenleyici'de Aç
|
||||||
editor.oregen = Maden Oluşumu
|
editor.oregen = Maden Oluşumu
|
||||||
@@ -377,6 +379,9 @@ editor.ingame = Oyun içinde düzenle
|
|||||||
editor.publish.workshop = Atölyede Yayınla
|
editor.publish.workshop = Atölyede Yayınla
|
||||||
editor.newmap = Yeni Harita
|
editor.newmap = Yeni Harita
|
||||||
editor.center = Ortala
|
editor.center = Ortala
|
||||||
|
editor.search = Harita Ara...
|
||||||
|
editor.filters = Harita Filtrele
|
||||||
|
editor.showAll = Varsayılan Haritaları Göster
|
||||||
workshop = Atölye
|
workshop = Atölye
|
||||||
waves.title = Dalgalar
|
waves.title = Dalgalar
|
||||||
waves.remove = Kaldır
|
waves.remove = Kaldır
|
||||||
@@ -385,6 +390,7 @@ waves.waves = dalga(lar)
|
|||||||
waves.perspawn = doğma noktası başına
|
waves.perspawn = doğma noktası başına
|
||||||
waves.shields = kalkan/dalga
|
waves.shields = kalkan/dalga
|
||||||
waves.to = doğru
|
waves.to = doğru
|
||||||
|
waves.max = maks birim
|
||||||
waves.guardian = Gardiyan
|
waves.guardian = Gardiyan
|
||||||
waves.preview = Önizleme
|
waves.preview = Önizleme
|
||||||
waves.edit = Düzenle...
|
waves.edit = Düzenle...
|
||||||
@@ -409,6 +415,7 @@ wavemode.health = can
|
|||||||
editor.default = [lightgray]<Varsayılan>
|
editor.default = [lightgray]<Varsayılan>
|
||||||
details = Detaylar...
|
details = Detaylar...
|
||||||
edit = Düzenle...
|
edit = Düzenle...
|
||||||
|
variables = Değişkenler
|
||||||
editor.name = İsim:
|
editor.name = İsim:
|
||||||
editor.spawn = Eleman Oluştur
|
editor.spawn = Eleman Oluştur
|
||||||
editor.removeunit = Eleman Kaldır
|
editor.removeunit = Eleman Kaldır
|
||||||
@@ -657,10 +664,12 @@ status.sapped.name = Emilmiş
|
|||||||
status.electrified.name = Elektriklenmiş
|
status.electrified.name = Elektriklenmiş
|
||||||
status.spore-slowed.name = Sporlanmış
|
status.spore-slowed.name = Sporlanmış
|
||||||
status.tarred.name = Ziftlenmiş
|
status.tarred.name = Ziftlenmiş
|
||||||
|
status.overdrive.name = Yüksek Hızlı
|
||||||
status.overclock.name = Hızlandırlımış
|
status.overclock.name = Hızlandırlımış
|
||||||
status.shocked.name = Çarpılmış
|
status.shocked.name = Çarpılmış
|
||||||
status.blasted.name = Patlatılmış
|
status.blasted.name = Patlatılmış
|
||||||
status.unmoving.name =Sabit
|
status.unmoving.name =Sabit
|
||||||
|
status.boss.name = Gardiyan
|
||||||
|
|
||||||
settings.language = Dil
|
settings.language = Dil
|
||||||
settings.data = Oyun Verisi
|
settings.data = Oyun Verisi
|
||||||
@@ -1124,6 +1133,7 @@ block.cliff.name = Uçurum
|
|||||||
block.sand-boulder.name = Kumlu Kaya Parçaları
|
block.sand-boulder.name = Kumlu Kaya Parçaları
|
||||||
block.basalt-boulder.name = Bazalt Kaya
|
block.basalt-boulder.name = Bazalt Kaya
|
||||||
block.grass.name = Çimen
|
block.grass.name = Çimen
|
||||||
|
block.pooled-cryofluid.name = Cryosıvı
|
||||||
block.molten-slag.name = Cüruf
|
block.molten-slag.name = Cüruf
|
||||||
block.space.name = Uzay
|
block.space.name = Uzay
|
||||||
block.salt.name = Tuz
|
block.salt.name = Tuz
|
||||||
@@ -1284,6 +1294,7 @@ block.pulse-conduit.name = Dalga Borusu
|
|||||||
block.plated-conduit.name = Yalıtımlı Boru
|
block.plated-conduit.name = Yalıtımlı Boru
|
||||||
block.phase-conduit.name = Faz Borusu
|
block.phase-conduit.name = Faz Borusu
|
||||||
block.liquid-router.name = Sıvı Yönlendiricisi
|
block.liquid-router.name = Sıvı Yönlendiricisi
|
||||||
|
block.liquid-container.name = Sıvı Konteyneri
|
||||||
block.liquid-tank.name = Sıvı Tankı
|
block.liquid-tank.name = Sıvı Tankı
|
||||||
block.liquid-junction.name = Sıvı Kavşağı
|
block.liquid-junction.name = Sıvı Kavşağı
|
||||||
block.bridge-conduit.name = Köprülü Boru
|
block.bridge-conduit.name = Köprülü Boru
|
||||||
@@ -1331,9 +1342,16 @@ block.disassembler.name = Sökücü
|
|||||||
block.silicon-crucible.name = Büyük Silikon Fırını
|
block.silicon-crucible.name = Büyük Silikon Fırını
|
||||||
block.overdrive-dome.name = Hızlandırma Kubbesi
|
block.overdrive-dome.name = Hızlandırma Kubbesi
|
||||||
#Düzgün tutun bu TR translatei uğraştırıyonuz beni. -RTOmega
|
#Düzgün tutun bu TR translatei uğraştırıyonuz beni. -RTOmega
|
||||||
block.block-forge.name = Blok Fabrikası
|
block.constructor.name = İnşaatçı
|
||||||
block.block-loader.name = Blok Yükleyici
|
block.constructor.description = 2x2 ve daha küçük blokları inşaa edebilir.
|
||||||
block.block-unloader.name = Blok Boşaltıcı
|
block.large-constructor.name = Büyük İnşaatçı
|
||||||
|
block.large-constructor.description = 4x4 ve daha küçük blokları inşaa edebilir.
|
||||||
|
block.deconstructor.name = Yıkıcı
|
||||||
|
block.deconstructor.description = Blok ve Birimleri yokeder, 100% iade sağlar.
|
||||||
|
block.payload-loader.name = Kargo Yükleyici
|
||||||
|
block.payload-loader.description = Sıvı ve malzemeleri bloklara yükler.
|
||||||
|
block.payload-unloader.name = Kargo Boşaltıcı
|
||||||
|
block.payload-unloader.description = Sıvı ve Malzemeleri bloklardan boşaltır.
|
||||||
block.interplanetary-accelerator.name = Gezegenler Arası Hızlandırıcı
|
block.interplanetary-accelerator.name = Gezegenler Arası Hızlandırıcı
|
||||||
#ama tüp ne aga -Anti Dragon
|
#ama tüp ne aga -Anti Dragon
|
||||||
block.switch.name = Düğme
|
block.switch.name = Düğme
|
||||||
@@ -1489,6 +1507,7 @@ block.thermal-pump.description = En iyi pompa. Çalışması için enerji gereki
|
|||||||
block.conduit.description = Temel sıvı taşıma bloğu. Sıvıları ileri taşır. Pompalar ve diğer borularla birlikte kullanılır.
|
block.conduit.description = Temel sıvı taşıma bloğu. Sıvıları ileri taşır. Pompalar ve diğer borularla birlikte kullanılır.
|
||||||
block.pulse-conduit.description = Gelişmiş bir sıvı taşıma bloğu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır.
|
block.pulse-conduit.description = Gelişmiş bir sıvı taşıma bloğu. Sıvıları normal borulardan daha hızlı taşır ve onlardan daha fazla sıvı alır.
|
||||||
block.plated-conduit.description = Sıvıları dalga borusuyla aynı güçte taşır ancak daha fazla zırha sahiptir. Borular dışında başka bir şekilde yandan sıvı kabul etmez.\nDaha az sızıntı yapar.
|
block.plated-conduit.description = Sıvıları dalga borusuyla aynı güçte taşır ancak daha fazla zırha sahiptir. Borular dışında başka bir şekilde yandan sıvı kabul etmez.\nDaha az sızıntı yapar.
|
||||||
|
block.liquid-container.description = Az bir miktarda sıvı depolar, her yöne dağıtır.
|
||||||
block.liquid-router.description = Sıvıları bir yönden alıp diğer üç yöne eşit olarak dağıtır. Ayrıca kendisi de bir miktar sıvı depolayabilir. Sıvıları bir kaynaktan birden fazla hedefe iletmek için kullanılır.
|
block.liquid-router.description = Sıvıları bir yönden alıp diğer üç yöne eşit olarak dağıtır. Ayrıca kendisi de bir miktar sıvı depolayabilir. Sıvıları bir kaynaktan birden fazla hedefe iletmek için kullanılır.
|
||||||
block.liquid-tank.description = Çok miktarda sıvıyı depolar. İhtiyaçları devamlı olmayan sıvıları yedek olarak saklamakta ya da önemli blokların devamlı olarak soğutulmasında kullanılabilir.
|
block.liquid-tank.description = Çok miktarda sıvıyı depolar. İhtiyaçları devamlı olmayan sıvıları yedek olarak saklamakta ya da önemli blokların devamlı olarak soğutulmasında kullanılabilir.
|
||||||
block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır.
|
block.liquid-junction.description = Çakışan iki boru hattı arasında bir köprü görevi görür. İki farklı borunun farklı hedeflere farklı sıvıları taşıdığı durumlarda kullanışlıdır.
|
||||||
@@ -1594,7 +1613,7 @@ unit.eclipse.description = Büyük mermiler fırlatır ve lazer atar.
|
|||||||
unit.mono.description = Otomatik bir şekilde Bakır ve Kurşun kazar ve çekirdeğe getirir.
|
unit.mono.description = Otomatik bir şekilde Bakır ve Kurşun kazar ve çekirdeğe getirir.
|
||||||
unit.poly.description = Otomatik bir şekilde kırılmış binaları geri inşa eder ve oyuncuya inşaatta yardımcı olur.
|
unit.poly.description = Otomatik bir şekilde kırılmış binaları geri inşa eder ve oyuncuya inşaatta yardımcı olur.
|
||||||
unit.mega.description = Otomayik bir şekilde hasarlı bolkları onarır. Blokları ve Birimleri taşıyabilir.
|
unit.mega.description = Otomayik bir şekilde hasarlı bolkları onarır. Blokları ve Birimleri taşıyabilir.
|
||||||
unit.quad.description = Büyük bombalar atar, hasarlı bolkları onarır ve düşmanlara zarar verir. Bolkları ve Birimleri taşıyabilir.
|
unit.quad.description = Büyük bombalar atar, hasarlı blokları onarır ve düşmanlara zarar verir. Bolkları ve Birimleri taşıyabilir.
|
||||||
unit.oct.description = Yakındaki birimleri korur ve tamir eder. Blokları ve Birimleri taşıyabilir.
|
unit.oct.description = Yakındaki birimleri korur ve tamir eder. Blokları ve Birimleri taşıyabilir.
|
||||||
unit.risso.description = Yakındaki düşmanlara Füze atar.
|
unit.risso.description = Yakındaki düşmanlara Füze atar.
|
||||||
unit.minke.description = Yakındaki düşmanlara basit mermi ve toplarla saldırır.
|
unit.minke.description = Yakındaki düşmanlara basit mermi ve toplarla saldırır.
|
||||||
@@ -1755,6 +1774,7 @@ lenum.itemdrop = Bir itemi bırak.
|
|||||||
lenum.itemtake = Bir binadan item al.
|
lenum.itemtake = Bir binadan item al.
|
||||||
lenum.paydrop = Kargoyu bırak.
|
lenum.paydrop = Kargoyu bırak.
|
||||||
lenum.paytake = Kargo al.
|
lenum.paytake = Kargo al.
|
||||||
|
lenum.payenter = Bir birimi, kargo tutabilen bir bloğa indir.
|
||||||
lenum.flag = Numara ile işaretle.
|
lenum.flag = Numara ile işaretle.
|
||||||
lenum.mine = Kaz.
|
lenum.mine = Kaz.
|
||||||
lenum.build = Bina inşa et.
|
lenum.build = Bina inşa et.
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ mods.browser.sortstars = Сортувати за популярністю
|
|||||||
|
|
||||||
stats = Статистика
|
stats = Статистика
|
||||||
stat.wave = Хвиль відбито:[accent] {0}
|
stat.wave = Хвиль відбито:[accent] {0}
|
||||||
|
stat.unitsCreated = Одиниць створено:[accent] {0}
|
||||||
stat.enemiesDestroyed = Противників знищено:[accent] {0}
|
stat.enemiesDestroyed = Противників знищено:[accent] {0}
|
||||||
stat.built = Будівель збудовано:[accent] {0}
|
stat.built = Будівель збудовано:[accent] {0}
|
||||||
stat.destroyed = Будівель знищено:[accent] {0}
|
stat.destroyed = Будівель знищено:[accent] {0}
|
||||||
@@ -83,7 +84,7 @@ stat.deconstructed = Будівель деконструйовано:[accent] {0
|
|||||||
stat.delivered = Ресурсів запущено:
|
stat.delivered = Ресурсів запущено:
|
||||||
stat.playtime = Час у грі:[accent] {0}
|
stat.playtime = Час у грі:[accent] {0}
|
||||||
stat.rank = Фінальний рахунок:[accent] {0}
|
stat.rank = Фінальний рахунок:[accent] {0}
|
||||||
globalitems = [accent]Усього предметів
|
globalitems = [accent]Усього ресурсів
|
||||||
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»?
|
||||||
level.highscore = Рекорд: [accent]{0}
|
level.highscore = Рекорд: [accent]{0}
|
||||||
level.select = Вибір мапи
|
level.select = Вибір мапи
|
||||||
@@ -91,6 +92,7 @@ level.mode = Режим гри:
|
|||||||
coreattack = < Ядро перебуває під атакою! >
|
coreattack = < Ядро перебуває під атакою! >
|
||||||
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча
|
nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча
|
||||||
database = База даних ядра
|
database = База даних ядра
|
||||||
|
database.button = База даних
|
||||||
savegame = Зберегти гру
|
savegame = Зберегти гру
|
||||||
loadgame = Завантажити гру
|
loadgame = Завантажити гру
|
||||||
joingame = Мережева гра
|
joingame = Мережева гра
|
||||||
@@ -118,7 +120,7 @@ uploadingpreviewfile = Вивантаження файлу попередньо
|
|||||||
committingchanges = Здійснення змін
|
committingchanges = Здійснення змін
|
||||||
done = Зроблено
|
done = Зроблено
|
||||||
feature.unsupported = Ваш пристрій не підтримує цю функцію
|
feature.unsupported = Ваш пристрій не підтримує цю функцію
|
||||||
mods.initfailed = [red]⚠[] Попереднього разу не вдалося ініціалізувати Mindustry. Це, ймовірно, було спричинено неправильними поведінкою модифікацій.\n\nДля запобігання нескінченним аварійним циклам [red]треба вимкнути всі модифікації.[]\n\nДля вимкнення цієї функції перейдіть до [accent]Налаштування→Гра→Вимикати модифікації після аварійного запуску[].
|
mods.initfailed = [red]⚠[] Попереднього разу не вдалося ініціалізувати Mindustry. Це, ймовірно, було спричинено неправильними поведінкою модифікацій.\n\nДля запобігання нескінченним аварійним циклам [red]необхідно вимкнути всі модифікації.[]\n\nДля вимкнення цієї функції перейдіть до [accent]Налаштування→Гра→Вимикати модифікації після аварійного запуску[].
|
||||||
mods = Модифікації
|
mods = Модифікації
|
||||||
mods.none = [lightgray]Модифікацій не знайдено!
|
mods.none = [lightgray]Модифікацій не знайдено!
|
||||||
mods.guide = Посібник із модифікацій
|
mods.guide = Посібник із модифікацій
|
||||||
@@ -164,6 +166,7 @@ launchcore = Запустити ядро
|
|||||||
filename = Назва файлу:
|
filename = Назва файлу:
|
||||||
unlocked = Доступний новий вміст!
|
unlocked = Доступний новий вміст!
|
||||||
available = Нове дослідження доступно!
|
available = Нове дослідження доступно!
|
||||||
|
unlock.incampaign = < Розблокуйте в кампанії для отримання подробиць >
|
||||||
completed = [accent]Завершено
|
completed = [accent]Завершено
|
||||||
techtree = Дерево технологій
|
techtree = Дерево технологій
|
||||||
research.legacy = Були знайдені дослідження з [accent]5.0[].\nЧи бажаєте ви [accent]завантажити ці дані[] або [accent]ви хочете відмовитися від цього[] і почати досліджувати із самого початку в новій кампанії (рекомендовано)?
|
research.legacy = Були знайдені дослідження з [accent]5.0[].\nЧи бажаєте ви [accent]завантажити ці дані[] або [accent]ви хочете відмовитися від цього[] і почати досліджувати із самого початку в новій кампанії (рекомендовано)?
|
||||||
@@ -354,6 +357,7 @@ publishing = [accent]Публікація…
|
|||||||
publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
|
publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться!
|
||||||
publish.error = Виникла помилка під час публікації предмета: {0}
|
publish.error = Виникла помилка під час публікації предмета: {0}
|
||||||
steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
|
steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0}
|
||||||
|
editor.cliffs = Стіни в скелі
|
||||||
editor.brush = Пензлик
|
editor.brush = Пензлик
|
||||||
editor.openin = Відкрити в редакторі
|
editor.openin = Відкрити в редакторі
|
||||||
editor.oregen = Генерація руд
|
editor.oregen = Генерація руд
|
||||||
@@ -369,6 +373,9 @@ editor.ingame = Редагувати в грі
|
|||||||
editor.publish.workshop = Опублікувати в Майстерні Steam
|
editor.publish.workshop = Опублікувати в Майстерні Steam
|
||||||
editor.newmap = Нова мапа
|
editor.newmap = Нова мапа
|
||||||
editor.center = Центрувати
|
editor.center = Центрувати
|
||||||
|
editor.search = Шукати мапи…
|
||||||
|
editor.filters = Фільтрувати мапи
|
||||||
|
editor.showAll = Показати вбудовані мапи
|
||||||
workshop = Майстерня
|
workshop = Майстерня
|
||||||
waves.title = Хвилі
|
waves.title = Хвилі
|
||||||
waves.remove = Видалити
|
waves.remove = Видалити
|
||||||
@@ -385,12 +392,20 @@ waves.load = Завантажити з буфера обміну
|
|||||||
waves.invalid = Недійсні хвилі в буфері обміну.
|
waves.invalid = Недійсні хвилі в буфері обміну.
|
||||||
waves.copied = Хвилі скопійовані.
|
waves.copied = Хвилі скопійовані.
|
||||||
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею.
|
||||||
|
waves.sort = Сортування за
|
||||||
|
waves.sort.reverse = Зворотне сортування
|
||||||
|
waves.sort.begin = Хвилями
|
||||||
|
waves.sort.health = Здоров’ям
|
||||||
|
waves.sort.type = Типом
|
||||||
|
waves.units.hide = Сховати все
|
||||||
|
waves.units.show = Показати все
|
||||||
wavemode.counts = кількість
|
wavemode.counts = кількість
|
||||||
wavemode.totals = усього
|
wavemode.totals = усього
|
||||||
wavemode.health = здоров’я
|
wavemode.health = здоров’я
|
||||||
editor.default = [lightgray]<За замовчуванням>
|
editor.default = [lightgray]<За замовчуванням>
|
||||||
details = Подробиці…
|
details = Подробиці…
|
||||||
edit = Редагувати…
|
edit = Редагувати…
|
||||||
|
variables = Змінні
|
||||||
editor.name = Ім’я:
|
editor.name = Ім’я:
|
||||||
editor.spawn = Створити бойову одиницю
|
editor.spawn = Створити бойову одиницю
|
||||||
editor.removeunit = Видалити бойову одиницю
|
editor.removeunit = Видалити бойову одиницю
|
||||||
@@ -595,6 +610,8 @@ sector.biomassFacility.name = Центр дослідження синтезу
|
|||||||
sector.windsweptIslands.name = Вітряні острови
|
sector.windsweptIslands.name = Вітряні острови
|
||||||
sector.extractionOutpost.name = Видобувна застава
|
sector.extractionOutpost.name = Видобувна застава
|
||||||
sector.planetaryTerminal.name = Термінал планетарного запуску
|
sector.planetaryTerminal.name = Термінал планетарного запуску
|
||||||
|
sector.coastline.name = Узбережжя
|
||||||
|
sector.navalFortress.name = Морська фортеця
|
||||||
sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗберіть якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі.
|
sector.groundZero.description = Оптимальне місце для повторних ігор. Низька ворожа загроза. Мало ресурсів.\nЗберіть якомога більше свинцю та міді.\nНе затримуйтесь і йдіть далі.
|
||||||
sector.frozenForest.description = Навіть тут, ближче до гір, уже поширилися спори. Холодна температура не змогла стримати їх назавжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами.
|
sector.frozenForest.description = Навіть тут, ближче до гір, уже поширилися спори. Холодна температура не змогла стримати їх назавжди.\n\nЗважтесь створити енергію. Побудуйте генератори внутрішнього згорання. Навчіться користуватися регенераторами.
|
||||||
sector.saltFlats.description = На околицях пустелі лежать Соляні рівнини. У цьому місці небагато ресурсів.\n\nСаме тут противники спорудили комплекс зі зберігання ресурсів. Викорініть їхнє ядро. Не лишайте нічого цінного.
|
sector.saltFlats.description = На околицях пустелі лежать Соляні рівнини. У цьому місці небагато ресурсів.\n\nСаме тут противники спорудили комплекс зі зберігання ресурсів. Викорініть їхнє ядро. Не лишайте нічого цінного.
|
||||||
@@ -621,6 +638,7 @@ status.sapped.name = Виснажений
|
|||||||
status.electrified.name = Наелектризований
|
status.electrified.name = Наелектризований
|
||||||
status.spore-slowed.name = Сповільнений спорами
|
status.spore-slowed.name = Сповільнений спорами
|
||||||
status.tarred.name = Покритий нафтою
|
status.tarred.name = Покритий нафтою
|
||||||
|
status.overdrive.name = Перевантажений
|
||||||
status.overclock.name = Прискорений
|
status.overclock.name = Прискорений
|
||||||
status.shocked.name = Шокований
|
status.shocked.name = Шокований
|
||||||
status.blasted.name = Підірваний
|
status.blasted.name = Підірваний
|
||||||
@@ -1076,6 +1094,7 @@ block.sand-boulder.name = Пісочний валун
|
|||||||
block.basalt-boulder.name = Базальтовий валун
|
block.basalt-boulder.name = Базальтовий валун
|
||||||
block.grass.name = Трава
|
block.grass.name = Трава
|
||||||
block.molten-slag.name = Шлак
|
block.molten-slag.name = Шлак
|
||||||
|
block.pooled-cryofluid.name = Кріогенна рідина
|
||||||
block.space.name = Космос
|
block.space.name = Космос
|
||||||
block.salt.name = Сіль
|
block.salt.name = Сіль
|
||||||
block.salt-wall.name = Соляна стіна
|
block.salt-wall.name = Соляна стіна
|
||||||
@@ -1109,6 +1128,7 @@ block.core-nucleus.name = Ядро «Атом»
|
|||||||
block.deep-water.name = Глибоководдя
|
block.deep-water.name = Глибоководдя
|
||||||
block.shallow-water.name = Вода
|
block.shallow-water.name = Вода
|
||||||
block.tainted-water.name = Забруднена вода
|
block.tainted-water.name = Забруднена вода
|
||||||
|
block.deep-tainted-water.name = Забруднене глибоководдя
|
||||||
block.darksand-tainted-water.name = Темний пісок із забрудненою водою
|
block.darksand-tainted-water.name = Темний пісок із забрудненою водою
|
||||||
block.tar.name = Дьоготь
|
block.tar.name = Дьоготь
|
||||||
block.stone.name = Камінь
|
block.stone.name = Камінь
|
||||||
@@ -1230,12 +1250,13 @@ block.solar-panel.name = Сонячна панель
|
|||||||
block.solar-panel-large.name = Велика сонячна панель
|
block.solar-panel-large.name = Велика сонячна панель
|
||||||
block.oil-extractor.name = Екстрактор нафти
|
block.oil-extractor.name = Екстрактор нафти
|
||||||
block.repair-point.name = Ремонтний пункт
|
block.repair-point.name = Ремонтний пункт
|
||||||
block.repair-point.name = Ремонтна башта
|
block.repair-turret.name = Ремонтна башта
|
||||||
block.pulse-conduit.name = Імпульсний трубопровід
|
block.pulse-conduit.name = Імпульсний трубопровід
|
||||||
block.plated-conduit.name = Зміцнений трубопровід
|
block.plated-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-container.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 = Роторний насос
|
||||||
@@ -1282,9 +1303,17 @@ block.disassembler.name = Розбирач
|
|||||||
block.silicon-crucible.name = Кремнієвий тигель
|
block.silicon-crucible.name = Кремнієвий тигель
|
||||||
block.overdrive-dome.name = Великий прискорювач
|
block.overdrive-dome.name = Великий прискорювач
|
||||||
block.interplanetary-accelerator.name = Міжпланетний прискорювач
|
block.interplanetary-accelerator.name = Міжпланетний прискорювач
|
||||||
block.block-forge.name = Блок-кузня
|
block.constructor.name = Конструктор
|
||||||
block.block-loader.name = Блок-завантажувач
|
block.constructor.description = Збирає споруди. Доступні розміри для збирання: 1x1, 2x2.
|
||||||
block.block-unloader.name = Блок-вивантажувач
|
block.large-constructor.name = Великий конструктор
|
||||||
|
block.large-constructor.description = Збирає споруди. Доступні розміри для збирання: 1x1, 2x2, 3x3 та 4x4.
|
||||||
|
block.deconstructor.name = Деконструктор
|
||||||
|
block.deconstructor.description = Деконструює споруди та одиниці. Повертає 100% вартості збірки.
|
||||||
|
block.payload-loader.name = Вантажний завантажувач
|
||||||
|
block.payload-loader.description = Завантажує рідини та предмети в блоки.
|
||||||
|
block.payload-unloader.name = Вантажний розвантажувач
|
||||||
|
block.payload-unloader.description = Розвантажує рідини та предмети в блоки.
|
||||||
|
|
||||||
block.switch.name = Перемикач
|
block.switch.name = Перемикач
|
||||||
block.micro-processor.name = Мікропроцесор
|
block.micro-processor.name = Мікропроцесор
|
||||||
block.logic-processor.name = Логічний процесор
|
block.logic-processor.name = Логічний процесор
|
||||||
@@ -1316,7 +1345,7 @@ hint.placeConveyor.mobile = Конвеєри переміщують предме
|
|||||||
hint.placeTurret = Розмістіть [accent]башти[], щоби захистити базу від ворогів.\n\nБашти потребують боєприпасів. У цьому випадку \uf838мідь.\nДля її подачі використовуйте конвеєри та бури.
|
hint.placeTurret = Розмістіть [accent]башти[], щоби захистити базу від ворогів.\n\nБашти потребують боєприпасів. У цьому випадку \uf838мідь.\nДля її подачі використовуйте конвеєри та бури.
|
||||||
hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби зруйнувати блоки.
|
hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби зруйнувати блоки.
|
||||||
hint.breaking.mobile = Активуйте [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене.
|
hint.breaking.mobile = Активуйте [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене.
|
||||||
hint.blockInfo = Подивіться інформацію про блок. Перейдіть до [accent]меню будівництва[] і натисніть на кнопку [accent][[?][] правпоруч
|
hint.blockInfo = Подивіться інформацію про блок. Перейдіть до [accent]меню будівництва[] і натисніть на кнопку [accent][[?][] праворуч.
|
||||||
hint.research = Використовуйте кнопку [accent]Дослідження[] для дослідження нової технології.
|
hint.research = Використовуйте кнопку [accent]Дослідження[] для дослідження нової технології.
|
||||||
hint.derelict = Будівлі [accent]Переможених[] є зламаними залишками старих баз, які більше не функціонують.\n\nЇх можна [accent]деконструювати[] для отримання ресурсів.
|
hint.derelict = Будівлі [accent]Переможених[] є зламаними залишками старих баз, які більше не функціонують.\n\nЇх можна [accent]деконструювати[] для отримання ресурсів.
|
||||||
hint.research.mobile = Використовуйте [accent]Дослідження[] в [accent]меню[] для дослідження нової технології.
|
hint.research.mobile = Використовуйте [accent]Дослідження[] в [accent]меню[] для дослідження нової технології.
|
||||||
@@ -1339,12 +1368,13 @@ hint.generator = [accent]Генератори внутрішнього зг
|
|||||||
hint.guardian = [accent]Вартові[] одиниці броньовані. Слабкі боєприпаси, як-от [accent]мідь[] чи [accent]свинець[], [scarlet]не є ефективними[].\n\nВикористовуйте башти вищого рангу чи [accent]графітові боєприпаси[] для Подвійної башти чиЗалпу, щоб убити Вартових.
|
hint.guardian = [accent]Вартові[] одиниці броньовані. Слабкі боєприпаси, як-от [accent]мідь[] чи [accent]свинець[], [scarlet]не є ефективними[].\n\nВикористовуйте башти вищого рангу чи [accent]графітові боєприпаси[] для Подвійної башти чиЗалпу, щоб убити Вартових.
|
||||||
hint.coreUpgrade = Ядро можна покращити, якщо [accent]розмістити поверх нього ядро вищого рівня[].\n\nРозмістіть ядро [accent]«Штаб»[] поверх ядра [accent]«Уламок»[]. Переконайтесь, що поблизу ядер немає перешкод (зайвих блоків).
|
hint.coreUpgrade = Ядро можна покращити, якщо [accent]розмістити поверх нього ядро вищого рівня[].\n\nРозмістіть ядро [accent]«Штаб»[] поверх ядра [accent]«Уламок»[]. Переконайтесь, що поблизу ядер немає перешкод (зайвих блоків).
|
||||||
hint.presetLaunch = Сірі [accent]сектори зони посадки[], як-от [accent]Крижаний ліс[], можна запустити з будь-якого місця. Вони не вимагають захоплення сусідньої території.\n\n[accent]Нумеровані сектори[], як цей, [accent]необовʼязкові[].
|
hint.presetLaunch = Сірі [accent]сектори зони посадки[], як-от [accent]Крижаний ліс[], можна запустити з будь-якого місця. Вони не вимагають захоплення сусідньої території.\n\n[accent]Нумеровані сектори[], як цей, [accent]необовʼязкові[].
|
||||||
|
hint.presetDifficulty = Цей сектор має [scarlet]високий рівень ворожої загрози[].\nРобити запуск в такі [accent]не рекомендується[] без належних технологій та підготовки.
|
||||||
hint.coreIncinerate = Після того, як ядро наповниться предметом, будь-які додаткові предмети того ж типу, які воно отримує, будуть [accent]спалені[].
|
hint.coreIncinerate = Після того, як ядро наповниться предметом, будь-які додаткові предмети того ж типу, які воно отримує, будуть [accent]спалені[].
|
||||||
|
|
||||||
item.copper.description = Використовується у всіх типах блоків і боєприпасах.
|
item.copper.description = Використовується у всіх типах блоків і боєприпасах.
|
||||||
item.copper.details = Мідь. Напрочуд багато жил цієї руди на Серпуло. За своєю структурою слабка, якщо не зміцнена.
|
item.copper.details = Мідь. Напрочуд багато жил цієї руди на Серпуло. За своєю структурою слабка, якщо не зміцнена.
|
||||||
item.lead.description = Широко використовується в електроніці та в транспортуванні рідин.
|
item.lead.description = Широко використовується в електроніці та в транспортуванні рідин.
|
||||||
item.lead.details = Сплав. Інертний. Широко використовується в акумуляторах.\nПримітка. Мабуть, токсичний для біологічних форм життя. Не те щоби тут залишилося багато…
|
item.lead.details = Інертний сплав, що широко використовується в акумуляторах.\nПримітка. Мабуть, токсичний для біологічних форм життя. Не те щоби їх тут залишилося багато…
|
||||||
item.metaglass.description = Використовується для розподілу чи зберігання рідини.
|
item.metaglass.description = Використовується для розподілу чи зберігання рідини.
|
||||||
item.graphite.description = Використовується для боєприпасів та електричних компонентів.
|
item.graphite.description = Використовується для боєприпасів та електричних компонентів.
|
||||||
item.sand.description = Використовується для виробництва інших удосконалених матеріалів.
|
item.sand.description = Використовується для виробництва інших удосконалених матеріалів.
|
||||||
@@ -1432,6 +1462,7 @@ block.conduit.description = Пересуває рідини вперед. Зас
|
|||||||
block.pulse-conduit.description = Пересуває рідини вперед. Швидше транспортує і зберігає більше рідини, ніж стандартні трубопроводи.
|
block.pulse-conduit.description = Пересуває рідини вперед. Швидше транспортує і зберігає більше рідини, ніж стандартні трубопроводи.
|
||||||
block.plated-conduit.description = Пересуває рідини вперед. Не приймає рідин із боків окрім інших трубопроводів. Не протікає.
|
block.plated-conduit.description = Пересуває рідини вперед. Не приймає рідин із боків окрім інших трубопроводів. Не протікає.
|
||||||
block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також може зберігати певну кількість рідини.
|
block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також може зберігати певну кількість рідини.
|
||||||
|
block.liquid-container.description = Зберігає чималу кількість рідини. Виводить у всі сторони, подібно до рідинного маршрутизатора.
|
||||||
block.liquid-tank.description = Зберігає велику кількість рідини. Виводить воду на всі сторони, через це схожий на рідинний маршрутизатор.
|
block.liquid-tank.description = Зберігає велику кількість рідини. Виводить воду на всі сторони, через це схожий на рідинний маршрутизатор.
|
||||||
block.liquid-junction.description = Діє як міст для двох трубопроводів.
|
block.liquid-junction.description = Діє як міст для двох трубопроводів.
|
||||||
block.bridge-conduit.description = Транспортує рідину через місцевість і будівлі.
|
block.bridge-conduit.description = Транспортує рідину через місцевість і будівлі.
|
||||||
@@ -1484,7 +1515,7 @@ block.cyclone.description = Підпалює вибухові грудки ск
|
|||||||
block.spectre.description = Вистрілює великі бронебійні кулі в повітряні та наземні цілі.
|
block.spectre.description = Вистрілює великі бронебійні кулі в повітряні та наземні цілі.
|
||||||
block.meltdown.description = Заряджає і вистрілює лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
|
block.meltdown.description = Заряджає і вистрілює лазерним променем у найближчих противників. Для роботи потрібен теплоносій.
|
||||||
block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію.
|
block.foreshadow.description = Вистрілює великим болтом в одну ціль на велику дистанцію.
|
||||||
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії. Пріоритетні вороги з вищим максимальним здоров’ям.
|
block.repair-point.description = Безперервно ремонтує найближчу пошкоджену бойову одиницю у своєму радіусі дії. Пріоритетні союзники з вищим максимальним здоров’ям.
|
||||||
block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних.
|
block.segment.description = Пошкоджує та руйнує вхідні снаряди. Окрім лазерних.
|
||||||
block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх у процесі.
|
block.parallax.description = Притягає ворожі повітряні одиниці, пошкоджуючи їх у процесі.
|
||||||
block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі в разі постачання води.
|
block.tsunami.description = Вистрілює потужними потоками рідини у ворогів. Автоматично гасить пожежі в разі постачання води.
|
||||||
@@ -1545,7 +1576,7 @@ unit.omura.description = Вистрілює у ворогів далекобій
|
|||||||
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
|
unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди.
|
||||||
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
|
unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди.
|
||||||
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
|
unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди.
|
||||||
unit.retusa.description = Розміщує міни. Ремонтує найближчі одиниці.
|
unit.retusa.description = Вистрілює самонаведеними торпедами по ворогах. Ремонтує найближчі одиниці.
|
||||||
unit.oxynoe.description = Вистрілює потоками полум'я, яке ремонтує споруди та наносить шкоду ворогам. Захищає від ворожик снарядів за допомогою башти точкової оборони.
|
unit.oxynoe.description = Вистрілює потоками полум'я, яке ремонтує споруди та наносить шкоду ворогам. Захищає від ворожик снарядів за допомогою башти точкової оборони.
|
||||||
unit.cyerce.description = Вистрілює у ворогів навідними касетними ракетами. Ремонтує найближчі одиниці.
|
unit.cyerce.description = Вистрілює у ворогів навідними касетними ракетами. Ремонтує найближчі одиниці.
|
||||||
unit.aegires.description = Приголомшлює ворожі одиниці та будівлі, що входять до його енергетичного поля. Ремонтує всіх союзників.
|
unit.aegires.description = Приголомшлює ворожі одиниці та будівлі, що входять до його енергетичного поля. Ремонтує всіх союзників.
|
||||||
@@ -1565,8 +1596,8 @@ lst.sensor = Отримати дані з певної будівлі чи од
|
|||||||
lst.set = Установити значення змінної.
|
lst.set = Установити значення змінної.
|
||||||
lst.operation = Виконує операцію над 1-2 змінними.
|
lst.operation = Виконує операцію над 1-2 змінними.
|
||||||
lst.end = Перейти до верхньої частини стеку операцій.
|
lst.end = Перейти до верхньої частини стеку операцій.
|
||||||
lst.wait = Зачекати певну кількість секунд.
|
lst.wait = Чекати певну кількість секунд.
|
||||||
lst.lookup = Знайдіть тип елемента, рідини, одиниці чи блоку за ідентифікатором.\nМожна отримати доступ до загальної кількості кожного типу через \n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
lst.lookup = Знайти тип елемента, рідини, одиниці чи блоку за ідентифікатором.\nМожна отримати доступ до загальної кількості кожного типу через \n[accent]@unitCount[] / [accent]@itemCount[] / [accent]@liquidCount[] / [accent]@blockCount[]
|
||||||
lst.jump = Умовне переходження до іншої операції.
|
lst.jump = Умовне переходження до іншої операції.
|
||||||
lst.unitbind = Прив’язка до одиниці певного типу та його зберігання в [accent]@unit[].
|
lst.unitbind = Прив’язка до одиниці певного типу та його зберігання в [accent]@unit[].
|
||||||
lst.unitcontrol = Контролювати поточну прив’язану одиницю.
|
lst.unitcontrol = Контролювати поточну прив’язану одиницю.
|
||||||
@@ -1694,6 +1725,7 @@ lenum.itemdrop = Викинути предмет.
|
|||||||
lenum.itemtake = Взяти предмет з будівлі.
|
lenum.itemtake = Взяти предмет з будівлі.
|
||||||
lenum.paydrop = Скинути поточний вантаж.
|
lenum.paydrop = Скинути поточний вантаж.
|
||||||
lenum.paytake = Підібрати вантаж у поточному місцерозташуванні.
|
lenum.paytake = Підібрати вантаж у поточному місцерозташуванні.
|
||||||
|
lenum.payenter = Увійти чи вийти з вантажного блока, над яким перебуває одиниця.
|
||||||
lenum.flag = Числовий флаг одиниці.
|
lenum.flag = Числовий флаг одиниці.
|
||||||
lenum.mine = Видобувати у заданій позиції.
|
lenum.mine = Видобувати у заданій позиції.
|
||||||
lenum.build = Побудувати будівлю.
|
lenum.build = Побудувати будівлю.
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import mindustry.maps.*;
|
|||||||
import mindustry.mod.*;
|
import mindustry.mod.*;
|
||||||
import mindustry.net.*;
|
import mindustry.net.*;
|
||||||
import mindustry.service.*;
|
import mindustry.service.*;
|
||||||
|
import mindustry.world.*;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.charset.*;
|
import java.nio.charset.*;
|
||||||
@@ -195,6 +196,8 @@ public class Vars implements Loadable{
|
|||||||
public static Fi launchIDFile;
|
public static Fi launchIDFile;
|
||||||
/** empty map, indicates no current map */
|
/** empty map, indicates no current map */
|
||||||
public static Map emptyMap;
|
public static Map emptyMap;
|
||||||
|
/** empty tile for payloads */
|
||||||
|
public static Tile emptyTile;
|
||||||
/** map file extension */
|
/** map file extension */
|
||||||
public static final String mapExtension = "msav";
|
public static final String mapExtension = "msav";
|
||||||
/** save file extension */
|
/** save file extension */
|
||||||
@@ -310,6 +313,10 @@ public class Vars implements Loadable{
|
|||||||
|
|
||||||
modDirectory.mkdirs();
|
modDirectory.mkdirs();
|
||||||
|
|
||||||
|
Events.on(ContentInitEvent.class, e -> {
|
||||||
|
emptyTile = new Tile(Short.MAX_VALUE - 20, Short.MAX_VALUE - 20);
|
||||||
|
});
|
||||||
|
|
||||||
mods.load();
|
mods.load();
|
||||||
maps.load();
|
maps.load();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ public class Planets implements ContentList{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(){
|
public void load(){
|
||||||
sun = new Planet("sun", null, 4){{
|
sun = new Planet("sun", null, 4f){{
|
||||||
bloom = true;
|
bloom = true;
|
||||||
accessible = false;
|
accessible = false;
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ public class Planets implements ContentList{
|
|||||||
);
|
);
|
||||||
}};
|
}};
|
||||||
|
|
||||||
erekir = new Planet("erekir", sun, 1, 2){{
|
erekir = new Planet("erekir", sun, 1f, 2){{
|
||||||
generator = new ErekirPlanetGenerator();
|
generator = new ErekirPlanetGenerator();
|
||||||
meshLoader = () -> new HexMesh(this, 5);
|
meshLoader = () -> new HexMesh(this, 5);
|
||||||
atmosphereColor = Color.valueOf("f07218");
|
atmosphereColor = Color.valueOf("f07218");
|
||||||
@@ -71,7 +71,7 @@ public class Planets implements ContentList{
|
|||||||
gen.max += 2;
|
gen.max += 2;
|
||||||
});
|
});
|
||||||
|
|
||||||
tantros = new Planet("tantros", sun, 1, 2){{
|
tantros = new Planet("tantros", sun, 1f, 2){{
|
||||||
generator = new TantrosPlanetGenerator();
|
generator = new TantrosPlanetGenerator();
|
||||||
meshLoader = () -> new HexMesh(this, 4);
|
meshLoader = () -> new HexMesh(this, 4);
|
||||||
atmosphereColor = Color.valueOf("3db899");
|
atmosphereColor = Color.valueOf("3db899");
|
||||||
@@ -81,7 +81,7 @@ public class Planets implements ContentList{
|
|||||||
alwaysUnlocked = true;
|
alwaysUnlocked = true;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
serpulo = new Planet("serpulo", sun, 1, 3){{
|
serpulo = new Planet("serpulo", sun, 1f, 3){{
|
||||||
generator = new SerpuloPlanetGenerator();
|
generator = new SerpuloPlanetGenerator();
|
||||||
meshLoader = () -> new HexMesh(this, 6);
|
meshLoader = () -> new HexMesh(this, 6);
|
||||||
cloudMeshLoader = () -> new MultiMesh(
|
cloudMeshLoader = () -> new MultiMesh(
|
||||||
|
|||||||
@@ -88,7 +88,9 @@ public class TechTree implements ContentList{
|
|||||||
node(conduit, () -> {
|
node(conduit, () -> {
|
||||||
node(liquidJunction, () -> {
|
node(liquidJunction, () -> {
|
||||||
node(liquidRouter, () -> {
|
node(liquidRouter, () -> {
|
||||||
node(liquidTank);
|
node(liquidContainer, () -> {
|
||||||
|
node(liquidTank);
|
||||||
|
});
|
||||||
|
|
||||||
node(bridgeConduit);
|
node(bridgeConduit);
|
||||||
|
|
||||||
|
|||||||
@@ -587,6 +587,7 @@ public class UnitTypes implements ContentList{
|
|||||||
ammoType = new ItemAmmoType(Items.coal);
|
ammoType = new ItemAmmoType(Items.coal);
|
||||||
|
|
||||||
weapons.add(new Weapon(){{
|
weapons.add(new Weapon(){{
|
||||||
|
shootOnDeath = true;
|
||||||
reload = 24f;
|
reload = 24f;
|
||||||
shootCone = 180f;
|
shootCone = 180f;
|
||||||
ejectEffect = Fx.none;
|
ejectEffect = Fx.none;
|
||||||
@@ -597,7 +598,7 @@ public class UnitTypes implements ContentList{
|
|||||||
hitEffect = Fx.pulverize;
|
hitEffect = Fx.pulverize;
|
||||||
lifetime = 10f;
|
lifetime = 10f;
|
||||||
speed = 1f;
|
speed = 1f;
|
||||||
splashDamageRadius = 60f;
|
splashDamageRadius = 55f;
|
||||||
instantDisappear = true;
|
instantDisappear = true;
|
||||||
splashDamage = 90f;
|
splashDamage = 90f;
|
||||||
killShooter = true;
|
killShooter = true;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ abstract class BlockUnitComp implements Unitc{
|
|||||||
|
|
||||||
//sets up block stats
|
//sets up block stats
|
||||||
maxHealth(tile.block.health);
|
maxHealth(tile.block.health);
|
||||||
health(tile.health());
|
health(tile.health);
|
||||||
hitSize(tile.block.size * tilesize * 0.7f);
|
hitSize(tile.block.size * tilesize * 0.7f);
|
||||||
set(tile);
|
set(tile);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -291,7 +291,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte relativeTo(Building tile){
|
public byte relativeTo(Building tile){
|
||||||
return relativeTo(tile.tile());
|
return relativeTo(tile.tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte relativeToEdge(Tile other){
|
public byte relativeToEdge(Tile other){
|
||||||
@@ -413,25 +413,28 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void handleUnitPayload(Unit player, Cons<Payload> grabber){
|
public void handleUnitPayload(Unit unit, Cons<Payload> grabber){
|
||||||
Fx.spawn.at(player);
|
Fx.spawn.at(unit);
|
||||||
|
|
||||||
if(player.isPlayer()){
|
if(unit.isPlayer()){
|
||||||
player.getPlayer().clearUnit();
|
unit.getPlayer().clearUnit();
|
||||||
}
|
}
|
||||||
|
|
||||||
player.remove();
|
unit.remove();
|
||||||
grabber.get(new UnitPayload(player));
|
//needs new ID as it is now a payload
|
||||||
Fx.unitDrop.at(player);
|
unit.id = EntityGroup.nextId();
|
||||||
if(Vars.net.client()){
|
grabber.get(new UnitPayload(unit));
|
||||||
Vars.netClient.clearRemovedEntity(player.id);
|
Fx.unitDrop.at(unit);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canUnload(){
|
public boolean canUnload(){
|
||||||
return block.unloadable;
|
return block.unloadable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean payloadCheck(int conveyorRotation){
|
||||||
|
return block.rotate && (rotation + 2) % 4 == conveyorRotation;
|
||||||
|
}
|
||||||
|
|
||||||
/** Called when an unloader takes an item. */
|
/** Called when an unloader takes an item. */
|
||||||
public void itemTaken(Item item){
|
public void itemTaken(Item item){
|
||||||
|
|
||||||
@@ -920,6 +923,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
drawTeamTop();
|
drawTeamTop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void payloadDraw(){
|
||||||
|
draw();
|
||||||
|
}
|
||||||
|
|
||||||
public void drawTeamTop(){
|
public void drawTeamTop(){
|
||||||
if(block.teamRegion.found()){
|
if(block.teamRegion.found()){
|
||||||
if(block.teamRegions[team.id] == block.teamRegion) Draw.color(team.color);
|
if(block.teamRegions[team.id] == block.teamRegion) Draw.color(team.color);
|
||||||
@@ -971,6 +978,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return whether this building is in a payload */
|
||||||
|
public boolean isPayload(){
|
||||||
|
return tile == emptyTile;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a block is placed over some other blocks. This seq will always have at least one item.
|
* Called when a block is placed over some other blocks. This seq will always have at least one item.
|
||||||
* Should load some previous state, if necessary. */
|
* Should load some previous state, if necessary. */
|
||||||
@@ -1059,7 +1071,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
|||||||
|
|
||||||
for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){
|
for(int i = 0; i < Mathf.clamp(amount / 5, 0, 30); i++){
|
||||||
Time.run(i / 2f, () -> {
|
Time.run(i / 2f, () -> {
|
||||||
Tile other = world.tile(tileX() + Mathf.range(block.size / 2), tileY() + Mathf.range(block.size / 2));
|
Tile other = world.tileWorld(x + Mathf.range(block.size * tilesize / 2), y + Mathf.range(block.size * tilesize / 2));
|
||||||
if(other != null){
|
if(other != null){
|
||||||
Puddles.deposit(other, liquid, splash);
|
Puddles.deposit(other, liquid, splash);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{
|
|||||||
@Override
|
@Override
|
||||||
@Replace
|
@Replace
|
||||||
public int pathType(){
|
public int pathType(){
|
||||||
return type.allowLegStep ? Pathfinder.costGround : Pathfinder.costLegs;
|
return type.allowLegStep ? Pathfinder.costLegs : Pathfinder.costGround;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{
|
|||||||
void pickup(Building tile){
|
void pickup(Building tile){
|
||||||
tile.pickedUp();
|
tile.pickedUp();
|
||||||
tile.tile.remove();
|
tile.tile.remove();
|
||||||
|
tile.tile = Vars.emptyTile;
|
||||||
payloads.add(new BuildPayload(tile));
|
payloads.add(new BuildPayload(tile));
|
||||||
Fx.unitPickup.at(tile);
|
Fx.unitPickup.at(tile);
|
||||||
Events.fire(new PickupEvent(self(), tile));
|
Events.fire(new PickupEvent(self(), tile));
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ public class Saves{
|
|||||||
SaveSlot slot = new SaveSlot(getNextSlotFile());
|
SaveSlot slot = new SaveSlot(getNextSlotFile());
|
||||||
slot.importFile(file);
|
slot.importFile(file);
|
||||||
slot.setName(file.nameWithoutExtension());
|
slot.setName(file.nameWithoutExtension());
|
||||||
|
|
||||||
saves.add(slot);
|
saves.add(slot);
|
||||||
slot.meta = SaveIO.getMeta(slot.file);
|
slot.meta = SaveIO.getMeta(slot.file);
|
||||||
current = slot;
|
current = slot;
|
||||||
@@ -330,6 +331,10 @@ public class Saves{
|
|||||||
public void importFile(Fi from) throws IOException{
|
public void importFile(Fi from) throws IOException{
|
||||||
try{
|
try{
|
||||||
from.copyTo(file);
|
from.copyTo(file);
|
||||||
|
if(previewFile().exists()){
|
||||||
|
requestedPreview = false;
|
||||||
|
previewFile().delete();
|
||||||
|
}
|
||||||
}catch(Exception e){
|
}catch(Exception e){
|
||||||
throw new IOException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ public class Waves{
|
|||||||
if(naval){
|
if(naval){
|
||||||
species = Structs.filter(UnitType[].class, species, v -> v[0].flying || v[0].naval);
|
species = Structs.filter(UnitType[].class, species, v -> v[0].flying || v[0].naval);
|
||||||
}else{
|
}else{
|
||||||
species = Structs.filter(UnitType[].class, species, v -> v[0].flying && !v[0].naval);
|
species = Structs.filter(UnitType[].class, species, v -> !v[0].naval);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnitType[][] fspec = species;
|
UnitType[][] fspec = species;
|
||||||
|
|||||||
@@ -335,7 +335,7 @@ public class LExecutor{
|
|||||||
/** Checks is a unit is valid for logic AI control, and returns the controller. */
|
/** Checks is a unit is valid for logic AI control, and returns the controller. */
|
||||||
@Nullable
|
@Nullable
|
||||||
public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){
|
public static LogicAI checkLogicAI(LExecutor exec, Object unitObj){
|
||||||
if(unitObj instanceof Unit unit && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){
|
if(unitObj instanceof Unit unit && unit.isValid() && exec.obj(varUnit) == unit && unit.team == exec.team && !unit.isPlayer() && !(unit.controller() instanceof FormationAI)){
|
||||||
if(unit.controller() instanceof LogicAI la){
|
if(unit.controller() instanceof LogicAI la){
|
||||||
la.controller = exec.building(varThis);
|
la.controller = exec.building(varThis);
|
||||||
return la;
|
return la;
|
||||||
@@ -934,27 +934,31 @@ public class LExecutor{
|
|||||||
//this should avoid any garbage allocation
|
//this should avoid any garbage allocation
|
||||||
Var v = exec.var(value);
|
Var v = exec.var(value);
|
||||||
if(v.isobj && value != 0){
|
if(v.isobj && value != 0){
|
||||||
String strValue =
|
String strValue = toString(v.objval);
|
||||||
v.objval == null ? "null" :
|
|
||||||
v.objval instanceof String s ? s :
|
|
||||||
v.objval == Blocks.stoneWall ? "solid" : //special alias
|
|
||||||
v.objval instanceof MappableContent content ? content.name :
|
|
||||||
v.objval instanceof Content ? "[content]" :
|
|
||||||
v.objval instanceof Building build ? build.block.name :
|
|
||||||
v.objval instanceof Unit unit ? unit.type.name :
|
|
||||||
v.objval instanceof Enum<?> e ? e.name() :
|
|
||||||
"[object]";
|
|
||||||
|
|
||||||
exec.textBuffer.append(strValue);
|
exec.textBuffer.append(strValue);
|
||||||
}else{
|
}else{
|
||||||
//display integer version when possible
|
//display integer version when possible
|
||||||
if(Math.abs(v.numval - (long)v.numval) < 0.000001){
|
if(Math.abs(v.numval - (long)v.numval) < 0.00001){
|
||||||
exec.textBuffer.append((long)v.numval);
|
exec.textBuffer.append((long)v.numval);
|
||||||
}else{
|
}else{
|
||||||
exec.textBuffer.append(v.numval);
|
exec.textBuffer.append(v.numval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String toString(Object obj){
|
||||||
|
return
|
||||||
|
obj == null ? "null" :
|
||||||
|
obj instanceof String s ? s :
|
||||||
|
obj == Blocks.stoneWall ? "solid" : //special alias
|
||||||
|
obj instanceof MappableContent content ? content.name :
|
||||||
|
obj instanceof Content ? "[content]" :
|
||||||
|
obj instanceof Building build ? build.block.name :
|
||||||
|
obj instanceof Unit unit ? unit.type.name :
|
||||||
|
obj instanceof Enum<?> e ? e.name() :
|
||||||
|
"[object]";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PrintFlushI implements LInstruction{
|
public static class PrintFlushI implements LInstruction{
|
||||||
|
|||||||
@@ -2,9 +2,16 @@ package mindustry.logic;
|
|||||||
|
|
||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.func.*;
|
import arc.func.*;
|
||||||
|
import arc.graphics.*;
|
||||||
|
import arc.scene.actions.*;
|
||||||
|
import arc.scene.ui.*;
|
||||||
import arc.scene.ui.TextButton.*;
|
import arc.scene.ui.TextButton.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import mindustry.core.GameState.*;
|
||||||
|
import mindustry.ctype.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
|
import mindustry.graphics.*;
|
||||||
|
import mindustry.logic.LExecutor.*;
|
||||||
import mindustry.logic.LStatements.*;
|
import mindustry.logic.LStatements.*;
|
||||||
import mindustry.ui.*;
|
import mindustry.ui.*;
|
||||||
import mindustry.ui.dialogs.*;
|
import mindustry.ui.dialogs.*;
|
||||||
@@ -15,6 +22,7 @@ import static mindustry.logic.LCanvas.*;
|
|||||||
public class LogicDialog extends BaseDialog{
|
public class LogicDialog extends BaseDialog{
|
||||||
public LCanvas canvas;
|
public LCanvas canvas;
|
||||||
Cons<String> consumer = s -> {};
|
Cons<String> consumer = s -> {};
|
||||||
|
@Nullable LExecutor executor;
|
||||||
|
|
||||||
public LogicDialog(){
|
public LogicDialog(){
|
||||||
super("logic");
|
super("logic");
|
||||||
@@ -57,6 +65,90 @@ public class LogicDialog extends BaseDialog{
|
|||||||
dialog.show();
|
dialog.show();
|
||||||
}).name("edit");
|
}).name("edit");
|
||||||
|
|
||||||
|
buttons.button("@variables", Icon.menu, () -> {
|
||||||
|
BaseDialog dialog = new BaseDialog("@variables");
|
||||||
|
dialog.hidden(() -> {
|
||||||
|
if(!wasPaused){
|
||||||
|
state.set(State.paused);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.shown(() -> {
|
||||||
|
if(!wasPaused){
|
||||||
|
state.set(State.playing);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.cont.pane(p -> {
|
||||||
|
p.margin(10f).marginRight(16f);
|
||||||
|
p.table(Tex.button, t -> {
|
||||||
|
t.defaults().fillX().height(45f);
|
||||||
|
for(var s : executor.vars){
|
||||||
|
if(s.constant) continue;
|
||||||
|
|
||||||
|
Color varColor = Pal.gray;
|
||||||
|
float stub = 8f, mul = 0.5f, pad = 4;
|
||||||
|
|
||||||
|
Color color =
|
||||||
|
!s.isobj ? Pal.place :
|
||||||
|
s.objval == null ? Color.darkGray :
|
||||||
|
s.objval instanceof String ? Pal.ammo :
|
||||||
|
s.objval instanceof Content ? Pal.logicOperations :
|
||||||
|
s.objval instanceof Building ? Pal.logicBlocks :
|
||||||
|
s.objval instanceof Unit ? Pal.logicUnits :
|
||||||
|
s.objval instanceof Enum<?> ? Pal.logicIo :
|
||||||
|
Color.white;
|
||||||
|
|
||||||
|
String typeName =
|
||||||
|
!s.isobj ? "number" :
|
||||||
|
s.objval == null ? "null" :
|
||||||
|
s.objval instanceof String ? "string" :
|
||||||
|
s.objval instanceof Content ? "content" :
|
||||||
|
s.objval instanceof Building ? "building" :
|
||||||
|
s.objval instanceof Unit ? "unit" :
|
||||||
|
s.objval instanceof Enum<?> ? "enum" :
|
||||||
|
"unknown";
|
||||||
|
|
||||||
|
t.add(new Image(Tex.whiteui, varColor.cpy().mul(mul))).width(stub);
|
||||||
|
t.stack(new Image(Tex.whiteui, varColor), new Label(" " + s.name + " ", Styles.outlineLabel){{
|
||||||
|
setColor(Pal.accent);
|
||||||
|
}}).padRight(pad);
|
||||||
|
|
||||||
|
t.add(new Image(Tex.whiteui, Pal.gray.cpy().mul(mul))).width(stub);
|
||||||
|
t.table(Tex.pane, out -> {
|
||||||
|
float period = 15f;
|
||||||
|
float[] counter = {-1f};
|
||||||
|
Label label = out.add("").style(Styles.outlineLabel).padLeft(4).padRight(4).width(140f).wrap().get();
|
||||||
|
label.update(() -> {
|
||||||
|
if(counter[0] < 0 || (counter[0] += Time.delta) >= period){
|
||||||
|
String text = s.isobj ? PrintI.toString(s.objval) : Math.abs(s.numval - (long)s.numval) < 0.00001 ? (long)s.numval + "" : s.numval + "";
|
||||||
|
if(!label.textEquals(text)){
|
||||||
|
label.setText(text);
|
||||||
|
if(counter[0] >= 0f){
|
||||||
|
label.actions(Actions.color(Pal.accent), Actions.color(Color.white, 0.2f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
counter[0] = 0f;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
label.act(1f);
|
||||||
|
}).padRight(pad);
|
||||||
|
|
||||||
|
//TODO type name does not update, is this important?
|
||||||
|
t.add(new Image(Tex.whiteui, color.cpy().mul(mul))).width(stub);
|
||||||
|
t.stack(new Image(Tex.whiteui, color), new Label(" " + typeName + " ", Styles.outlineLabel));
|
||||||
|
|
||||||
|
t.row();
|
||||||
|
|
||||||
|
t.add().growX().colspan(6).height(4).row();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog.addCloseButton();
|
||||||
|
dialog.show();
|
||||||
|
}).name("variables").disabled(b -> executor == null || executor.vars.length == 0);
|
||||||
|
|
||||||
buttons.button("@add", Icon.add, () -> {
|
buttons.button("@add", Icon.add, () -> {
|
||||||
BaseDialog dialog = new BaseDialog("@add");
|
BaseDialog dialog = new BaseDialog("@add");
|
||||||
dialog.cont.pane(t -> {
|
dialog.cont.pane(t -> {
|
||||||
@@ -92,7 +184,8 @@ public class LogicDialog extends BaseDialog{
|
|||||||
onResize(() -> canvas.rebuild());
|
onResize(() -> canvas.rebuild());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void show(String code, Cons<String> modified){
|
public void show(String code, LExecutor executor, Cons<String> modified){
|
||||||
|
this.executor = executor;
|
||||||
canvas.statements.clearChildren();
|
canvas.statements.clearChildren();
|
||||||
canvas.rebuild();
|
canvas.rebuild();
|
||||||
try{
|
try{
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ public class GameService{
|
|||||||
});
|
});
|
||||||
|
|
||||||
Events.on(UnitControlEvent.class, e -> {
|
Events.on(UnitControlEvent.class, e -> {
|
||||||
if(e.unit instanceof BlockUnitc && ((BlockUnitc)e.unit).tile().block == Blocks.router){
|
if(e.unit instanceof BlockUnitc unit && unit.tile().block == Blocks.router){
|
||||||
becomeRouter.complete();
|
becomeRouter.complete();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -132,6 +132,12 @@ public class Planet extends UnlockableContent{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @deprecated confusing parameter orer, use the other constructor instead */
|
||||||
|
@Deprecated
|
||||||
|
public Planet(String name, Planet parent, int sectorSize, float radius){
|
||||||
|
this(name, parent, radius, sectorSize);
|
||||||
|
}
|
||||||
|
|
||||||
public @Nullable Sector getLastSector(){
|
public @Nullable Sector getLastSector(){
|
||||||
if(sectors.isEmpty()){
|
if(sectors.isEmpty()){
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import mindustry.graphics.*;
|
|||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
|
|
||||||
public class BaseDialog extends Dialog{
|
public class BaseDialog extends Dialog{
|
||||||
private boolean wasPaused;
|
protected boolean wasPaused;
|
||||||
protected boolean shouldPause;
|
protected boolean shouldPause;
|
||||||
|
|
||||||
public BaseDialog(String title, DialogStyle style){
|
public BaseDialog(String title, DialogStyle style){
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public class Block extends UnlockableContent{
|
|||||||
public boolean outputsPayload = false;
|
public boolean outputsPayload = false;
|
||||||
public boolean acceptsPayload = false;
|
public boolean acceptsPayload = false;
|
||||||
public boolean acceptsItems = false;
|
public boolean acceptsItems = false;
|
||||||
|
public boolean separateItemCapacity = false;
|
||||||
|
|
||||||
public int itemCapacity = 10;
|
public int itemCapacity = 10;
|
||||||
public float liquidCapacity = 10f;
|
public float liquidCapacity = 10f;
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ public class LaserTurret extends PowerTurret{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void bullet(BulletType type, float angle){
|
protected void bullet(BulletType type, float angle){
|
||||||
bullet = type.create(tile.build, team, x + tr.x, y + tr.y, angle);
|
bullet = type.create(this, team, x + tr.x, y + tr.y, angle);
|
||||||
bulletLife = shootDuration;
|
bulletLife = shootDuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import arc.graphics.g2d.*;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import mindustry.annotations.Annotations.*;
|
import mindustry.annotations.Annotations.*;
|
||||||
import mindustry.content.*;
|
import mindustry.content.*;
|
||||||
|
import mindustry.core.*;
|
||||||
import mindustry.entities.*;
|
import mindustry.entities.*;
|
||||||
import mindustry.entities.bullet.*;
|
import mindustry.entities.bullet.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -90,9 +91,7 @@ public class LiquidTurret extends Turret{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
if(unit != null){
|
unit.ammo(unit.type().ammoCapacity * liquids.currentAmount() / liquidCapacity);
|
||||||
unit.ammo(unit.type().ammoCapacity * liquids.currentAmount() / liquidCapacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
super.updateTile();
|
super.updateTile();
|
||||||
}
|
}
|
||||||
@@ -100,13 +99,14 @@ public class LiquidTurret extends Turret{
|
|||||||
@Override
|
@Override
|
||||||
protected void findTarget(){
|
protected void findTarget(){
|
||||||
if(extinguish && liquids.current().canExtinguish()){
|
if(extinguish && liquids.current().canExtinguish()){
|
||||||
|
int tx = World.toTile(x), ty = World.toTile(y);
|
||||||
Fire result = null;
|
Fire result = null;
|
||||||
float mindst = 0f;
|
float mindst = 0f;
|
||||||
int tr = (int)(range / tilesize);
|
int tr = (int)(range / tilesize);
|
||||||
for(int x = -tr; x <= tr; x++){
|
for(int x = -tr; x <= tr; x++){
|
||||||
for(int y = -tr; y <= tr; y++){
|
for(int y = -tr; y <= tr; y++){
|
||||||
Tile other = world.tile(x + tile.x, y + tile.y);
|
Tile other = world.tile(x + tx, y + ty);
|
||||||
var fire = Fires.get(x + tile.x, y + tile.y);
|
var fire = Fires.get(x + tx, y + ty);
|
||||||
float dst = fire == null ? 0 : dst2(fire);
|
float dst = fire == null ? 0 : dst2(fire);
|
||||||
//do not extinguish fires on other team blocks
|
//do not extinguish fires on other team blocks
|
||||||
if(other != null && fire != null && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){
|
if(other != null && fire != null && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){
|
||||||
|
|||||||
@@ -31,9 +31,7 @@ public class PowerTurret extends Turret{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
if(unit != null){
|
unit.ammo(power.status * unit.type().ammoCapacity);
|
||||||
unit.ammo(power.status * unit.type().ammoCapacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
super.updateTile();
|
super.updateTile();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,15 +149,9 @@ public class Turret extends ReloadTurret{
|
|||||||
public boolean logicShooting = false;
|
public boolean logicShooting = false;
|
||||||
public @Nullable Posc target;
|
public @Nullable Posc target;
|
||||||
public Vec2 targetPos = new Vec2();
|
public Vec2 targetPos = new Vec2();
|
||||||
public @Nullable BlockUnitc unit;
|
public BlockUnitc unit = (BlockUnitc)UnitTypes.block.create(team);
|
||||||
public boolean wasShooting, charging;
|
public boolean wasShooting, charging;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void created(){
|
|
||||||
unit = (BlockUnitc)UnitTypes.block.create(team);
|
|
||||||
unit.tile(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canControl(){
|
public boolean canControl(){
|
||||||
return playerControllable;
|
return playerControllable;
|
||||||
@@ -165,7 +159,7 @@ public class Turret extends ReloadTurret{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void control(LAccess type, double p1, double p2, double p3, double p4){
|
public void control(LAccess type, double p1, double p2, double p3, double p4){
|
||||||
if(type == LAccess.shoot && (unit == null || !unit.isPlayer())){
|
if(type == LAccess.shoot && !unit.isPlayer()){
|
||||||
targetPos.set(World.unconv((float)p1), World.unconv((float)p2));
|
targetPos.set(World.unconv((float)p1), World.unconv((float)p2));
|
||||||
logicControlTime = logicControlCooldown;
|
logicControlTime = logicControlCooldown;
|
||||||
logicShooting = !Mathf.zero(p3);
|
logicShooting = !Mathf.zero(p3);
|
||||||
@@ -203,15 +197,14 @@ public class Turret extends ReloadTurret{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isShooting(){
|
public boolean isShooting(){
|
||||||
return (isControlled() ? (unit != null && unit.isShooting()) : logicControlled() ? logicShooting : target != null);
|
return (isControlled() ? unit.isShooting() : logicControlled() ? logicShooting : target != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Unit unit(){
|
public Unit unit(){
|
||||||
if(unit == null){
|
//make sure stats are correct
|
||||||
unit = (BlockUnitc)UnitTypes.block.create(team);
|
unit.tile(this);
|
||||||
unit.tile(this);
|
unit.team(team);
|
||||||
}
|
|
||||||
return (Unit)unit;
|
return (Unit)unit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,12 +260,9 @@ public class Turret extends ReloadTurret{
|
|||||||
recoil = Mathf.lerpDelta(recoil, 0f, restitution);
|
recoil = Mathf.lerpDelta(recoil, 0f, restitution);
|
||||||
heat = Mathf.lerpDelta(heat, 0f, cooldown);
|
heat = Mathf.lerpDelta(heat, 0f, cooldown);
|
||||||
|
|
||||||
if(unit != null){
|
unit.tile(this);
|
||||||
unit.health(health);
|
unit.rotation(rotation);
|
||||||
unit.rotation(rotation);
|
unit.team(team);
|
||||||
unit.team(team);
|
|
||||||
unit.set(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(logicControlTime > 0){
|
if(logicControlTime > 0){
|
||||||
logicControlTime -= Time.delta;
|
logicControlTime -= Time.delta;
|
||||||
@@ -338,7 +328,7 @@ public class Turret extends ReloadTurret{
|
|||||||
if(targetAir && !targetGround){
|
if(targetAir && !targetGround){
|
||||||
target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded(), unitSort);
|
target = Units.bestEnemy(team, x, y, range, e -> !e.dead() && !e.isGrounded(), unitSort);
|
||||||
}else{
|
}else{
|
||||||
target = Units.bestTarget(team, x, y, range, e -> !e.dead() && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> true, unitSort);
|
target = Units.bestTarget(team, x, y, range, e -> !e.dead() && (e.isGrounded() || targetAir) && (!e.isGrounded() || targetGround), b -> targetGround, unitSort);
|
||||||
|
|
||||||
if(target == null && canHeal()){
|
if(target == null && canHeal()){
|
||||||
target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this);
|
target = Units.findAllyTile(team, x, y, range, b -> b.damaged() && b != this);
|
||||||
@@ -405,7 +395,7 @@ public class Turret extends ReloadTurret{
|
|||||||
|
|
||||||
for(int i = 0; i < chargeEffects; i++){
|
for(int i = 0; i < chargeEffects; i++){
|
||||||
Time.run(Mathf.random(chargeMaxDelay), () -> {
|
Time.run(Mathf.random(chargeMaxDelay), () -> {
|
||||||
if(!isValid()) return;
|
if(dead) return;
|
||||||
tr.trns(rotation, shootLength);
|
tr.trns(rotation, shootLength);
|
||||||
chargeEffect.at(x + tr.x, y + tr.y, rotation);
|
chargeEffect.at(x + tr.x, y + tr.y, rotation);
|
||||||
});
|
});
|
||||||
@@ -414,7 +404,7 @@ public class Turret extends ReloadTurret{
|
|||||||
charging = true;
|
charging = true;
|
||||||
|
|
||||||
Time.run(chargeTime, () -> {
|
Time.run(chargeTime, () -> {
|
||||||
if(!isValid()) return;
|
if(dead) return;
|
||||||
tr.trns(rotation, shootLength);
|
tr.trns(rotation, shootLength);
|
||||||
recoil = recoilAmount;
|
recoil = recoilAmount;
|
||||||
heat = 1f;
|
heat = 1f;
|
||||||
@@ -428,7 +418,7 @@ public class Turret extends ReloadTurret{
|
|||||||
for(int i = 0; i < shots; i++){
|
for(int i = 0; i < shots; i++){
|
||||||
int ii = i;
|
int ii = i;
|
||||||
Time.run(burstSpacing * i, () -> {
|
Time.run(burstSpacing * i, () -> {
|
||||||
if(!isValid() || !hasAmmo()) return;
|
if(dead || !hasAmmo()) return;
|
||||||
|
|
||||||
recoil = recoilAmount;
|
recoil = recoilAmount;
|
||||||
|
|
||||||
@@ -488,7 +478,7 @@ public class Turret extends ReloadTurret{
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void ejectEffects(){
|
protected void ejectEffects(){
|
||||||
if(!isValid()) return;
|
if(dead) return;
|
||||||
|
|
||||||
//alternate sides when using a double turret
|
//alternate sides when using a double turret
|
||||||
float scl = (shots == 2 && alternate && shotCounter % 2 == 1 ? -1f : 1f);
|
float scl = (shots == 2 && alternate && shotCounter % 2 == 1 ? -1f : 1f);
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import static mindustry.Vars.*;
|
|||||||
|
|
||||||
public class Conveyor extends Block implements Autotiler{
|
public class Conveyor extends Block implements Autotiler{
|
||||||
private static final float itemSpace = 0.4f;
|
private static final float itemSpace = 0.4f;
|
||||||
private static final int capacity = 4;
|
private static final int capacity = 3;
|
||||||
|
|
||||||
final Vec2 tr1 = new Vec2();
|
final Vec2 tr1 = new Vec2();
|
||||||
final Vec2 tr2 = new Vec2();
|
final Vec2 tr2 = new Vec2();
|
||||||
@@ -40,7 +40,7 @@ public class Conveyor extends Block implements Autotiler{
|
|||||||
update = true;
|
update = true;
|
||||||
group = BlockGroup.transportation;
|
group = BlockGroup.transportation;
|
||||||
hasItems = true;
|
hasItems = true;
|
||||||
itemCapacity = 4;
|
itemCapacity = capacity;
|
||||||
conveyorPlacement = true;
|
conveyorPlacement = true;
|
||||||
|
|
||||||
ambientSound = Sounds.conveyor;
|
ambientSound = Sounds.conveyor;
|
||||||
@@ -132,7 +132,7 @@ public class Conveyor extends Block implements Autotiler{
|
|||||||
public float minitem = 1;
|
public float minitem = 1;
|
||||||
|
|
||||||
public int blendbits, blending;
|
public int blendbits, blending;
|
||||||
public int blendsclx, blendscly;
|
public int blendsclx = 1, blendscly = 1;
|
||||||
|
|
||||||
public float clogHeat = 0f;
|
public float clogHeat = 0f;
|
||||||
|
|
||||||
@@ -163,12 +163,17 @@ public class Conveyor extends Block implements Autotiler{
|
|||||||
tr2.trns(rotation * 90, -tilesize / 2f, xs[i] * tilesize / 2f);
|
tr2.trns(rotation * 90, -tilesize / 2f, xs[i] * tilesize / 2f);
|
||||||
|
|
||||||
Draw.rect(item.fullIcon,
|
Draw.rect(item.fullIcon,
|
||||||
(tile.x * tilesize + tr1.x * ys[i] + tr2.x),
|
(x + tr1.x * ys[i] + tr2.x),
|
||||||
(tile.y * tilesize + tr1.y * ys[i] + tr2.y),
|
(y + tr1.y * ys[i] + tr2.y),
|
||||||
itemSize, itemSize);
|
itemSize, itemSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void payloadDraw(){
|
||||||
|
Draw.rect(block.fullIcon,x, y);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawCracks(){
|
public void drawCracks(){
|
||||||
Draw.z(Layer.block - 0.15f);
|
Draw.z(Layer.block - 0.15f);
|
||||||
@@ -323,7 +328,7 @@ public class Conveyor extends Block implements Autotiler{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleStack(Item item, int amount, Teamc source){
|
public void handleStack(Item item, int amount, Teamc source){
|
||||||
amount = Math.min(amount, itemCapacity - len);
|
amount = Math.min(amount, capacity - len);
|
||||||
|
|
||||||
for(int i = amount - 1; i >= 0; i--){
|
for(int i = amount - 1; i >= 0; i--){
|
||||||
add(0);
|
add(0);
|
||||||
|
|||||||
@@ -184,6 +184,11 @@ public class ItemBridge extends Block{
|
|||||||
public boolean wasMoved, moved;
|
public boolean wasMoved, moved;
|
||||||
public float transportCounter;
|
public float transportCounter;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pickedUp(){
|
||||||
|
link = -1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void playerPlaced(Object config){
|
public void playerPlaced(Object config){
|
||||||
super.playerPlaced(config);
|
super.playerPlaced(config);
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ public class MassDriver extends Block{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//align to shooter rotation
|
//align to shooter rotation
|
||||||
rotation = Angles.moveToward(rotation, tile.angleTo(currentShooter()), rotateSpeed * efficiency());
|
rotation = Angles.moveToward(rotation, angleTo(currentShooter()), rotateSpeed * efficiency());
|
||||||
}else if(state == DriverState.shooting){
|
}else if(state == DriverState.shooting){
|
||||||
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail
|
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail
|
||||||
if(!hasLink || (!waitingShooters.isEmpty() && (itemCapacity - items.total() >= minDistribute))){
|
if(!hasLink || (!waitingShooters.isEmpty() && (itemCapacity - items.total() >= minDistribute))){
|
||||||
@@ -173,7 +173,7 @@ public class MassDriver extends Block{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float targetRotation = tile.angleTo(link);
|
float targetRotation = angleTo(link);
|
||||||
|
|
||||||
if(
|
if(
|
||||||
items.total() >= minDistribute && //must shoot minimum amount of items
|
items.total() >= minDistribute && //must shoot minimum amount of items
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ public class PayloadConveyor extends Block{
|
|||||||
|
|
||||||
int ntrns = 1 + size/2;
|
int ntrns = 1 + size/2;
|
||||||
Tile next = tile.nearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns);
|
Tile next = tile.nearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns);
|
||||||
blocked = (next != null && next.solid() && !(next.block().outputsPayload || next.block().acceptsPayload)) || (this.next != null && this.next.block.rotate && (this.next.rotation + 2) % 4 == rotation);
|
blocked = (next != null && next.solid() && !(next.block().outputsPayload || next.block().acceptsPayload)) || (this.next != null && this.next.payloadCheck(rotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -126,6 +126,10 @@ public class PayloadConveyor extends Block{
|
|||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
if(!enabled) return;
|
if(!enabled) return;
|
||||||
|
|
||||||
|
if(item != null){
|
||||||
|
item.update();
|
||||||
|
}
|
||||||
|
|
||||||
lastInterp = curInterp;
|
lastInterp = curInterp;
|
||||||
curInterp = fract();
|
curInterp = fract();
|
||||||
//rollover skip
|
//rollover skip
|
||||||
@@ -231,6 +235,11 @@ public class PayloadConveyor extends Block{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void payloadDraw(){
|
||||||
|
Draw.rect(block.fullIcon,x, y);
|
||||||
|
}
|
||||||
|
|
||||||
public float time(){
|
public float time(){
|
||||||
return Time.time;
|
return Time.time;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public class Conduit extends LiquidBlock implements Autotiler{
|
|||||||
|
|
||||||
public class ConduitBuild extends LiquidBuild implements ChainedBuilding{
|
public class ConduitBuild extends LiquidBuild implements ChainedBuilding{
|
||||||
public float smoothLiquid;
|
public float smoothLiquid;
|
||||||
public int blendbits, xscl, yscl, blending;
|
public int blendbits, xscl = 1, yscl = 1, blending;
|
||||||
public boolean capped;
|
public boolean capped;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import arc.struct.Bits;
|
|||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
import mindustry.*;
|
|
||||||
import mindustry.ai.types.*;
|
import mindustry.ai.types.*;
|
||||||
import mindustry.core.*;
|
import mindustry.core.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -493,7 +492,7 @@ public class LogicBlock extends Block{
|
|||||||
@Override
|
@Override
|
||||||
public void buildConfiguration(Table table){
|
public void buildConfiguration(Table table){
|
||||||
table.button(Icon.pencil, Styles.clearTransi, () -> {
|
table.button(Icon.pencil, Styles.clearTransi, () -> {
|
||||||
Vars.ui.logic.show(code, code -> configure(compress(code, relativeConnections())));
|
ui.logic.show(code, executor, code -> configure(compress(code, relativeConnections())));
|
||||||
}).size(40);
|
}).size(40);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ public class MessageBlock extends Block{
|
|||||||
dialog.hide();
|
dialog.hide();
|
||||||
}).size(130f, 60f);
|
}).size(130f, 60f);
|
||||||
dialog.update(() -> {
|
dialog.update(() -> {
|
||||||
if(tile.block() != MessageBlock.this){
|
if(tile.build != this){
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ public abstract class BlockProducer extends PayloadBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
var recipe = recipe();
|
var recipe = recipe();
|
||||||
boolean produce = recipe != null && consValid() && payload == null;
|
boolean produce = recipe != null && consValid() && payload == null;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package mindustry.world.blocks.payloads;
|
package mindustry.world.blocks.payloads;
|
||||||
|
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
|
import arc.math.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
import mindustry.game.*;
|
import mindustry.game.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
@@ -15,6 +16,7 @@ public class BuildPayload implements Payload{
|
|||||||
|
|
||||||
public BuildPayload(Block block, Team team){
|
public BuildPayload(Block block, Team team){
|
||||||
this.build = block.newBuilding().create(block, team);
|
this.build = block.newBuilding().create(block, team);
|
||||||
|
this.build.tile = emptyTile;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BuildPayload(Building build){
|
public BuildPayload(Building build){
|
||||||
@@ -34,6 +36,12 @@ public class BuildPayload implements Payload{
|
|||||||
build.dropped();
|
build.dropped();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(){
|
||||||
|
if(build.tile == null) build.tile = emptyTile;
|
||||||
|
build.update();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack[] requirements(){
|
public ItemStack[] requirements(){
|
||||||
return build.block.requirements;
|
return build.block.requirements;
|
||||||
@@ -80,7 +88,10 @@ public class BuildPayload implements Payload{
|
|||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
drawShadow(1f);
|
drawShadow(1f);
|
||||||
Draw.rect(build.block.fullIcon, build.x, build.y);
|
float prevZ = Draw.z();
|
||||||
|
Draw.zTransform(z -> 0.0011f + Mathf.clamp(z, prevZ - 0.001f, prevZ + 0.9f));
|
||||||
|
build.payloadDraw();
|
||||||
|
Draw.zTransform();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import arc.util.io.*;
|
|||||||
import mindustry.*;
|
import mindustry.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
import mindustry.world.blocks.*;
|
import mindustry.world.blocks.*;
|
||||||
|
import mindustry.world.blocks.storage.*;
|
||||||
import mindustry.world.meta.*;
|
import mindustry.world.meta.*;
|
||||||
|
|
||||||
import static mindustry.Vars.*;
|
import static mindustry.Vars.*;
|
||||||
@@ -23,6 +24,7 @@ public class Constructor extends BlockProducer{
|
|||||||
size = 3;
|
size = 3;
|
||||||
configurable = true;
|
configurable = true;
|
||||||
|
|
||||||
|
configClear((ConstructorBuild tile) -> tile.recipe = null);
|
||||||
config(Block.class, (ConstructorBuild tile, Block block) -> {
|
config(Block.class, (ConstructorBuild tile, Block block) -> {
|
||||||
if(tile.recipe != block) tile.progress = 0f;
|
if(tile.recipe != block) tile.progress = 0f;
|
||||||
if(canProduce(block)){
|
if(canProduce(block)){
|
||||||
@@ -40,7 +42,7 @@ public class Constructor extends BlockProducer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean canProduce(Block b){
|
public boolean canProduce(Block b){
|
||||||
return b.isVisible() && b.size >= minBlockSize && b.size <= maxBlockSize;
|
return b.isVisible() && b.size >= minBlockSize && b.size <= maxBlockSize && !(b instanceof CoreBlock) && !state.rules.bannedBlocks.contains(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ConstructorBuild extends BlockProducerBuild{
|
public class ConstructorBuild extends BlockProducerBuild{
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ public interface Payload extends Position{
|
|||||||
/** @return the time taken to build this payload. */
|
/** @return the time taken to build this payload. */
|
||||||
float buildTime();
|
float buildTime();
|
||||||
|
|
||||||
|
/** update this payload if it is a block */
|
||||||
|
default void update(){}
|
||||||
|
|
||||||
/** @return whether this payload was dumped. */
|
/** @return whether this payload was dumped. */
|
||||||
default boolean dump(){
|
default boolean dump(){
|
||||||
return false;
|
return false;
|
||||||
@@ -94,6 +97,7 @@ public interface Payload extends Position{
|
|||||||
BuildPayload payload = new BuildPayload(block, Team.derelict);
|
BuildPayload payload = new BuildPayload(block, Team.derelict);
|
||||||
byte version = read.b();
|
byte version = read.b();
|
||||||
payload.build.readAll(read, version);
|
payload.build.readAll(read, version);
|
||||||
|
payload.build.tile = emptyTile;
|
||||||
return (T)payload;
|
return (T)payload;
|
||||||
}else if(type == payloadUnit){
|
}else if(type == payloadUnit){
|
||||||
byte id = read.b();
|
byte id = read.b();
|
||||||
|
|||||||
@@ -135,6 +135,13 @@ public class PayloadBlock extends Block{
|
|||||||
if(payload != null && !carried) payload.dump();
|
if(payload != null && !carried) payload.dump();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTile(){
|
||||||
|
if(payload != null){
|
||||||
|
payload.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean blends(int direction){
|
public boolean blends(int direction){
|
||||||
return PayloadBlock.blends(this, direction);
|
return PayloadBlock.blends(this, direction);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,11 @@ public class PayloadDeconstructor extends PayloadBlock{
|
|||||||
Draw.rect(topRegion, x, y);
|
Draw.rect(topRegion, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean acceptUnitPayload(Unit unit){
|
||||||
|
return payload == null && deconstructing == null && !unit.spawnedByCore && unit.type.getTotalRequirements().length > 0 && unit.hitSize / tilesize <= maxPayloadSize;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handlePayload(Building source, Payload payload){
|
public void handlePayload(Building source, Payload payload){
|
||||||
super.handlePayload(source, payload);
|
super.handlePayload(source, payload);
|
||||||
@@ -93,11 +98,12 @@ public class PayloadDeconstructor extends PayloadBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptPayload(Building source, Payload payload){
|
public boolean acceptPayload(Building source, Payload payload){
|
||||||
return deconstructing == null && super.acceptPayload(source, payload) && payload.requirements().length > 0 && payload.fits(maxPayloadSize);
|
return deconstructing == null && this.payload == null && super.acceptPayload(source, payload) && payload.requirements().length > 0 && payload.fits(maxPayloadSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
if(items.total() > 0){
|
if(items.total() > 0){
|
||||||
for(int i = 0; i < dumpRate; i++){
|
for(int i = 0; i < dumpRate; i++){
|
||||||
dumpAccumulate();
|
dumpAccumulate();
|
||||||
@@ -153,10 +159,26 @@ public class PayloadDeconstructor extends PayloadBlock{
|
|||||||
|
|
||||||
//finish deconstruction, prepare for next payload.
|
//finish deconstruction, prepare for next payload.
|
||||||
if(progress >= 1f){
|
if(progress >= 1f){
|
||||||
Fx.breakBlock.at(x, y, deconstructing.size() / tilesize);
|
canProgress = true;
|
||||||
|
//check for rounding errors
|
||||||
|
for(int i = 0; i < reqs.length; i++){
|
||||||
|
if(Mathf.equal(accum[i], 1f, 0.0001f)){
|
||||||
|
if(items.total() < itemCapacity){
|
||||||
|
items.add(reqs[i].item, 1);
|
||||||
|
accum[i] = 0f;
|
||||||
|
}else{
|
||||||
|
canProgress = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
deconstructing = null;
|
if(canProgress){
|
||||||
accum = null;
|
Fx.breakBlock.at(x, y, deconstructing.size() / tilesize);
|
||||||
|
|
||||||
|
deconstructing = null;
|
||||||
|
accum = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}else if(moveInPayload(false) && payload != null){
|
}else if(moveInPayload(false) && payload != null){
|
||||||
accum = new float[payload.requirements().length];
|
accum = new float[payload.requirements().length];
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mindustry.world.blocks.payloads;
|
|||||||
import arc.*;
|
import arc.*;
|
||||||
import arc.graphics.g2d.*;
|
import arc.graphics.g2d.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
|
import arc.util.io.*;
|
||||||
import mindustry.entities.units.*;
|
import mindustry.entities.units.*;
|
||||||
import mindustry.gen.*;
|
import mindustry.gen.*;
|
||||||
import mindustry.graphics.*;
|
import mindustry.graphics.*;
|
||||||
@@ -58,15 +59,23 @@ public class PayloadLoader extends PayloadBlock{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class PayloadLoaderBuild extends PayloadBlockBuild<BuildPayload>{
|
public class PayloadLoaderBuild extends PayloadBlockBuild<BuildPayload>{
|
||||||
|
public boolean exporting = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptPayload(Building source, Payload payload){
|
public boolean acceptPayload(Building source, Payload payload){
|
||||||
return super.acceptPayload(source, payload) &&
|
return super.acceptPayload(source, payload) &&
|
||||||
|
payload.fits(maxBlockSize) &&
|
||||||
payload instanceof BuildPayload build &&
|
payload instanceof BuildPayload build &&
|
||||||
((build.build.block.hasItems && build.block().unloadable && build.block().itemCapacity >= 10 && build.block().size <= maxBlockSize) ||
|
((build.build.block.hasItems && build.block().unloadable && build.block().itemCapacity >= 10 && build.block().size <= maxBlockSize) ||
|
||||||
build.build.block().hasLiquids && build.block().liquidCapacity >= 10f);
|
build.build.block().hasLiquids && build.block().liquidCapacity >= 10f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handlePayload(Building source, Payload payload){
|
||||||
|
super.handlePayload(source, payload);
|
||||||
|
exporting = false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptItem(Building source, Item item){
|
public boolean acceptItem(Building source, Item item){
|
||||||
return items.total() < itemCapacity;
|
return items.total() < itemCapacity;
|
||||||
@@ -102,6 +111,7 @@ public class PayloadLoader extends PayloadBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
if(shouldExport()){
|
if(shouldExport()){
|
||||||
moveOutPayload();
|
moveOutPayload();
|
||||||
}else if(moveInPayload()){
|
}else if(moveInPayload()){
|
||||||
@@ -119,6 +129,9 @@ public class PayloadLoader extends PayloadBlock{
|
|||||||
payload.build.handleItem(payload.build, item);
|
payload.build.handleItem(payload.build, item);
|
||||||
items.remove(item, 1);
|
items.remove(item, 1);
|
||||||
break;
|
break;
|
||||||
|
}else if(payload.block().separateItemCapacity || payload.block().consumes.consumesItem(item)){
|
||||||
|
exporting = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,8 +159,28 @@ public class PayloadLoader extends PayloadBlock{
|
|||||||
|
|
||||||
public boolean shouldExport(){
|
public boolean shouldExport(){
|
||||||
return payload != null && (
|
return payload != null && (
|
||||||
|
exporting ||
|
||||||
(payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
|
(payload.block().hasLiquids && payload.build.liquids.total() >= payload.block().liquidCapacity - 0.001f) ||
|
||||||
(payload.block().hasItems && payload.build.items.total() >= payload.block().itemCapacity));
|
(payload.block().hasItems && payload.block().separateItemCapacity && content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte version(){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void write(Writes write){
|
||||||
|
super.write(write);
|
||||||
|
write.bool(exporting);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(Reads read, byte revision){
|
||||||
|
super.read(read, revision);
|
||||||
|
if(revision >= 1){
|
||||||
|
exporting = read.bool();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,6 +143,7 @@ public class PayloadMassDriver extends PayloadBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
Building link = world.build(this.link);
|
Building link = world.build(this.link);
|
||||||
boolean hasLink = linkValid();
|
boolean hasLink = linkValid();
|
||||||
|
|
||||||
@@ -233,7 +234,7 @@ public class PayloadMassDriver extends PayloadBlock{
|
|||||||
}
|
}
|
||||||
|
|
||||||
//align to shooter rotation
|
//align to shooter rotation
|
||||||
turretRotation = Angles.moveToward(turretRotation, tile.angleTo(currentShooter()), rotateSpeed * efficiency());
|
turretRotation = Angles.moveToward(turretRotation, angleTo(currentShooter()), rotateSpeed * efficiency());
|
||||||
}else if(state == shooting){
|
}else if(state == shooting){
|
||||||
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail
|
//if there's nothing to shoot at OR someone wants to shoot at this thing, bail
|
||||||
if(!hasLink || (!waitingShooters.isEmpty() && payload == null)){
|
if(!hasLink || (!waitingShooters.isEmpty() && payload == null)){
|
||||||
@@ -241,7 +242,7 @@ public class PayloadMassDriver extends PayloadBlock{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float targetRotation = tile.angleTo(link);
|
float targetRotation = angleTo(link);
|
||||||
boolean movedOut = false;
|
boolean movedOut = false;
|
||||||
|
|
||||||
payRotation = Angles.moveToward(payRotation, turretRotation, payloadRotateSpeed * delta());
|
payRotation = Angles.moveToward(payRotation, turretRotation, payloadRotateSpeed * delta());
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ public class PayloadSource extends PayloadBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
if(payload == null){
|
if(payload == null){
|
||||||
scl = 0f;
|
scl = 0f;
|
||||||
if(unit != null){
|
if(unit != null){
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ public class PayloadUnloader extends PayloadLoader{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
if(shouldExport()){
|
if(shouldExport()){
|
||||||
//one-use, disposable block
|
//one-use, disposable block
|
||||||
if(payload.block().instantDeconstruct){
|
if(payload.block().instantDeconstruct){
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ public class PayloadVoid extends PayloadBlock{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
|
super.updateTile();
|
||||||
if(moveInPayload(false) && cons.valid()){
|
if(moveInPayload(false) && cons.valid()){
|
||||||
payload = null;
|
payload = null;
|
||||||
incinerateEffect.at(this);
|
incinerateEffect.at(this);
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ public class ImpactReactor extends PowerGenerator{
|
|||||||
|
|
||||||
if(warmup < 0.3f || !state.rules.reactorExplosions) return;
|
if(warmup < 0.3f || !state.rules.reactorExplosions) return;
|
||||||
|
|
||||||
Sounds.explosionbig.at(tile);
|
Sounds.explosionbig.at(this);
|
||||||
|
|
||||||
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4);
|
Damage.damage(x, y, explosionRadius * tilesize, explosionDamage * 4);
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
|
|
||||||
public class NuclearReactorBuild extends GeneratorBuild{
|
public class NuclearReactorBuild extends GeneratorBuild{
|
||||||
public float heat;
|
public float heat;
|
||||||
|
public float flash;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
@@ -130,7 +131,7 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
public void onDestroyed(){
|
public void onDestroyed(){
|
||||||
super.onDestroyed();
|
super.onDestroyed();
|
||||||
|
|
||||||
Sounds.explosionbig.at(tile);
|
Sounds.explosionbig.at(this);
|
||||||
|
|
||||||
int fuel = items.get(consumes.<ConsumeItems>get(ConsumeType.item).items[0].item);
|
int fuel = items.get(consumes.<ConsumeItems>get(ConsumeType.item).items[0].item);
|
||||||
|
|
||||||
@@ -160,10 +161,9 @@ public class NuclearReactor extends PowerGenerator{
|
|||||||
Draw.rect(topRegion, x, y);
|
Draw.rect(topRegion, x, y);
|
||||||
|
|
||||||
if(heat > flashThreshold){
|
if(heat > flashThreshold){
|
||||||
float flash = 1f + ((heat - flashThreshold) / (1f - flashThreshold)) * 5.4f;
|
flash += (1f + ((heat - flashThreshold) / (1f - flashThreshold)) * 5.4f) * Time.delta;
|
||||||
flash += flash * Time.delta;
|
|
||||||
Draw.color(Color.red, Color.yellow, Mathf.absin(flash, 9f, 1f));
|
Draw.color(Color.red, Color.yellow, Mathf.absin(flash, 9f, 1f));
|
||||||
Draw.alpha(0.6f);
|
Draw.alpha(0.3f);
|
||||||
Draw.rect(lightsRegion, x, y);
|
Draw.rect(lightsRegion, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class PowerDiode extends Block{
|
|||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
super.updateTile();
|
super.updateTile();
|
||||||
|
|
||||||
if(front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return;
|
if(tile == null || front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return;
|
||||||
|
|
||||||
PowerGraph backGraph = back().power.graph;
|
PowerGraph backGraph = back().power.graph;
|
||||||
PowerGraph frontGraph = front().power.graph;
|
PowerGraph frontGraph = front().power.graph;
|
||||||
|
|||||||
@@ -444,7 +444,7 @@ public class PowerNode extends PowerBlock{
|
|||||||
public void draw(){
|
public void draw(){
|
||||||
super.draw();
|
super.draw();
|
||||||
|
|
||||||
if(Mathf.zero(Renderer.laserOpacity)) return;
|
if(Mathf.zero(Renderer.laserOpacity) || isPayload()) return;
|
||||||
|
|
||||||
Draw.z(Layer.power);
|
Draw.z(Layer.power);
|
||||||
setupColor(power.graph.getSatisfaction());
|
setupColor(power.graph.getSatisfaction());
|
||||||
|
|||||||
@@ -52,6 +52,11 @@ public class AttributeCrafter extends GenericCrafter{
|
|||||||
return baseEfficiency + Math.min(maxBoost, boostScale * attrsum) + attribute.env();
|
return baseEfficiency + Math.min(maxBoost, boostScale * attrsum) + attribute.env();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pickedUp(){
|
||||||
|
attrsum = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onProximityUpdate(){
|
public void onProximityUpdate(){
|
||||||
super.onProximityUpdate();
|
super.onProximityUpdate();
|
||||||
|
|||||||
@@ -243,6 +243,11 @@ public class Drill extends Block{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pickedUp(){
|
||||||
|
dominantItem = null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onProximityUpdate(){
|
public void onProximityUpdate(){
|
||||||
super.onProximityUpdate();
|
super.onProximityUpdate();
|
||||||
|
|||||||
@@ -91,6 +91,11 @@ public class Pump extends LiquidBlock{
|
|||||||
Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color);
|
Drawf.liquid(liquidRegion, x, y, liquids.currentAmount() / liquidCapacity, liquids.current().color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pickedUp(){
|
||||||
|
amount = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onProximityUpdate(){
|
public void onProximityUpdate(){
|
||||||
super.onProximityUpdate();
|
super.onProximityUpdate();
|
||||||
|
|||||||
@@ -95,6 +95,11 @@ public class SolidPump extends Pump{
|
|||||||
@Override
|
@Override
|
||||||
public void drawCracks(){}
|
public void drawCracks(){}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void pickedUp(){
|
||||||
|
boost = validTiles = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(){
|
public void draw(){
|
||||||
Draw.rect(region, x, y);
|
Draw.rect(region, x, y);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public class StorageBlock extends Block{
|
|||||||
solid = true;
|
solid = true;
|
||||||
update = false;
|
update = false;
|
||||||
destructible = true;
|
destructible = true;
|
||||||
|
separateItemCapacity = true;
|
||||||
group = BlockGroup.transportation;
|
group = BlockGroup.transportation;
|
||||||
flags = EnumSet.of(BlockFlag.storage);
|
flags = EnumSet.of(BlockFlag.storage);
|
||||||
allowResupply = true;
|
allowResupply = true;
|
||||||
|
|||||||
@@ -97,9 +97,9 @@ public class CommandCenter extends Block{
|
|||||||
float size = 6f;
|
float size = 6f;
|
||||||
|
|
||||||
Draw.color(bottomColor);
|
Draw.color(bottomColor);
|
||||||
Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy() - 1, size, size);
|
Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), x, y - 1, size, size);
|
||||||
Draw.color(topColor == null ? team.color : topColor);
|
Draw.color(topColor == null ? team.color : topColor);
|
||||||
Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy(), size, size);
|
Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), x, y, size, size);
|
||||||
Draw.color();
|
Draw.color();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -185,6 +185,12 @@ public class Reconstructor extends UnitBlock{
|
|||||||
Draw.rect(topRegion, x, y);
|
Draw.rect(topRegion, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object senseObject(LAccess sensor){
|
||||||
|
if(sensor == LAccess.config) return unit();
|
||||||
|
return super.senseObject(sensor);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateTile(){
|
public void updateTile(){
|
||||||
boolean valid = false;
|
boolean valid = false;
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ public class RepairPoint extends Block{
|
|||||||
multiplier = liq.valid(this) ? 1f + liquids.current().heatCapacity * coolantMultiplier : 1f;
|
multiplier = liq.valid(this) ? 1f + liquids.current().heatCapacity * coolantMultiplier : 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(target != null && (target.dead() || target.dst(tile) - target.hitSize/2f > repairRadius || target.health() >= target.maxHealth())){
|
if(target != null && (target.dead() || target.dst(this) - target.hitSize/2f > repairRadius || target.health() >= target.maxHealth())){
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ public class ConsumePower extends Consume{
|
|||||||
* @return The amount of power which is requested per tick.
|
* @return The amount of power which is requested per tick.
|
||||||
*/
|
*/
|
||||||
public float requestedPower(Building entity){
|
public float requestedPower(Building entity){
|
||||||
if(entity.tile().build == null) return 0f;
|
if(entity.tile == null || entity.tile.build == null) return 0f;
|
||||||
if(buffered){
|
if(buffered){
|
||||||
return (1f-entity.power.status)*capacity;
|
return (1f-entity.power.status)*capacity;
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@@ -16,6 +16,14 @@ public class Consumers{
|
|||||||
public final Bits itemFilters = new Bits(Vars.content.items().size);
|
public final Bits itemFilters = new Bits(Vars.content.items().size);
|
||||||
public final Bits liquidfilters = new Bits(Vars.content.liquids().size);
|
public final Bits liquidfilters = new Bits(Vars.content.liquids().size);
|
||||||
|
|
||||||
|
public boolean consumesItem(Item item){
|
||||||
|
return itemFilters.get(item.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean consumesLiquid(Liquid liq){
|
||||||
|
return liquidfilters.get(liq.id);
|
||||||
|
}
|
||||||
|
|
||||||
public boolean any(){
|
public boolean any(){
|
||||||
return results != null && results.length > 0;
|
return results != null && results.length > 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ import mindustry.graphics.*;
|
|||||||
public enum BlockStatus{
|
public enum BlockStatus{
|
||||||
active(Color.valueOf("5ce677")),
|
active(Color.valueOf("5ce677")),
|
||||||
noOutput(Color.orange),
|
noOutput(Color.orange),
|
||||||
noInput(Pal.remove);
|
noInput(Pal.remove),
|
||||||
|
logicDisable(Color.valueOf("8a73c6"));
|
||||||
|
|
||||||
public final Color color;
|
public final Color color;
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ public class ConsumeModule extends BlockModule{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public BlockStatus status(){
|
public BlockStatus status(){
|
||||||
|
if(entity.enabledControlTime > 0 && !entity.enabled){
|
||||||
|
return BlockStatus.logicDisable;
|
||||||
|
}
|
||||||
|
|
||||||
if(!entity.shouldConsume()){
|
if(!entity.shouldConsume()){
|
||||||
return BlockStatus.noOutput;
|
return BlockStatus.noOutput;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,4 +24,4 @@ android.useAndroidX=true
|
|||||||
#used for slow jitpack builds; TODO see if this actually works
|
#used for slow jitpack builds; TODO see if this actually works
|
||||||
org.gradle.internal.http.socketTimeout=100000
|
org.gradle.internal.http.socketTimeout=100000
|
||||||
org.gradle.internal.http.connectionTimeout=100000
|
org.gradle.internal.http.connectionTimeout=100000
|
||||||
archash=6c228e534e3950e6254d6e7af4c6db67f834bc1d
|
archash=a40808f513dd04b3f3877595456d7e112b5ae4bd
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 706 KiB |
|
Before Width: | Height: | Size: 905 KiB |
|
Before Width: | Height: | Size: 2.0 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 632 KiB |
|
Before Width: | Height: | Size: 2.1 MiB |
|
Before Width: | Height: | Size: 725 KiB |
|
Before Width: | Height: | Size: 598 KiB |
|
Before Width: | Height: | Size: 204 KiB |
@@ -117,6 +117,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "MindustryBR",
|
"name": "MindustryBR",
|
||||||
"address": ["mindustryptbr.ddns.net", "mindustryptbr.myddns.me"]
|
"address": ["mindustryptbr.ddns.net", "mindustryptbr.myddns.me", "mindustry.me:4447"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Conservatory",
|
||||||
|
"address": ["143.198.71.232"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -58,5 +58,13 @@
|
|||||||
{
|
{
|
||||||
"name": "Phoenix Network",
|
"name": "Phoenix Network",
|
||||||
"address": ["172.104.253.198"]
|
"address": ["172.104.253.198"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Pandorum",
|
||||||
|
"address": ["pandorum.su:5018", "pandorum.su:5019", "pandorum.su:5020"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "MindustryBR",
|
||||||
|
"address": ["mindustry.me:4451", "n2.mindustry.me:4446"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import mindustry.net.*;
|
|||||||
import mindustry.net.Packets.*;
|
import mindustry.net.Packets.*;
|
||||||
import mindustry.type.*;
|
import mindustry.type.*;
|
||||||
import mindustry.world.*;
|
import mindustry.world.*;
|
||||||
|
import mindustry.world.blocks.payloads.*;
|
||||||
import mindustry.world.blocks.storage.*;
|
import mindustry.world.blocks.storage.*;
|
||||||
import org.junit.jupiter.api.*;
|
import org.junit.jupiter.api.*;
|
||||||
import org.junit.jupiter.params.*;
|
import org.junit.jupiter.params.*;
|
||||||
@@ -791,6 +792,57 @@ public class ApplicationTests{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void checkPayloads(){
|
||||||
|
for(int x = 0; x < world.tiles.width; x++){
|
||||||
|
for(int y = 0; y < world.tiles.height; y++){
|
||||||
|
Tile tile = world.rawTile(x, y);
|
||||||
|
if(tile.build != null && tile.isCenter() && !(tile.block() instanceof CoreBlock)){
|
||||||
|
try{
|
||||||
|
tile.build.update();
|
||||||
|
}catch(Throwable t){
|
||||||
|
fail("Failed to update block in payload: '" + ((BuildPayload)tile.build.getPayload()).block() + "'", t);
|
||||||
|
}
|
||||||
|
assertEquals(tile.block(), tile.build.block);
|
||||||
|
assertEquals(tile.block().health, tile.build.health());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void allPayloadBlockTest(){
|
||||||
|
int ts = 20;
|
||||||
|
Tiles tiles = world.resize(ts * 3, ts * 3);
|
||||||
|
|
||||||
|
world.beginMapLoad();
|
||||||
|
for(int x = 0; x < tiles.width; x++){
|
||||||
|
for(int y = 0; y < tiles.height; y++){
|
||||||
|
tiles.set(x, y, new Tile(x, y, Blocks.stone, Blocks.air, Blocks.air));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tiles.getn(tiles.width - 2, tiles.height - 2).setBlock(Blocks.coreShard, Team.sharded);
|
||||||
|
|
||||||
|
Seq<Block> blocks = content.blocks().select(b -> b.canBeBuilt());
|
||||||
|
for(int i = 0; i < blocks.size; i++){
|
||||||
|
int x = (i % ts) * 3 + 1;
|
||||||
|
int y = (i / ts) * 3 + 1;
|
||||||
|
Tile tile = tiles.get(x, y);
|
||||||
|
tile.setBlock(Blocks.payloadConveyor, Team.sharded);
|
||||||
|
Building build = tile.build;
|
||||||
|
build.handlePayload(build, new BuildPayload(blocks.get(i), Team.sharded));
|
||||||
|
}
|
||||||
|
world.endMapLoad();
|
||||||
|
|
||||||
|
checkPayloads();
|
||||||
|
|
||||||
|
SaveIO.write(saveDirectory.child("payloads.msav"));
|
||||||
|
logic.reset();
|
||||||
|
SaveIO.load(saveDirectory.child("payloads.msav"));
|
||||||
|
|
||||||
|
checkPayloads();
|
||||||
|
}
|
||||||
|
|
||||||
@TestFactory
|
@TestFactory
|
||||||
DynamicTest[] testSectorValidity(){
|
DynamicTest[] testSectorValidity(){
|
||||||
Seq<DynamicTest> out = new Seq<>();
|
Seq<DynamicTest> out = new Seq<>();
|
||||||
|
|||||||
@@ -477,8 +477,8 @@ public class Generators{
|
|||||||
Pixmap baseCell = get(type.cellRegion);
|
Pixmap baseCell = get(type.cellRegion);
|
||||||
Pixmap cell = baseCell.copy();
|
Pixmap cell = baseCell.copy();
|
||||||
|
|
||||||
//replace with 0xffd37fff : 0xdca463ff for sharded colors?
|
//replace with 0xffd37fff : 0xdca463ff for sharded colors?
|
||||||
cell.replace(in -> in == 0xffffffff ? 0xffa664ff : in == 0xdcc6c6ff ? 0xd06b53ff : 0);
|
cell.replace(in -> in == 0xffffffff ? 0xffa664ff : in == 0xdcc6c6ff || in == 0xdcc5c5ff ? 0xd06b53ff : 0);
|
||||||
|
|
||||||
image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2, true);
|
image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2, true);
|
||||||
}
|
}
|
||||||
|
|||||||