diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 9612018e7b..3b859e3436 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -101,6 +101,8 @@ public class EntityProcess extends BaseProcessor{ inter.addJavadoc("Interface for {@link $L}", component.fullName()); + skipDeprecated(inter); + //implement extra interfaces these components may have, e.g. position for(Stype extraInterface : component.interfaces().select(i -> !isCompInterface(i))){ //javapoet completely chokes on this if I add `addSuperInterface` or create the type name with TypeName.get @@ -570,6 +572,8 @@ public class EntityProcess extends BaseProcessor{ .returns(tname(packageName + "." + name)) .addStatement(ann.pooled() ? "return Pools.obtain($L.class, " +name +"::new)" : "return new $L()", name).build()); + skipDeprecated(builder); + definitions.add(new EntityDefinition(packageName + "." + name, builder, type, typeIsBase ? null : baseClass, components, groups, allFieldSpecs, legacy)); } @@ -837,6 +841,8 @@ public class EntityProcess extends BaseProcessor{ TypeSpec.Builder nullBuilder = TypeSpec.classBuilder(className) .addModifiers(Modifier.FINAL); + skipDeprecated(nullBuilder); + nullBuilder.addSuperinterface(interf.tname()); if(superclass != null) nullBuilder.superclass(tname(baseName(superclass))); @@ -980,6 +986,11 @@ public class EntityProcess extends BaseProcessor{ throw new IllegalArgumentException("Missing types."); } + void skipDeprecated(TypeSpec.Builder builder){ + //deprecations are irrelevant in generated code + builder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"deprecation\"").build()); + } + class GroupDefinition{ final String name; final ClassName baseType; diff --git a/build.gradle b/build.gradle index 08aed65042..f9d2cf3568 100644 --- a/build.gradle +++ b/build.gradle @@ -41,8 +41,8 @@ buildscript{ } plugins{ - id 'org.jetbrains.kotlin.jvm' version '1.4.32' - id "org.jetbrains.kotlin.kapt" version "1.4.32" + id 'org.jetbrains.kotlin.jvm' version '1.5.21' + id "org.jetbrains.kotlin.kapt" version "1.5.21" } allprojects{ @@ -219,10 +219,16 @@ allprojects{ options.compilerArgs += ["-Xlint:deprecation"] dependsOn clearCache - options.forkOptions.jvmArgs.addAll([ + options.forkOptions.jvmArgs += [ + '--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED', '--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', - '--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED' - ]) + '--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED', + '--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED', + '--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED', + '--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED', + '--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', + '--add-opens=java.base/sun.reflect.annotation=ALL-UNNAMED' + ] } } diff --git a/core/assets-raw/sprites/units/weapons/repair-beam-weapon-center-large.png b/core/assets-raw/sprites/units/weapons/repair-beam-weapon-center-large.png new file mode 100644 index 0000000000..2053dbbe2c Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/repair-beam-weapon-center-large.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 535f5a8965..7479623f14 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -93,6 +93,7 @@ level.mode = Gamemode: coreattack = < Core is under attack! > nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent database = Core Database +database.button = Database savegame = Save Game loadgame = Load Game joingame = Join Game @@ -168,6 +169,7 @@ launchcore = Launch Core filename = File Name: unlocked = New content unlocked! available = New research available! +unlock.incampaign = < Unlock in campaign for details > completed = [accent]Completed techtree = Tech Tree research.legacy = [accent]5.0[] research data found.\nDo you want to [accent]load this data[], or [accent]discard it[] and restart research in the new campaign (recommended)? @@ -777,7 +779,7 @@ bar.corereq = Core Base Required bar.drillspeed = Drill Speed: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Efficiency: {0}% -bar.boost = Boost: {0}% +bar.boost = Boost: +{0}% bar.powerbalance = Power: {0}/s bar.powerstored = Stored: {0}/{1} bar.poweramount = Power: {0} diff --git a/core/assets/bundles/bundle_bg.properties b/core/assets/bundles/bundle_bg.properties index d9c9dbc9f9..9a49d9eb92 100644 --- a/core/assets/bundles/bundle_bg.properties +++ b/core/assets/bundles/bundle_bg.properties @@ -751,7 +751,7 @@ bar.corereq = Необходимо е Ядро за основа bar.drillspeed = Скорост на свредлото: {0}/сек bar.pumpspeed = Скорост на помпата: {0}/сек bar.efficiency = Ефективност: {0}% -bar.boost = Усилване: {0}% +bar.boost = Усилване: +{0}% bar.powerbalance = Електроенергия: {0}/сек bar.powerstored = Съхранена енергия: {0}/{1} bar.poweramount = Електроенергия: {0} diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 55f13ee6a1..e88115e724 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -772,7 +772,7 @@ bar.corereq = Kern-Basis erforderlich bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.pumpspeed = Pumpengeschwindigkeit: {0}/s bar.efficiency = Effizienz: {0}% -bar.boost = Beschleunigung: {0}% +bar.boost = Beschleunigung: +{0}% bar.powerbalance = Strom: {0}/s bar.powerstored = Gespeichert: {0}/{1} bar.poweramount = Strom: {0} @@ -1739,4 +1739,4 @@ lenum.mine = Erz von einer Position abbauen. lenum.build = Einen Block bauen. lenum.getblock = Gibt den Blocktyp an den Koordinaten zurück.\nEinheiten müssen nah genug dran sein.\nFeste nicht-Blöcke sind [accent]@solid[]. lenum.within = Prüft, ob eine Einheit in einem Radius um einen Punkt ist. -lenum.boost = Aktiviert / deaktiviert den Boost. \ No newline at end of file +lenum.boost = Aktiviert / deaktiviert den Boost. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 2fb0b33c5c..415beafdb2 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -78,13 +78,12 @@ schematic.tagexists = Ce mot-clé existe déjà. stats = Statistiques stat.wave = Vagues vaincues : [accent] {0} +stat.unitsCreated = Unités créées :[accent] {0} stat.enemiesDestroyed = Ennemis détruits : [accent] {0} stat.built = Bâtiments construits : [accent] {0} stat.destroyed = Bâtiments détruits : [accent] {0} stat.deconstructed = Bâtiments déconstruits : [accent] {0} -stat.delivered = Ressources transférées : stat.playtime = Temps de jeu : [accent] {0} -stat.rank = Rang Final : [accent]{0} globalitems = [accent]Ressources globales map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]" ? @@ -215,7 +214,7 @@ hosts.none = [lightgray]Aucune partie en LAN trouvée ! host.invalid = [scarlet]Impossible de se connecter à l'hôte. servers.local = Serveurs locaux -servers.local.steam = Open Games & Serveurs Locaux +servers.local.steam = Jeux Libres & Serveurs Locaux servers.remote = Serveurs distants servers.global = Serveurs communautaires @@ -317,7 +316,7 @@ data.invalid = Ce ne sont pas des données de jeu valides. data.import.confirm = L'importation des données externes va effacer[scarlet] toutes[] vos données de jeu actuelles.\n[accent]Ceci ne pourra pas être annulé ![]\n\nUne fois les données importées, le jeu se fermera immédiatement. quit.confirm = Êtes-vous sûr de vouloir quitter ? loading = [accent]Chargement... -reloading = [accent]Rechargement des Mods... +downloading = [accent]Téléchargement... saving = [accent]Sauvegarde... respawn = [accent][[{0}][] pour réapparaître dans le Noyau cancelbuilding = [accent][[{0}][] pour effacer le plan @@ -385,6 +384,7 @@ waves.waves = vague(s) waves.perspawn = par apparition waves.shields = boucliers/vague waves.to = à +waves.max = Unités maximum waves.guardian = Gardien waves.preview = Prévisualiser waves.edit = Modifier... @@ -539,6 +539,7 @@ configure = Modifier le chargement loadout = Chargement resources = Ressources bannedblocks = Blocs bannis +bannedunits = Unités bannies addall = Ajouter TOUT launch.from = Décollage depuis : [accent]{0} launch.destination = Destination: {0} @@ -649,6 +650,7 @@ status.overclock.name = Surcadençage status.shocked.name = Étourdie status.blasted.name = Foudroyé status.unmoving.name = Immobilisé +status.boss.name = Gardien settings.language = Langage settings.data = Données du Jeu @@ -773,7 +775,7 @@ bar.corereq = Noyau de base requis bar.drillspeed = Vitesse de Forage: {0}/s bar.pumpspeed = Vitesse de Pompage: {0}/s bar.efficiency = Efficacité: {0}% -bar.boost = Boost: {0}% +bar.boost = Boost: +{0}% bar.powerbalance = Énergie: {0}/s bar.powerstored = Réserves d'Énergie: {0}/{1} bar.poweramount = Énergie: {0} @@ -838,6 +840,7 @@ category.crafting = Fabrication category.function = Fonction category.optional = Améliorations facultatives +setting.skipcoreanimation.name = Ignorer l'animation du lancement du noyau et de l'atterrissage setting.landscape.name = Verrouiller la rotation en mode paysage setting.shadows.name = Ombres setting.blockreplace.name = Suggestion automatique des Blocs @@ -878,6 +881,7 @@ setting.seconds = {0} secondes setting.milliseconds = {0} millisecondes setting.fullscreen.name = Plein Écran setting.borderlesswindow.name = Fenêtré sans bordures +setting.borderlesswindow.name.windows = Plein écran sans bordure setting.borderlesswindow.description = Un redémarrage peut être nécessaire pour appliquer les changements. setting.fps.name = Afficher FPS et Ping setting.smoothcamera.name = Lissage de la Caméra @@ -1111,7 +1115,6 @@ unit.reign.name = Éradicateur unit.vela.name = Vela unit.corvus.name = Corvus -block.resupply-point.name = Point de Rechargement block.parallax.name = Parallax block.cliff.name = Falaise block.sand-boulder.name = Bloc de Sable @@ -1414,8 +1417,7 @@ liquid.slag.description = Différents types de métaux en fusion mélangés. Peu liquid.oil.description = Un liquide utilisé dans la production de matériaux avancés. Peut être transformé en charbon ou pulvérisé sur les ennemis, puis enflammé. liquid.cryofluid.description = Un liquide inerte, non corrosif, créé à partir d’eau et de titane. Possède une capacité d'absorption de chaleur extrêmement élevée. Largement utilisé comme liquide de refroidissement. -block.derelict = [lightgray] Vestiges -block.resupply-point.description = Approvisionne les unités proches en munitions. Pas compatible avec celles qui ont besoin d'énergie pour tirer. +block.derelict =  [lightgray]Vestiges block.illuminator.description = Une petite source lumineuse compacte et configurable. Nécessite de l'énergie pour fonctionner. block.armored-conveyor.description = Déplace les objets à la même vitesse que les convoyeurs en titane, mais est plus résistant. Seulement d'autres convoyeurs peuvent faire entrer des ressources par ses côtés. block.message.description = Enregistre un message. Utilisé pour la communication entre alliés. Le message contenu peut être modifié par un processeur logique. @@ -1441,6 +1443,8 @@ block.item-source.description = Produit des objets à l'infini. Bac à sable uni block.item-void.description = Désintègre n'importe quel objet qui va à l'intérieur. Bac à sable uniquement. block.liquid-source.description = Source de liquide infinie. Bac à sable uniquement. block.liquid-void.description = Détruit n'importe quel liquide. Bac à sable uniquement. +block.payload-source.description = Produit des charges utiles à l'infini. Bac à sable uniquement. +block.payload-void.description = Détruit toutes les charges utiles. Bac à sable uniquement. block.copper-wall.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues. block.copper-wall-large.description = Un bloc défensif à faible coût.\nUtile pour protéger la base et les tourelles lors des premières vagues. block.titanium-wall.description = Un bloc défensif standard.\nProcure une protection modérée contre les attaques ennemies. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index c7cee9bc4e..e2fe343582 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -725,7 +725,7 @@ bar.corereq = Core Base Required bar.drillspeed = Kitermelés: {0}/s bar.pumpspeed = Kitermelés: {0}/s bar.efficiency = Hatékonyság: {0}% -bar.boost = Boost: {0}% +bar.boost = Boost: +{0}% bar.powerbalance = Áram: {0}/s bar.powerstored = Tárolt: {0}/{1} bar.poweramount = Áram: {0} diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 5c9e031a14..31f14f2df7 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -773,7 +773,7 @@ bar.corereq = Memerlukan Inti Dasar bar.drillspeed = Kecepatan Bor: {0}/s bar.pumpspeed = Kecepatan Pompa: {0}/s bar.efficiency = Daya Guna: {0}% -bar.boost = Percepatan: {0}% +bar.boost = Percepatan: +{0}% bar.powerbalance = Tenaga: {0}/s bar.powerstored = Disimpan: {0}/{1} bar.poweramount = Tenaga: {0} diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index e827f89aeb..6f4b586f0e 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -78,13 +78,12 @@ schematic.tagexists = このタグはすでに存在します。 stats = Stats stat.wave = 防衛したウェーブ:[accent] {0} +stat.unitsCreated = 生産ユニット数:[accent] {0} stat.enemiesDestroyed = 敵に破壊された数:[accent] {0} stat.built = 建設した建造物数:[accent] {0} stat.destroyed = 破壊した建造物数:[accent] {0} stat.deconstructed = 解体した建造物数:[accent] {0} -stat.delivered = 獲得した資源: stat.playtime = プレイ時間:[accent] {0} -stat.rank = 最終ランク: [accent]{0} globalitems = [accent]グローバルアイテム map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? @@ -93,7 +92,7 @@ level.select = レベル選択 level.mode = ゲームモード: coreattack = < コアが攻撃を受けています! > nearpoint = [[ [scarlet]直ちに出現ポイントより離脱せよ[] ]\n殲滅されます -database = コアデーターベース +database = コアデータベース savegame = 保存 loadgame = 読み込む joingame = マルチプレイ @@ -385,6 +384,7 @@ waves.waves = ごとに出現 waves.perspawn = 体出現 waves.shields = シールド/ウェーブ waves.to = から +waves.max = 最大ユニット数 waves.guardian = ガーディアン waves.preview = プレビュー waves.edit = 編集... @@ -652,6 +652,7 @@ status.overclock.name = オーバークロック status.shocked.name = 電撃 status.blasted.name = 爆破 status.unmoving.name = 移動阻止 +status.boss.name = ガーディアン settings.language = 言語 settings.data = ゲームデータ @@ -776,7 +777,7 @@ bar.corereq = コアベースが必要 bar.drillspeed = 採掘速度: {0}/秒 bar.pumpspeed = ポンプの速度: {0}/s bar.efficiency = 効率: {0}% -bar.boost = ブースト: {0}% +bar.boost = ブースト: +{0}% bar.powerbalance = 電力均衡: {0}/秒 bar.powerstored = 総蓄電量: {0}/{1} bar.poweramount = 蓄電量: {0} @@ -937,7 +938,7 @@ keybind.move_y.name = 上下移動 keybind.mouse_move.name = マウスを追う keybind.pan.name = 視点移動 keybind.boost.name = ブースト -keybind.schematic_select.name = 地域の選択 +keybind.schematic_select.name = 範囲選択 keybind.schematic_menu.name = 設計図メニュー keybind.schematic_flip_x.name = 設計図をX座標で反転 keybind.schematic_flip_y.name = 設計図をY座標で反転 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index bd9c7bd3a8..b764582e5a 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -78,13 +78,12 @@ schematic.tagexists = 이 태그는 이미 존재합니다. stats = 전투 결과 stat.wave = 패배한 단계:[accent] {0} +stat.unitsCreated = 생성한 유닛:[accent] {0} stat.enemiesDestroyed = 파괴된 적:[accent] {0} stat.built = 지어진 건물: [accent]{0} stat.destroyed = 파괴된 건물: [accent]{0} stat.deconstructed = 해체된 건물: [accent]{0} -stat.delivered = 얻은 자원: stat.playtime = 플레이 시간: [accent] {0} -stat.rank = 최종 순위: [accent]{0} globalitems = [accent]전체 자원 map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? @@ -385,6 +384,7 @@ waves.waves = 단계마다 waves.perspawn = 마리씩 생성됨 waves.shields = 방어막 hp/단계 waves.to = 부터 +waves.max = 최대 유닛 수 waves.guardian = 수호자 waves.preview = 미리보기 waves.edit = 편집 @@ -777,7 +777,7 @@ bar.corereq = 기본 코어 필요 bar.drillspeed = 드릴 속도: {0}/s bar.pumpspeed = 펌프 속도: {0}/s bar.efficiency = 효율: {0}% -bar.boost = 가속: {0}% +bar.boost = 가속: +{0}% bar.powerbalance = 전력: {0}/s bar.powerstored = 저장량: {0}/{1} bar.poweramount = 전력: {0} @@ -1432,13 +1432,15 @@ block.separator.description = 광재를 광물들로 분리합니다. block.spore-press.description = 포자를 석유로 압축합니다. block.pulverizer.description = 고철을 갈아 모래로 만듭니다. block.coal-centrifuge.description = 석유에서 석탄을 추출합니다. -block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. -block.power-void.description = 입력된 모든 전력을 무효로 합니다. 샌드박스 전용. -block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. -block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. -block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. +block.incinerator.description = 들어오는 모든 자원과 액체를 소각시킵니다. +block.power-void.description = 전력을 제거합니다. 샌드박스 전용. +block.power-source.description = 전력을 무한히 출력합니다. 샌드박스 전용. +block.item-source.description = 자원을 무한히 출력합니다. 샌드박스 전용. +block.item-void.description = 자원을 제거합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. +block.payload-source.description = 화물을 무한히 출력합니다. 샌드박스 전용. +block.payload-void.description = 화물을 제거합니다. 샌드박스 전용. block.copper-wall.description = 저렴한 수비 블록.\n초반 단계에서 코어와 포탑을 보호하는 데 유용합니다. block.copper-wall-large.description = 저렴한 수비 블록.\n초반 단계에서 코어와 포탑을 보호하는 데 유용합니다.\n여러 타일을 차지합니다. block.titanium-wall.description = 적당히 강한 방어 블록.\n적에게서 적절한 보호를 제공합니다. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 38d2bfbcbe..8539ca93bf 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -762,7 +762,7 @@ bar.corereq = Wymagany Rdzeń bar.drillspeed = Prędkość wiertła: {0}/s bar.pumpspeed = Prędkość pompy: {0}/s bar.efficiency = Efektywność: {0}% -bar.boost = Przyspieszenie: {0}% +bar.boost = Przyspieszenie: +{0}% bar.powerbalance = Moc: {0} bar.powerstored = Zmagazynowano: {0}/{1} bar.poweramount = Moc: {0} diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties index 267348a400..88f9784dc1 100644 --- a/core/assets/bundles/bundle_ro.properties +++ b/core/assets/bundles/bundle_ro.properties @@ -78,13 +78,12 @@ schematic.tagexists = Acea etichetă există deja. stats = Informații stat.wave = Valuri Învinse:[accent] {0} +stat.unitsCreated = Unități Create:[accent] {0} stat.enemiesDestroyed = Inamici Distruși:[accent] {0} stat.built = Structuri Construite:[accent] {0} stat.destroyed = Structuri Distruse:[accent] {0} stat.deconstructed = Structuri Deconstruite:[accent] {0} -stat.delivered = Resurse Lansate: stat.playtime = Timp Joc:[accent] {0} -stat.rank = Rang Final: [accent]{0} globalitems = [accent]Materiale Totale map.delete = Sigur vrei să ștergi harta "[accent]{0}[]"? @@ -94,6 +93,7 @@ level.mode = Mod de Joc: coreattack = < Nucleul este atacat! > nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare imminentă database = Datele Nucleului +database.button = Bază de date savegame = Salvează Jocul loadgame = Încarcă Jocul joingame = Intră în Joc @@ -385,6 +385,7 @@ waves.waves = val(uri) waves.perspawn = per apariție waves.shields = scuturi/val waves.to = până la +waves.max = unități maxime waves.guardian = Gardian waves.preview = Previzualizare waves.edit = Editează... @@ -652,6 +653,7 @@ status.overclock.name = Suprasolicitat status.shocked.name = Electrocutat status.blasted.name = Explozie status.unmoving.name = Nemișcat +status.boss.name = Gardian settings.language = Limbă settings.data = Datele Jocului @@ -776,7 +778,7 @@ bar.corereq = Plasare pe Nucleu Necesară bar.drillspeed = Viteză Minare: {0}/s bar.pumpspeed = Viteză Pompare: {0}/s bar.efficiency = Eficiență: {0}% -bar.boost = Efect Grăbire: {0}% +bar.boost = Efect Grăbire: +{0}% bar.powerbalance = Electricitate: {0}/s bar.powerstored = Stocată: {0}/{1} bar.poweramount = Electricitate: {0} @@ -1339,7 +1341,7 @@ block.memory-bank.name = Bancă de Memorie team.blue.name = Albastru team.crux.name = Agresor team.sharded.name = Portocaliu -team.derelict.name = Abandonat +team.derelict.name = Ruină team.green.name = Verde team.purple.name = Mov @@ -1360,7 +1362,7 @@ hint.placeTurret = Construiește \uf861 [accent]Arme[] pt a-ți apăra baza de i hint.breaking = Ține apăsat [accent]click-dreapta[] și trage pe ecran pt a distruge blocuri. hint.breaking.mobile = Activează \ue817 [accent]ciocanul[] din dreapta-jos și dă click pt a distruge blocuri.\n\nȚine apăsat cu degetul pt o secundă și trage pt a distruge mai multe blocuri deodată. hint.blockInfo = Poți vedea informații despre un bloc selectându-l în [accent]meniul de construcție[] și dând click pe butonul [accent][[?][] din dreapta. -hint.derelict = [accent]Structurile abandonate[] sunt rămășițe stricate ale bazelor vechi care nu mai funcționează.\n\nAceste structuri pot fi [accent]deconstruite[] pt resurse. +hint.derelict = [accent]Ruinele[] sunt rămășițe deteriorate ale bazelor vechi care nu mai funcționează.\n\nAceste structuri pot fi [accent]deconstruite[] pt resurse. hint.research = Folosește butonul \ue875 [accent]Cercetează[] pt a cerceta noi tehnologii. hint.research.mobile = Folosește butonul \ue875 [accent]Cercetează[] din \ue88c [accent]Meniu[] pt a cerceta noi tehnologii. hint.unitControl = Ține apăsat [accent][[Ctrl][] și [accent]dă click[] pt a controla unități aliate sau arme. @@ -1412,7 +1414,7 @@ liquid.slag.description = Rafinată înapoi în materialele constituente cu ajut liquid.oil.description = Folosit în producerea avansată de materiale și ca muniție incendiară. liquid.cryofluid.description = Folosit ca răcitor în reactoare, arme și fabrici. -block.derelict =  [lightgray]Structură Abandonată +block.derelict =  [lightgray]Ruină block.armored-conveyor.description = Transportă materialele înainte. Nu acceptă materiale de pe lateral decât de la alte benzi. block.illuminator.description = Emite lumină. block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați. @@ -1438,6 +1440,8 @@ block.item-source.description = Generează materiale la infinit. Doar în modul block.item-void.description = Distruge orice material. Doar în modul sandbox. block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox. block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox. +block.payload-source.description = Generează încărcături la infinit. Doar în modul sandbox. +block.payload-void.description = Distruge orice încărcătură. Doar în modul sandbox. block.copper-wall.description = Protejează clădirile de proiectilele inamice. block.copper-wall-large.description = Protejează clădirile de proiectilele inamice. block.titanium-wall.description = Protejează clădirile de proiectilele inamice. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index d72304ef21..b846e94512 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -94,6 +94,7 @@ level.mode = Режим игры: coreattack = < Ядро находится под атакой! > nearpoint = [[ [scarlet]ПОКИНЬТЕ ТОЧКУ ВЫСАДКИ НЕМЕДЛЕННО[] ]\nаннигиляция неизбежна database = База данных ядра +database.button = База данных savegame = Сохранить игру loadgame = Загрузить игру joingame = Сетевая игра @@ -770,7 +771,7 @@ bar.corereq = Требуется основа ядра bar.drillspeed = Скорость бурения: {0}/с bar.pumpspeed = Скорость выкачивания: {0}/с bar.efficiency = Эффективность: {0}% -bar.boost = Ускорение: {0}% +bar.boost = Ускорение: +{0}% bar.powerbalance = Энергия: {0}/с bar.powerstored = Накоплено: {0}/{1} bar.poweramount = Энергия: {0} diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index d02eb3976f..7b0728708b 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -78,13 +78,12 @@ schematic.tagexists = แท็กนี้มีอยู่แล้ว stats = สถิติ stat.wave = จำนวนคลื่นที่อยู่รอด:[accent] {0} +stat.unitsCreated = จำนวนยูนิตที่สร้าง:[accent] {0} stat.enemiesDestroyed = จำนวนศัตรูที่ทำลาย:[accent] {0} stat.built = จำนวนสิ่งก่อสร้างที่สร้าง:[accent] {0} stat.destroyed = จำนวนสิ่งก่อสร้างที่ถูกทำลาย:[accent] {0} stat.deconstructed = จำนวนสิ่งก่อสร้างที่ลบไป:[accent] {0} -stat.delivered = ทรัพยากรที่ส่งไป: stat.playtime = ระยะเวลาที่เล่นไป:[accent] {0} -stat.rank = ระดับ: [accent]{0} globalitems = [accent]ไอเท็มทั้งหมด map.delete = คุณแน่ใจหรือว่าจะลบแมพ "[accent]{0}[]"? @@ -94,6 +93,7 @@ level.mode = เกมโหมด: coreattack = < แกนกลางถูกโจมตี! > nearpoint = [[ [scarlet]ออกจากจุดเกิดด่วน![] ]\nการทำลายล้างกำลังใกล้เข้ามา database = ฐานข้อมูลแกนกลาง +database.button = ฐานข้อมูล savegame = เซฟเกม loadgame = โหลดเกม joingame = เข้าร่วมเกม @@ -296,8 +296,8 @@ save.playtime = เวลาที่เล่นไป: {0} warning = คำเตือน confirm = ตกลง delete = ลบ -view.workshop = เปิดในเวิร์คช็อป -workshop.listing = แก้ไขหน้ารายการเวิร์คช็อป +view.workshop = เปิดในเวิร์กช็อป +workshop.listing = แก้ไขหน้ารายการเวิร์กช็อป ok = โอเค open = เปิด customize = ตั้งค่ากฎ @@ -336,8 +336,8 @@ wave.enemies = ศัตรูคงเหลือ [lightgray]{0} [accent]ต wave.enemycores = แกนกลางศัตรูเหลือ [accent]{0}[lightgray] แกน wave.enemycore = [accent]{0}[lightgray] แกนกลางศัตรู wave.enemy = ศัตรูคงเหลือ [lightgray]{0} [accent]ตัว -wave.guardianwarn = การ์เดียนจะปรากฏตัวในอีก [accent]{0}[] คลื่น! -wave.guardianwarn.one = การ์เดียนจะปรากฏตัวในอีก [accent]{0}[] คลื่น! เตรียมตัวให้พร้อม! +wave.guardianwarn = ผู้พิทักษ์จะปรากฏตัวในอีก [accent]{0}[] คลื่น! +wave.guardianwarn.one = ผู้พิทักษ์จะปรากฏตัวในอีก [accent]{0}[] คลื่น! เตรียมตัวให้พร้อม! loadimage = โหลดรูป saveimage = เซฟรูป unknown = ไม่ทราบ @@ -374,10 +374,10 @@ editor.waves = คลื่น: editor.rules = กฎ: editor.generation = เจนเนอเรชั่น: editor.ingame = แก้ไขในเกม -editor.publish.workshop = เผยแพร่บนเวิร์คช็อป +editor.publish.workshop = เผยแพร่บนเวิร์กช็อป editor.newmap = แมพใหม่ editor.center = ศูนย์กลางแมพ -workshop = เวิร์คช็อป +workshop = เวิร์กช็อป waves.title = คลื่น waves.remove = ลบ waves.every = ทุกๆ @@ -385,7 +385,8 @@ waves.waves = คลื่น waves.perspawn = ต่อการเกิด waves.shields = เกราะ/คลื่น waves.to = ถึง -waves.guardian = การ์เดียน +waves.max = ยูนิตสูงสุด +waves.guardian = ผู้พิทักษ์ waves.preview = พรีวิว waves.edit = แก้ไข... waves.copy = คัดลอกไปยังคลิปบอร์ด @@ -545,7 +546,7 @@ launch.from = ลงจอดจากเซ็กเตอร์: [accent]{0} launch.destination = จุดหมายปลายทาง: {0} configure.invalid = จำนวนต้องอยู่ระหว่าง 0 ถึง {0} add = เพิ่ม... -guardian = การ์เดียน +guardian = ผู้พิทักษ์ connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0} error.unreachable = เซิร์ฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง? @@ -652,6 +653,7 @@ status.overclock.name = โอเวอร์คล็อก status.shocked.name = ช็อก status.blasted.name = ระเบิด status.unmoving.name = หยุดนิ่ง +status.boss.name = ผู้พิทักษ์ settings.language = ภาษา settings.data = ข้อมูลเกม @@ -776,7 +778,7 @@ bar.corereq = ต้องวางบนแกนกลาง bar.drillspeed = ความเร็วการขุด: {0}/วิ bar.pumpspeed = ความเร็วการปั้ม: {0}/วิ bar.efficiency = ประสิทธิภาพ: {0}% -bar.boost = เปอร์เซ็นการเร่ง: {0}% +bar.boost = เปอร์เซ็นการเร่ง: +{0}% bar.powerbalance = พลังงาน: {0}/วิ bar.powerstored = เก็บแล้ว: {0}/{1} bar.poweramount = พลังงาน: {0} @@ -1379,7 +1381,7 @@ hint.payloadDrop = กด [accent]][] เพื่อปล่อยสิ่ง hint.payloadDrop.mobile = [accent]กดค้างไว้[]ที่พื้นที่โล่งๆ เพื่อปล่อยสิ่งที่บรรทุกอยู่ hint.waveFire = ป้อมปืน[accent]คลื่นน้ำ[]หากเติมน้ำเข้าไปจะช่วยดับไฟรอบข้างให้อัตโนมัติ hint.generator = \uf879 [accent]เครื่องกำเนิดไฟฟ้าเผาไหม้[]จะเผาถ่านและส่งพลังงานไปยังบล็อกที่อยู่ใกล้ๆ\n\nระยะของพลังงานสามารถขยายได้ด้วย \uf87f [accent]ตัวจ่ายพลังงาน[] -hint.guardian = หน่วย[accent]การ์เดียน[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายการ์เดียน +hint.guardian = หน่วย[accent]ผู้พิทักษ์[]มีเกราะป้องกันหนาแน่น กระสุนเปราะบางอย่าง[accent]ทองแดง[]และ[accent]ตะกั่ว[][scarlet]ไม่มีประสิทธิภาพ[]\n\nควรใช้ป้อมปืนที่ดีกว่านี้หรือใช้ \uf835 [accent]กราไฟท์[]ใส่ใน \uf861 ดูโอ/ \uf859 ซัลโวเป็นกระสุนเพื่อทำลายผู้พิทักษ์ hint.coreUpgrade = สามารถอัปเกรดแกนกลางได้โดย[accent]วางแกนกลางที่ใหญ่กว่าทับมัน[]\n\nวาง  [accent]แกนกลาง: ฟาวน์เดชั่น[]ทับ  [accent]แกนกลาง: ชาร์ด[] ต้องแน่ใจว่ารอบข้างมีที่ว่างก่อนจะวาง hint.presetLaunch = [accent]เซ็กเตอร์ลงจอด[]สีเทา อย่างเช่น[accent]ป่าหนาวเหน็บ[] สามารถลงจอดจากที่ไหนที่ได้ในแผนที่ พวกนั้นไม่จำเป็นต้องยืดครองเซ็กเตอร์รอบข้างเพื่อส่งแกนกลางไป\n\n[accent]เซ็กเตอร์ที่มีเลข[] อย่างเช่นอันนี้[accent]ไม่จำเป็น[]ต้องยืดครอง hint.coreIncinerate = เมื่อแกนกลางมีจำนวนไอเท็มชนิดหนึ่งที่เต็ม ไอเท็มชนิดนั้นที่เข้ามาเพิ่มจะ[accent]ถูกเผา[] @@ -1603,7 +1605,7 @@ unit.mega.description = ซ่อมแซมสิ่งก่อสร้า unit.quad.description = ทิ้งระเบิดขนาดใหญ่ลงบนเป้าหมายพื้นดิน ซ่อมแซมสิ่งก่อสร้างของพวกพ้องและสร้างความเสียหายแก่ศัตรู สามารถบรรทุกยูนิตพื้นดินขนาดกลางได้ unit.oct.description = ปกป้องพวกพ้องที่อยู่ใกล้เคียงด้วยโล่พลังงาน สามารถบรรทุกยูนิตภาคพื้นดินได้แทบทุกตัว unit.risso.description = ยิงขีปนาวุธและสาดกระสุนจำนวนมากใส่ศัตรูใกล้เคียง -unit.minke.description = ยิงกระสุนหนักและกระสุนธรรมดาไปยังเป้าหมายพื้นดินที่อยู่ใกล้เคียง\nให้สถานะ[accent]โอเวอร์คล็อก[]แก่พวกพ้องรอบข้าง ทำให้ยิงเร็วและแรงขึ้น +unit.minke.description = ยิงทั้งกระสุนหนักและกระสุนธรรมดาไปยังเป้าหมายพื้นดินที่อยู่ใกล้เคียง unit.bryde.description = ยิงกระสุนปืนใหญ่พิสัยไกลและขีปนาวุธติดตามตัวใส่ศัตรู unit.sei.description = ยิงขีปนาวุธติดตามตัวและกระสุนเจาะเกราะใส่ศัตรู unit.omura.description = ยิงลำแสงปืนเรลกันเจาะทะลุระยะไกลใส่ศัตรู สร้างยูนิตแฟลร์ @@ -1611,7 +1613,7 @@ unit.alpha.description = ปกป้องแกนกลางชาร์ด unit.beta.description = ปกป้องแกนกลางฟาวน์เดชั่นจากศัตรู สร้างสิ่งต่างๆ unit.gamma.description = ปกป้องแกนกลางนิวเคลียสจากศัตรู สร้างสิ่งต่างๆ unit.retusa.description = วางทุ่นระเบิดระยะใกล้ และซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียง -unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียงและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nทำลายกระสุนที่กำลังเข้ามาด้วยปืนป้องกันจุด +unit.oxynoe.description = ยิงเปลวไฟเผาไหม้ใส่ศัตรูที่อยู่ใกล้เคียงและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nทำลายกระสุนที่กำลังเข้ามาด้วยปืนป้องกันจุด\nให้สถานะ[accent]โอเวอร์คล็อก[]แก่พวกพ้องรอบข้าง ทำให้ยิงเร็วและแรงขึ้น unit.cyerce.description = ยิงขีปนาวุธพลาสม่าติดตามตัวเป็นกระจุกระเบิดใส่ศัตรู\nซ่อมแซมยูนิตพวกพ้องที่อยู่ใกล้เคียงด้วยปืนซ่อมแซม unit.aegires.description = ช็อตทุกสิ่งก่อสร้างและยูนิตศัตรูที่เข้ามาในสนามพลังงานของมัน\nซ่อมแซมสิ่งก่อสร้างและยูนิตพวกพ้อง unit.navanax.description = ยิงลูกระเบิดคลื่นชีพจรแม่เหล็กขนาดใหญ่ สร้างความเสียหายอย่างหนักให้กับเครือข่ายพลังงานศัตรู\nและซ่อมแซมสิ่งก่อสร้างของพวกพ้อง\nหลอมละลายศัตรูที่อยู่ใกล้เคียงด้วยป้อมปืนเลเซอร์อัตโนมัติสี่ป้อม @@ -1703,7 +1705,7 @@ lenum.any = ยูนิตอะไรก็ได้ lenum.ally = ยูนิตพวกพ้อง lenum.attacker = ยูนิตติดอาวุธ lenum.enemy = ยูนิตศัตรู -lenum.boss = ยูนิตการ์เดียน +lenum.boss = ยูนิตผู้พิทักษ์ lenum.flying = ยูนิตอากาศ lenum.ground = ยูนิตพื้นดิน lenum.player = ยูนิตที่ถูกควบคุมโดยผู้เล่น diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index a56a2a0326..66d8d849af 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -1272,7 +1272,7 @@ block.oil-extractor.name = Petrol Çıkarıcı block.repair-point.name = Tamir Noktası block.repair-turret.name = Tamir Turreti block.pulse-conduit.name = Dalga Borusu -block.plated-conduit.name = Kaplı Boru +block.plated-conduit.name = Yalıtımlı Boru block.phase-conduit.name = Faz Borusu block.liquid-router.name = Sıvı Yönlendiricisi block.liquid-tank.name = Sıvı Tankı @@ -1438,6 +1438,8 @@ block.item-source.description = Seçilen eşyadan sonsuz verir. Sadece Yaratıc block.item-void.description = Verilen eşyaları yok eder. Sadece Yaratıcı Modda. block.liquid-source.description = Seçilen sıvıyı sonsuz verir. Sadece Yaratıcı Modda. block.liquid-void.description = Verilen sıvıları yok eder. Sadece Yaratıcı Modda. +block.payload-source.description = Sınırsız bir şekilde Eleman ve Kargo oluşturur. Sadece Yaratıcı Modda. +block.payload-void.description = Tüm Yük ve Elemanları Yok Eder. Sadece Yaratıcı Modda. block.copper-wall.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve silahları korumak için kullanışlıdır. block.copper-wall-large.description = Ucuz bir savunma bloğu.\nİlk birkaç dalgada merkezi ve taretleri korumak için kullanışlıdır.\nBirçok blok alan kaplar. block.titanium-wall.description = Orta derecede güçlü savunma bloğu.\nDüşmanlardan orta derecede koruma sağlar. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 09e3df9cd8..1a2a9db84d 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -18,7 +18,7 @@ screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. gameover = Гра завершена gameover.disconnect = Від’єднатися -gameover.pvp = [accent]{0}[] команда перемогла! +gameover.pvp = [accent]{0}[] перемогли! gameover.waiting = [accent]Очікуємо наступно мапу… highscore = [accent]Новий рекорд! copied = Скопійовано. @@ -98,6 +98,7 @@ customgame = Користувацька гра newgame = Нова гра none = <нічого> none.found = [lightgray]<нічого не знайдено> +none.inmap = [lightgray]<нічого на мапі не знайдено> minimap = Мінімапа position = Місцезнаходження close = Закрити @@ -208,6 +209,7 @@ server.refreshing = Оновлення сервера hosts.none = [lightgray]Локальних ігор не знайдено host.invalid = [scarlet]Не вдалося під’єднатися до сервера. servers.local = Локальні сервери +servers.local.steam = Локальні сервери і сервери від гравців Steam servers.remote = Віддалені сервери servers.global = Глобальні сервери @@ -308,7 +310,7 @@ data.invalid = Це не дійсні ігрові дані. data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. quit.confirm = Ви дійсно хочете вийти? loading = [accent]Завантаження… -reloading = [accent]Перезавантаження модифікацій… +downloading = [accent]Завантаження… saving = [accent]Збереження… respawn = [accent][[{0}][], щоби відродитися в ядрі cancelbuilding = [accent][[{0}][] для очищення плану @@ -337,8 +339,8 @@ builtin = Вбудована map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.random = [accent]Випадкова мапа map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. +map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [#{0}]{1}[] ядро до цієї мапи в редакторі. +map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [#{0}]{1}[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. workshop.update = Оновити предмет workshop.error = Помилка під час отримання інформації з Майстерні: {0} @@ -519,6 +521,7 @@ configure = Налаштувати вивантаження loadout = Вивантаження resources = Ресурси bannedblocks = Заборонені блоки +bannedunits = Заборонені одиниці addall = Додати все launch.from = Запуск з [accent]{0} launch.destination = Пункт призначення: {0} @@ -540,10 +543,13 @@ weather.snow.name = Сніг weather.sandstorm.name = Піщана буря weather.sporestorm.name = Спорова буря weather.fog.name = Туман +sectorlist = Сектори +sectorlist.attacked = {0} під атакою sectors.unexplored = [lightgray]Не досліджено sectors.resources = Ресурси: sectors.production = Виробництво: sectors.export = Експортування: +sectors.import = Імпортування: sectors.time = Час: sectors.threat = Загроза: sectors.wave = Хвиля: @@ -696,7 +702,7 @@ stat.maxconsecutive = Максимальна послідовність stat.buildcost = Вартість будування stat.inaccuracy = Розкид stat.shots = Постріли -stat.reload = Постріли за сек. +stat.reload = Скорострільність stat.ammo = Боєприпаси stat.shieldhealth = Міцність щита stat.cooldowntime = Тривалість охолодження @@ -740,7 +746,7 @@ bar.corereq = Необхідне основне ядро bar.drillspeed = Швидкість буріння: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с. bar.efficiency = Ефективність: {0}% -bar.boost = Підсилення: {0}% +bar.boost = Підсилення: +{0}% bar.powerbalance = Енергія: {0} за с. bar.powerstored = Зберігає: {0}/{1} bar.poweramount = Енергія: {0} @@ -761,7 +767,7 @@ bullet.damage = [stat]{0}[lightgray] шкода bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] плиток bullet.incendiary = [stat]запальний bullet.homing = [stat]самонаведення -bullet.frag = [stat]шкода по ділянці +bullet.frags = [stat]{0}[lightgray]x шкода по ділянці від снарядів: bullet.lightning = [stat]{0}[lightgray]x блискавки ~ [stat]{1}[lightgray] шкоди bullet.buildingdamage = [stat]{0}%[lightgray] шкода по будівлям bullet.knockback = [stat]{0}[lightgray] відкидання @@ -799,19 +805,19 @@ category.items = Предмети category.crafting = Виробництво category.function = Стрільба category.optional = Додаткові поліпшення +setting.skipcoreanimation.name = Пропустити запуск ядра та анімацію приземлення setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.shadows.name = Тіні setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація setting.hints.name = Підказки -setting.flow.name = Показувати темп швидкості ресурсів +setting.logichints.name = Підказки при роботі з логікою setting.backgroundpause.name = Пауза в разі згортанні setting.buildautopause.name = Автоматичне призупинення будування setting.doubletapmine.name = Подвійне торкання для початку видобування setting.modcrashdisable.name = Вимикати модифікації після аварійного запуску setting.animatedwater.name = Анімаційні рідини setting.animatedshields.name = Анімаційні щити -setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.playerindicators.name = Позначки гравців setting.indicators.name = Позначки противників setting.autotarget.name = Автострільба @@ -820,7 +826,8 @@ setting.touchscreen.name = Керування сенсорним екраном setting.fpscap.name = Максимальний FPS setting.fpscap.none = Жодне setting.fpscap.text = {0} FPS -setting.uiscale.name = Масштабування користувацького інтерфейсу[lightgray] (потребує перезапуску)[] +setting.uiscale.name = Масштабування користувацького інтерфейсу +setting.uiscale.description = Потрібен перезапуск для застосування змін. setting.swapdiagonal.name = Завжди діагональне розміщення setting.difficulty.training = Навчання setting.difficulty.easy = Легка @@ -838,7 +845,9 @@ setting.saveinterval.name = Інтервал збереження setting.seconds = {0} секунд setting.milliseconds = {0} мілісекунд setting.fullscreen.name = Повноекранний режим -setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску) +setting.borderlesswindow.name = Вікно без полів +setting.borderlesswindow.name.windows = Повний екран без полів +setting.borderlesswindow.description = Можливо, потрібен перезапуск для застосування змін. setting.fps.name = Показувати FPS і затримку до сервера setting.smoothcamera.name = Гладка камера setting.vsync.name = Вертикальна синхронізація @@ -859,6 +868,7 @@ setting.playerlimit.name = Обмеження гравців setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.bridgeopacity.name = Непрозорість мостів +setting.showweather.name = Показувати погоду setting.playerchat.name = Показувати хмару чата над гравцями public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.confirm.really = Якщо ви хочете грати з друзями, використовуйте [green]Запросити друзів[] замість [scarlet]Публічного серверу[]!\nВи справді хочете зробити свою гру [scarlet]публічною[]? @@ -958,6 +968,8 @@ rules.wavetimer = Таймер для хвиль rules.waves = Хвилі rules.attack = Режим атаки rules.buildai = Будування ШІ +rules.aitier = Рівень складності будівель ШІ [0;1] +rules.cleanupdeadteams = Очистити будівлі переможеної команди (PvP) rules.corecapture = Захоплення ядра після знищення rules.polygoncoreprotection = Полігональний захист ядер rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ @@ -977,12 +989,15 @@ rules.deconstructrefundmultiplier = Множник відшкодування в rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпасів +rules.enemyteam = Ворожа команда +rules.playerteam = Команда гравця rules.title.waves = Хвилі rules.title.resourcesbuilding = Ресурси й будування rules.title.enemy = Противники rules.title.unit = Бойові одиниці rules.title.experimental = Експериментальне rules.title.environment = Середовище +rules.title.teams = Команди rules.lighting = Світлотінь rules.enemyLights = Ворожі вогні rules.fire = Вогонь @@ -1055,7 +1070,6 @@ unit.scepter.name = Верховна влада unit.reign.name = Верховний Порядок unit.vela.name = Пульсар Вітрил unit.corvus.name = Ґава -block.resupply-point.name = Пункт постачання block.parallax.name = Паралакс block.cliff.name = Скеля block.sand-boulder.name = Пісочний валун @@ -1247,7 +1261,6 @@ block.meltdown.name = Розплавлювач block.foreshadow.name = Передвісник block.container.name = Сховище block.launch-pad.name = Пусковий майданчик -block.launch-pad-large.name = Великий пусковий майданчик block.segment.name = Сегмент block.command-center.name = Командний центр block.ground-factory.name = Наземний завод @@ -1268,10 +1281,10 @@ block.payload-source.name = Вантажне джерело block.disassembler.name = Розбирач block.silicon-crucible.name = Кремнієвий тигель block.overdrive-dome.name = Великий прискорювач +block.interplanetary-accelerator.name = Міжпланетний прискорювач block.block-forge.name = Блок-кузня block.block-loader.name = Блок-завантажувач block.block-unloader.name = Блок-вивантажувач -block.interplanetary-accelerator.name = Міжпланетний прискорювач block.switch.name = Перемикач block.micro-processor.name = Мікропроцесор block.logic-processor.name = Логічний процесор @@ -1280,13 +1293,13 @@ block.logic-display.name = Логічний дисплей block.large-logic-display.name = Великий логічний дисплей block.memory-cell.name = Комірка пам’яті block.memory-bank.name = Блок пам’яті -team.blue.name = Синя +team.blue.name = Сині team.crux.name = Загарбники team.sharded.name = Розколоті -team.orange.name = Помаранчева -team.derelict.name = Знедолена -team.green.name = Зелена -team.purple.name = Фіолетова +team.orange.name = Помаранчеві +team.derelict.name = Переможені +team.green.name = Зелені +team.purple.name = Фіолетові hint.skip = Пропустити hint.desktopMove = Використовуйте [accent][[WASD][], щоби рухатися. hint.zoom = [accent]Прокручуйте коліщатком миші[], щоби збільшити чи зменшити масштаб мапи. @@ -1305,6 +1318,7 @@ hhint.breaking = Натисніть [accent]ПКМ[] і тягніть, щоби hint.breaking.mobile = Активуйте  [accent]молот[] внизу праворуч і торкніться блоків, щоби їх розібрати.\n\nУтримуйте палець протягом секунди і протягніть, щоби розібрати виділене. hint.blockInfo = Подивіться інформацію про блок. Перейдіть до [accent]меню будівництва[] і натисніть на кнопку [accent][[?][] правпоруч hint.research = Використовуйте кнопку  [accent]Дослідження[] для дослідження нової технології. +hint.derelict = Будівлі [accent]Переможених[] є зламаними залишками старих баз, які більше не функціонують.\n\nЇх можна [accent]деконструювати[] для отримання ресурсів. hint.research.mobile = Використовуйте  [accent]Дослідження[] в  [accent]меню[] для дослідження нової технології. hint.unitControl = Утримуйте [accent][[лівий Ctrl][] і [accent]натисніть[] на одиницю чи башту, щоби контролювати її. hint.unitControl.mobile = [accent][Торкніться двічі[], щоби контролювати союзні одиниці чи башти. @@ -1338,7 +1352,7 @@ item.coal.description = Використовується для виробниц item.coal.details = Виглядає скам’янілою рослинною речовиною, утвореною задовго до Сівби. item.titanium.description = Використовується в транспортуванні будівль, бурів та в заводах. item.thorium.description = Використовується в міцних конструкціях і як ядерне паливо. -item.scrap.description = Використовується в Плавильнях і Подрібнювачах для перероблення в інші матеріали в інші матеріали. +item.scrap.description = Використовується в Плавильнях і Подрібнювачах для перероблення в інші матеріали. item.scrap.details = Залишки старих споруд та підрозділів. item.silicon.description = Використовується в сонячних панелях, складній електроніці та боєприпасах самонаведення для башт. item.plastanium.description = Використовується в передових одиницях та у фрагментованих боєприпасах. @@ -1352,7 +1366,7 @@ liquid.water.description = Використовується для охолод liquid.slag.description = Переробляється у відокремлювачах у складові метали або розпорошується на ворогів як зброя. liquid.oil.description = Використовується у виробництві передових матеріалів і як запальні боєприпаси. liquid.cryofluid.description = Використовується як теплоносій у реакторах, баштах і заводах. -block.resupply-point.description = Поповнює найближчі одиниці мідними боєприпасами. Несумісний з одиницями, що потребують заряду акумулятора. +block.derelict =  [lightgray]Переможені block.armored-conveyor.description = Переміщує предмети вперед. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.illuminator.description = Випромінює світло. block.message.description = Зберігає повідомлення для комунікації між союзниками. @@ -1496,6 +1510,8 @@ block.memory-bank.description = Зберігає інформацію для л block.logic-display.description = Показує довільну графіку з логічного процесора. block.large-logic-display.description = Показує довільну графіку з логічного процесора. block.interplanetary-accelerator.description = Велика електромагнітна башта-рейкотрон. Прискорює ядра, щоби подолати планетне тяжіння для міжпланетного розгортання. +block.repair-turret.description = Безпервно ремонтує найближчу пошкоджену одиницю. Для прискорення ремонтування можна охолодити. +block.payload-propulsion-tower.description = Структура транспортування вантажу на великі відстані. Вистрілює вантаж в інші вантажні катапульти. unit.dagger.description = Вистрілює стандартними кулями в найближчих ворогах. unit.mace.description = Вистрілює потоками полум’я в найближчих ворогів. unit.fortress.description = Вистрілює з дальнобійної артилерії в наземних цілей. @@ -1529,6 +1545,12 @@ unit.omura.description = Вистрілює у ворогів далекобій unit.alpha.description = Захищає ядро «Уламок» від противників. Будує споруди. unit.beta.description = Захищає ядро «Штаб» від противників. Будує споруди. unit.gamma.description = Захищає ядро «Атом» від противників. Будує споруди. +unit.retusa.description = Розміщує міни. Ремонтує найближчі одиниці. +unit.oxynoe.description = Вистрілює потоками полум'я, яке ремонтує споруди та наносить шкоду ворогам. Захищає від ворожик снарядів за допомогою башти точкової оборони. +unit.cyerce.description = Вистрілює у ворогів навідними касетними ракетами. Ремонтує найближчі одиниці. +unit.aegires.description = Приголомшлює ворожі одиниці та будівлі, що входять до його енергетичного поля. Ремонтує всіх союзників. +unit.navanax.description = Вистрілює вибухонебезпечні снаряди електромагнітного імпульсу, завдаючи значної шкоди ворожим енергетичним мережам та ремонтуючи союзницькі споруди. Розплавляє сусідніх ворогів за допомогою 4 автономних лазерних веж. + lst.read = Зчитує число із з’єднаної комірки пам’яті. lst.write = Записує числу у з’єднану комірки пам’яті. diff --git a/core/assets/bundles/bundle_vi.properties b/core/assets/bundles/bundle_vi.properties index 067d3703d9..53d47d8f21 100644 --- a/core/assets/bundles/bundle_vi.properties +++ b/core/assets/bundles/bundle_vi.properties @@ -770,7 +770,7 @@ bar.corereq = Yêu cầu căn cứ bar.drillspeed = Tốc độ khoan: {0}/giây bar.pumpspeed = Tốc độ bơm: {0}/giây bar.efficiency = Hiệu suất: {0}% -bar.boost = Tăng tốc: {0}% +bar.boost = Tăng tốc: +{0}% bar.powerbalance = Năng lượng: {0}/giây bar.powerstored = Lưu trữ: {0}/{1} bar.poweramount = Năng lượng: {0} diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index e306743ea4..0cb51b1d3d 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -772,7 +772,7 @@ bar.corereq = 缺失核心基座 bar.drillspeed = 挖掘速度:{0}/秒 bar.pumpspeed = 泵压速度:{0}/秒 bar.efficiency = 效率:{0}% -bar.boost = 超速:{0}% +bar.boost = 超速:+{0}% bar.powerbalance = 能量:{0}/秒 bar.powerstored = 储能:{0}/{1} bar.poweramount = 能量:{0} diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 98ae7dbe86..161565aea2 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -774,7 +774,7 @@ bar.corereq = 需由核心升級 bar.drillspeed = 鑽頭速度:{0}/秒 bar.pumpspeed = 液體泵送速度:{0}/秒 bar.efficiency = 效率:{0}% -bar.boost = 速度加成:{0}% +bar.boost = 速度加成:+{0}% bar.powerbalance = 能量變化:{0} bar.powerstored = 能量存量:{0}/{1} bar.poweramount = 能量:{0} diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index 26c8b7d1f9..e7f4eb5270 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -89,7 +89,7 @@ public class BaseAI{ calculating = false; } }else{ - var field = pathfinder.getField(state.rules.waveTeam, Pathfinder.costGround, Pathfinder.fieldCore); + var field = pathfinder.getField(data.team, Pathfinder.costGround, Pathfinder.fieldCore); if(field.weights != null){ int[][] weights = field.weights; @@ -120,7 +120,7 @@ public class BaseAI{ } //found the end. - if(calcTile.build instanceof CoreBuild b && b.team == state.rules.defaultTeam){ + if(calcTile.build instanceof CoreBuild b && b.team != data.team){ //clean up calculations and flush results calculating = false; calcCount = 0; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 5ddd5ee8e5..e0917e4484 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -1342,12 +1342,14 @@ public class Blocks implements ContentList{ battery = new Battery("battery"){{ requirements(Category.power, with(Items.copper, 5, Items.lead, 20)); consumes.powerBuffered(4000f); + baseExplosiveness = 1f; }}; batteryLarge = new Battery("battery-large"){{ requirements(Category.power, with(Items.titanium, 20, Items.lead, 40, Items.silicon, 20)); size = 3; consumes.powerBuffered(50000f); + baseExplosiveness = 5f; }}; combustionGenerator = new BurnerGenerator("combustion-generator"){{ @@ -2091,7 +2093,7 @@ public class Blocks implements ContentList{ requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 80)); plans = Seq.with( new UnitPlan(UnitTypes.dagger, 60f * 15, with(Items.silicon, 10, Items.lead, 10)), - new UnitPlan(UnitTypes.crawler, 60f * 12, with(Items.silicon, 10, Items.coal, 20)), + new UnitPlan(UnitTypes.crawler, 60f * 10, with(Items.silicon, 8, Items.coal, 10)), new UnitPlan(UnitTypes.nova, 60f * 40, with(Items.silicon, 30, Items.lead, 20, Items.titanium, 20)) ); size = 3; diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 7e171c0f9d..46e8f915c2 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -158,7 +158,7 @@ public class UnitTypes implements ContentList{ }}; scepter = new UnitType("scepter"){{ - speed = 0.35f; + speed = 0.36f; hitSize = 22f; rotateSpeed = 2.1f; health = 9000; @@ -186,7 +186,7 @@ public class UnitTypes implements ContentList{ inaccuracy = 3f; shotDelay = 4f; - bullet = new BasicBulletType(7f, 45){{ + bullet = new BasicBulletType(7f, 50){{ width = 11f; height = 20f; lifetime = 25f; @@ -195,7 +195,7 @@ public class UnitTypes implements ContentList{ lightningLength = 6; lightningColor = Pal.surge; //standard bullet damage is far too much for lightning - lightningDamage = 19; + lightningDamage = 20; }}; }}, @@ -244,7 +244,7 @@ public class UnitTypes implements ContentList{ ejectEffect = Fx.casing4; shootSound = Sounds.bang; - bullet = new BasicBulletType(13f, 65){{ + bullet = new BasicBulletType(13f, 70){{ pierce = true; pierceCap = 10; width = 14f; @@ -419,7 +419,7 @@ public class UnitTypes implements ContentList{ vela = new UnitType("vela"){{ hitSize = 24f; - rotateSpeed = 1.7f; + rotateSpeed = 1.8f; mechFrontSway = 1f; buildSpeed = 3f; @@ -429,7 +429,7 @@ public class UnitTypes implements ContentList{ drownTimeMultiplier = 4f; speed = 0.44f; - boostMultiplier = 2.2f; + boostMultiplier = 2.4f; engineOffset = 12f; engineSize = 6f; lowAltitude = true; @@ -442,6 +442,7 @@ public class UnitTypes implements ContentList{ immunities = ObjectSet.with(StatusEffects.burning); commandLimit = 8; + singleTarget = true; weapons.add(new Weapon("vela-weapon"){{ mirror = false; @@ -485,6 +486,18 @@ public class UnitTypes implements ContentList{ shootStatus = StatusEffects.slow; shootStatusDuration = bullet.lifetime + firstShotDelay; }}); + + weapons.add(new RepairBeamWeapon("repair-beam-weapon-center-large"){{ + x = 44 / 4f; + y = -30f / 4f; + shootY = 6f; + beamWidth = 0.8f; + repairSpeed = 1.4f; + + bullet = new BulletType(){{ + maxRange = 120f; + }}; + }}); }}; corvus = new UnitType("corvus"){{ @@ -1059,7 +1072,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 1.9f; flying = true; lowAltitude = true; - health = 7000; + health = 7200; armor = 9f; engineOffset = 21; engineSize = 5.3f; @@ -1067,13 +1080,13 @@ public class UnitTypes implements ContentList{ targetFlags = new BlockFlag[]{BlockFlag.generator, BlockFlag.core, null}; ammoType = new ItemAmmoType(Items.thorium); - BulletType missiles = new MissileBulletType(2.7f, 14){{ + BulletType missiles = new MissileBulletType(2.7f, 18){{ width = 8f; height = 8f; shrinkY = 0f; drag = -0.01f; splashDamageRadius = 20f; - splashDamage = 34f; + splashDamage = 37f; ammoMultiplier = 4f; lifetime = 50f; hitEffect = Fx.blastExplosion; @@ -1128,13 +1141,13 @@ public class UnitTypes implements ContentList{ }}; eclipse = new UnitType("eclipse"){{ - speed = 0.52f; + speed = 0.54f; accel = 0.04f; drag = 0.04f; rotateSpeed = 1f; flying = true; lowAltitude = true; - health = 21000; + health = 22000; engineOffset = 38; engineSize = 7.3f; hitSize = 58f; @@ -1143,10 +1156,10 @@ public class UnitTypes implements ContentList{ targetFlags = new BlockFlag[]{BlockFlag.reactor, BlockFlag.battery, BlockFlag.core, null}; ammoType = new ItemAmmoType(Items.thorium); - BulletType fragBullet = new FlakBulletType(4f, 5){{ + BulletType fragBullet = new FlakBulletType(4f, 15){{ shootEffect = Fx.shootBig; ammoMultiplier = 4f; - splashDamage = 60f; + splashDamage = 65f; splashDamageRadius = 25f; collidesGround = true; lifetime = 47f; @@ -1169,7 +1182,7 @@ public class UnitTypes implements ContentList{ rotate = true; bullet = new LaserBulletType(){{ - damage = 110f; + damage = 115f; sideAngle = 20f; sideWidth = 1.5f; sideLength = 80f; @@ -1338,7 +1351,7 @@ public class UnitTypes implements ContentList{ quad = new UnitType("quad"){{ armor = 8f; health = 6000; - speed = 1.3f; + speed = 1.2f; rotateSpeed = 2f; accel = 0.05f; drag = 0.017f; @@ -1447,7 +1460,7 @@ public class UnitTypes implements ContentList{ armor = 2f; weapons.add(new Weapon("mount-weapon"){{ - reload = 12f; + reload = 13f; x = 4f; shootY = 4f; y = 1.5f; @@ -1458,7 +1471,7 @@ public class UnitTypes implements ContentList{ weapons.add(new Weapon("missiles-mount"){{ mirror = false; - reload = 23f; + reload = 25f; x = 0f; y = -5f; rotate = true; @@ -1570,15 +1583,14 @@ public class UnitTypes implements ContentList{ ejectEffect = Fx.casing3; shootSound = Sounds.artillery; - bullet = new ArtilleryBulletType(3.2f, 12){{ + bullet = new ArtilleryBulletType(3.2f, 15){{ trailMult = 0.8f; hitEffect = Fx.massiveExplosion; knockback = 1.5f; - lifetime = 80f; + lifetime = 84f; height = 15.5f; width = 15f; collidesTiles = false; - ammoMultiplier = 4f; splashDamageRadius = 40f; splashDamage = 70f; backColor = Pal.missileYellowBack; diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index a73db1295d..38e87b32ae 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -164,14 +164,14 @@ public class NetClient implements ApplicationListener{ public static void sound(Sound sound, float volume, float pitch, float pan){ if(sound == null) return; - sound.play(volume * Core.settings.getInt("sfxvol") / 100f, pitch, pan); + sound.play(Mathf.clamp(volume, 0, 4f) * Core.settings.getInt("sfxvol") / 100f, pitch, pan); } @Remote(variants = Variant.both, unreliable = true) public static void soundAt(Sound sound, float x, float y, float volume, float pitch){ if(sound == null) return; - sound.at(x, y, pitch, volume); + sound.at(x, y, pitch, Mathf.clamp(volume, 0, 4f)); } @Remote(variants = Variant.both, unreliable = true) diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 77b4b0643a..e4de6e0222 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -896,7 +896,7 @@ public class NetServer implements ApplicationListener{ } String fixName(String name){ - name = name.trim(); + name = name.trim().replace("\n", "").replace("\t", ""); if(name.equals("[") || name.equals("]")){ return ""; } diff --git a/core/src/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java index 15049f7381..eb3ce423e1 100644 --- a/core/src/mindustry/editor/WaveInfoDialog.java +++ b/core/src/mindustry/editor/WaveInfoDialog.java @@ -1,6 +1,7 @@ package mindustry.editor; import arc.*; +import arc.graphics.*; import arc.math.*; import arc.scene.event.*; import arc.scene.ui.*; @@ -14,6 +15,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.io.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.ui.dialogs.*; import static mindustry.Vars.*; @@ -22,6 +24,7 @@ import static mindustry.game.SpawnGroup.*; public class WaveInfoDialog extends BaseDialog{ private int displayed = 20; Seq groups = new Seq<>(); + private SpawnGroup expandedGroup; private Table table; private int start = 0; @@ -67,6 +70,12 @@ public class WaveInfoDialog extends BaseDialog{ buildGroups(); dialog.hide(); })); + dialog.cont.row(); + dialog.cont.button("@clear", () -> ui.showConfirm("@confirm", "@settings.clear.confirm", () -> { + groups.clear(); + buildGroups(); + dialog.hide(); + })); dialog.show(); }).size(270f, 64f); @@ -132,7 +141,10 @@ public class WaveInfoDialog extends BaseDialog{ main.row(); main.button("@add", () -> { if(groups == null) groups = new Seq<>(); - groups.add(new SpawnGroup(lastType)); + SpawnGroup newGroup = new SpawnGroup(lastType); + groups.add(newGroup); + expandedGroup = newGroup; + showUpdate(newGroup); buildGroups(); }).growX().height(70f); }), new Label("@waves.none"){{ @@ -153,6 +165,7 @@ public class WaveInfoDialog extends BaseDialog{ table.margin(10f); if(groups != null){ + groups.sort(g -> g.begin); for(SpawnGroup group : groups){ table.table(Tex.button, t -> { @@ -164,92 +177,100 @@ public class WaveInfoDialog extends BaseDialog{ b.add().growX(); - b.button(Icon.cancel, () -> { + b.label(() -> (group.begin + 1) + "").color(Color.lightGray).minWidth(45f).labelAlign(Align.left).left(); + + b.button(Icon.unitsSmall, Styles.emptyi, () -> showUpdate(group)).pad(-6).size(46f); + b.button(Icon.cancel, Styles.emptyi, () -> { groups.remove(group); table.getCell(t).pad(0f); t.remove(); updateWaves(); }).pad(-6).size(46f).padRight(-12f); - }, () -> showUpdate(group)).height(46f).pad(-6f).padBottom(0f).row(); + }, () -> { + expandedGroup = expandedGroup == group ? null : group; + buildGroups(); + }).height(46f).pad(-6f).padBottom(0f).row(); - t.table(spawns -> { - spawns.field("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text)){ - group.begin = Strings.parseInt(text) - 1; - updateWaves(); - } - }).width(100f); - spawns.add("@waves.to").padLeft(4).padRight(4); - spawns.field(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text)){ - group.end = Strings.parseInt(text) - 1; - updateWaves(); - }else if(text.isEmpty()){ - group.end = never; - updateWaves(); - } - }).width(100f).get().setMessageText("∞"); - }).row(); + if(expandedGroup == group){ + t.table(spawns -> { + spawns.field("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text)){ + group.begin = Strings.parseInt(text) - 1; + updateWaves(); + } + }).width(100f); + spawns.add("@waves.to").padLeft(4).padRight(4); + spawns.field(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text)){ + group.end = Strings.parseInt(text) - 1; + updateWaves(); + }else if(text.isEmpty()){ + group.end = never; + updateWaves(); + } + }).width(100f).get().setMessageText("∞"); + }).row(); - t.table(p -> { - p.add("@waves.every").padRight(4); - p.field(group.spacing + "", TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text) && Strings.parseInt(text) > 0){ - group.spacing = Strings.parseInt(text); - updateWaves(); - } - }).width(100f); - p.add("@waves.waves").padLeft(4); - }).row(); + t.table(p -> { + p.add("@waves.every").padRight(4); + p.field(group.spacing + "", TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text) && Strings.parseInt(text) > 0){ + group.spacing = Strings.parseInt(text); + updateWaves(); + } + }).width(100f); + p.add("@waves.waves").padLeft(4); + }).row(); - t.table(a -> { - a.field(group.unitAmount + "", TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text)){ - group.unitAmount = Strings.parseInt(text); - updateWaves(); - } - }).width(80f); + t.table(a -> { + a.field(group.unitAmount + "", TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text)){ + group.unitAmount = Strings.parseInt(text); + updateWaves(); + } + }).width(80f); - a.add(" + "); - a.field(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { - if(Strings.canParsePositiveFloat(text)){ - group.unitScaling = 1f / Strings.parseFloat(text); - updateWaves(); - } - }).width(80f); - a.add("@waves.perspawn").padLeft(4); - }).row(); + a.add(" + "); + a.field(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { + if(Strings.canParsePositiveFloat(text)){ + group.unitScaling = 1f / Strings.parseFloat(text); + updateWaves(); + } + }).width(80f); + a.add("@waves.perspawn").padLeft(4); + }).row(); - t.table(a -> { - a.field(group.max + "", TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text)){ - group.max = Strings.parseInt(text); - updateWaves(); - } - }).width(80f); + t.table(a -> { + a.field(group.max + "", TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text)){ + group.max = Strings.parseInt(text); + updateWaves(); + } + }).width(80f); - a.add("@waves.max").padLeft(5); - }).row(); + a.add("@waves.max").padLeft(5); + }).row(); - t.table(a -> { - a.field((int)group.shields + "", TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text)){ - group.shields = Strings.parseInt(text); - updateWaves(); - } - }).width(80f); + t.table(a -> { + a.field((int)group.shields + "", TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text)){ + group.shields = Strings.parseInt(text); + updateWaves(); + } + }).width(80f); - a.add(" + "); - a.field((int)group.shieldScaling + "", TextFieldFilter.digitsOnly, text -> { - if(Strings.canParsePositiveInt(text)){ - group.shieldScaling = Strings.parseInt(text); - updateWaves(); - } - }).width(80f); - a.add("@waves.shields").padLeft(4); - }).row(); + a.add(" + "); + a.field((int)group.shieldScaling + "", TextFieldFilter.digitsOnly, text -> { + if(Strings.canParsePositiveInt(text)){ + group.shieldScaling = Strings.parseInt(text); + updateWaves(); + } + }).width(80f); + a.add("@waves.shields").padLeft(4); + }).row(); - t.check("@waves.guardian", b -> group.effect = (b ? StatusEffects.boss : null)).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)).padBottom(8f); + t.check("@waves.guardian", b -> group.effect = (b ? StatusEffects.boss : null)).padTop(4).update(b -> b.setChecked(group.effect == StatusEffects.boss)).padBottom(8f); + } }).width(340f).pad(8); table.row(); @@ -281,6 +302,7 @@ public class WaveInfoDialog extends BaseDialog{ if(++i % 3 == 0) p.row(); } }); + dialog.addCloseButton(); dialog.show(); } diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 7c69b06cb2..cc11cf29fa 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -48,8 +48,8 @@ public class Damage{ public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, boolean damage, boolean fire, @Nullable Team ignoreTeam, Effect explosionFx){ if(damage){ for(int i = 0; i < Mathf.clamp(power / 700, 0, 8); i++){ - int length = 5 + Mathf.clamp((int)(power / 500), 1, 20); - Time.run(i * 0.8f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), length + Mathf.range(2))); + int length = 5 + Mathf.clamp((int)(Mathf.pow(power, 0.98f) / 500), 1, 18); + Time.run(i * 0.8f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3 + Mathf.pow(power, 0.35f), x, y, Mathf.random(360f), length + Mathf.range(2))); } if(fire){ diff --git a/core/src/mindustry/entities/effect/ParticleEffect.java b/core/src/mindustry/entities/effect/ParticleEffect.java index 2b8fd4e52d..0efbaefcbf 100644 --- a/core/src/mindustry/entities/effect/ParticleEffect.java +++ b/core/src/mindustry/entities/effect/ParticleEffect.java @@ -4,14 +4,19 @@ import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; import arc.util.*; import mindustry.entities.*; import mindustry.graphics.*; /** The most essential effect class. Can create particles in various shapes. */ public class ParticleEffect extends Effect{ + private static final Rand rand = new Rand(); + private static final Vec2 rv = new Vec2(); + public Color colorFrom = Color.white.cpy(), colorTo = Color.white.cpy(); public int particles = 6; + public boolean randLength = true; public float cone = 180f, length = 20f, baseLength = 0f; /** Particle size/length/radius interpolation. */ public Interp interp = Interp.linear; @@ -57,15 +62,25 @@ public class ParticleEffect extends Effect{ Lines.stroke(interp.apply(strokeFrom, strokeTo, rawfin)); float len = interp.apply(lenFrom, lenTo, rawfin); - Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { + rand.setSeed(e.id); + for(int i = 0; i < particles; i++){ + float l = length * fin + baseLength; + rv.trns(e.rotation + rand.range(cone), !randLength ? l : rand.random(l)); + float x = rv.x, y = rv.y; + Lines.lineAngle(ox + x, oy + y, Mathf.angle(x, y), len); - Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity* Draw.getColor().a); - }); + Drawf.light(ox + x, oy + y, len * lightScl, lightColor, lightOpacity * Draw.getColor().a); + } }else{ - Angles.randLenVectors(e.id, particles, length * fin + baseLength, e.rotation, cone, (x, y) -> { + rand.setSeed(e.id); + for(int i = 0; i < particles; i++){ + float l = length * fin + baseLength; + rv.trns(e.rotation + rand.range(cone), !randLength ? l : rand.random(l)); + float x = rv.x, y = rv.y; + Draw.rect(tex, ox + x, oy + y, rad, rad, e.rotation + offset + e.time * spin); Drawf.light(ox + x, oy + y, rad * lightScl, lightColor, lightOpacity * Draw.getColor().a); - }); + } } } } diff --git a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java index 8017907da1..f62ede3957 100644 --- a/core/src/mindustry/ui/dialogs/ContentInfoDialog.java +++ b/core/src/mindustry/ui/dialogs/ContentInfoDialog.java @@ -1,10 +1,12 @@ package mindustry.ui.dialogs; +import arc.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.ctype.*; +import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.meta.*; @@ -58,7 +60,6 @@ public class ContentInfoDialog extends BaseDialog{ if(map.size == 0) continue; - //TODO check if(stats.useCategories){ table.add("@category." + cat.name()).color(Pal.accent).fillX(); table.row(); @@ -80,7 +81,7 @@ public class ContentInfoDialog extends BaseDialog{ } if(content.details != null){ - table.add("[gray]" + content.details).pad(6).padTop(20).width(400f).wrap().fillX(); + table.add("[gray]" + (content.unlocked() ? content.details : Iconc.lock + " " + Core.bundle.get("unlock.incampaign"))).pad(6).padTop(20).width(400f).wrap().fillX(); table.row(); } diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index c39233a8e5..9a1159350c 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -176,7 +176,8 @@ public class ChatFragment extends Table{ String message = chatfield.getText().trim(); clearChatInput(); - if(message.isEmpty()) return; + //avoid sending prefix-empty messages + if(message.isEmpty() || (message.startsWith(mode.prefix) && message.substring(mode.prefix.length()).isEmpty())) return; history.insert(1, message); diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index ca3001f5b5..393ca070ba 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -163,12 +163,14 @@ public class MenuFragment extends Fragment{ new Buttoni("@customgame", Icon.terrain, () -> checkPlay(ui.custom::show)), new Buttoni("@loadgame", Icon.download, () -> checkPlay(ui.load::show)) ), + new Buttoni("@database.button", Icon.menu, + new Buttoni("@schematics", Icon.paste, ui.schematics::show), + new Buttoni("@database", Icon.book, ui.database::show), + new Buttoni("@about.button", Icon.info, ui.about::show) + ), new Buttoni("@editor", Icon.terrain, () -> checkPlay(ui.maps::show)), steam ? new Buttoni("@workshop", Icon.steam, platform::openWorkshop) : null, new Buttoni("@mods", Icon.book, ui.mods::show), - //not enough space for this button - //new Buttoni("@schematics", Icon.paste, ui.schematics::show), new Buttoni("@settings", Icon.settings, ui.settings::show), - new Buttoni("@about.button", Icon.info, ui.about::show), new Buttoni("@quit", Icon.exit, Core.app::exit) ); diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index f63ed7b45b..157c30edbe 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -192,8 +192,10 @@ public class PlacementFragment extends Fragment{ } if(Core.input.keyTap(Binding.block_info)){ - Block displayBlock = menuHoverBlock != null ? menuHoverBlock : input.block; - if(displayBlock != null){ + var build = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + Block hovering = build == null ? null : build instanceof ConstructBuild c ? c.current : build.block; + Block displayBlock = menuHoverBlock != null ? menuHoverBlock : input.block != null ? input.block : hovering; + if(displayBlock != null && displayBlock.unlockedNow()){ ui.content.show(displayBlock); Events.fire(new BlockInfoEvent()); } diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 8d30819602..65e06f9fbe 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -405,7 +405,7 @@ public class Block extends UnlockableContent{ stats.add(Stat.health, health, StatUnit.none); } - if(canBeBuilt()){ + if(canBeBuilt() && requirements.length > 0){ stats.add(Stat.buildTime, buildCost / 60, StatUnit.seconds); stats.add(Stat.buildCost, StatValues.items(false, requirements)); } diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index e94d6a73c9..95daea2e29 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -63,20 +63,20 @@ public class OverdriveProjector extends Block{ stats.timePeriod = useTime; super.setStats(); - stats.add(Stat.speedIncrease, (int)(100f * speedBoost), StatUnit.percent); + stats.add(Stat.speedIncrease, "+" + (int)(speedBoost * 100f - 100) + "%"); stats.add(Stat.range, range / tilesize, StatUnit.blocks); stats.add(Stat.productionTime, useTime / 60f, StatUnit.seconds); if(hasBoost){ - stats.add(Stat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks); - stats.add(Stat.boostEffect, (int)((speedBoost + speedBoostPhase) * 100f), StatUnit.percent); + stats.add(Stat.boostEffect, (range + phaseRangeBoost) / tilesize, StatUnit.blocks); + stats.add(Stat.boostEffect, "+" + (int)((speedBoost + speedBoostPhase) * 100f - 100) + "%"); } } - + @Override public void setBars(){ super.setBars(); - bars.add("boost", (OverdriveBuild entity) -> new Bar(() -> Core.bundle.format("bar.boost", (int)(entity.realBoost() * 100)), () -> Pal.accent, () -> entity.realBoost() / (hasBoost ? speedBoost + speedBoostPhase : speedBoost))); + bars.add("boost", (OverdriveBuild entity) -> new Bar(() -> Core.bundle.format("bar.boost", Math.max((int)(entity.realBoost() * 100 - 100), 0)), () -> Pal.accent, () -> entity.realBoost() / (hasBoost ? speedBoost + speedBoostPhase : speedBoost))); } public class OverdriveBuild extends Building implements Ranged{ diff --git a/core/src/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java index 81c314b128..b174c50c28 100644 --- a/core/src/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -1,19 +1,12 @@ package mindustry.world.blocks.production; -import arc.graphics.g2d.*; import arc.math.*; -import mindustry.annotations.Annotations.*; import mindustry.gen.*; -import mindustry.graphics.*; import mindustry.world.meta.*; public class Fracker extends SolidPump{ public float itemUseTime = 100f; - public @Load("@-liquid") TextureRegion liquidRegion; - public @Load("@-rotator") TextureRegion rotatorRegion; - public @Load("@-top") TextureRegion topRegion; - public Fracker(String name){ super(name); hasItems = true; @@ -30,33 +23,9 @@ public class Fracker extends SolidPump{ stats.add(Stat.productionTime, itemUseTime / 60f, StatUnit.seconds); } - @Override - public boolean outputsItems(){ - return false; - } - - @Override - public TextureRegion[] icons(){ - return new TextureRegion[]{region, rotatorRegion, topRegion}; - } - public class FrackerBuild extends SolidPumpBuild{ public float accumulator; - @Override - public void drawCracks(){} - - @Override - public void draw(){ - Draw.rect(region, x, y); - super.drawCracks(); - - Drawf.liquid(liquidRegion, x, y, liquids.get(result) / liquidCapacity, result.color); - - Drawf.spinSprite(rotatorRegion, x, y, pumpTime); - Draw.rect(topRegion, x, y); - } - @Override public void updateTile(){ if(consValid()){ @@ -73,10 +42,5 @@ public class Fracker extends SolidPump{ dumpLiquid(result); } } - - @Override - public float typeLiquid(){ - return liquids.get(result); - } } } diff --git a/core/src/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java index 4f2d7bc8d3..30dd69ef87 100644 --- a/core/src/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -70,6 +70,11 @@ public class SolidPump extends Pump{ return sum > 0.00001f; } + @Override + public boolean outputsItems(){ + return false; + } + @Override protected boolean canPump(Tile tile){ return tile != null && !tile.floor().isLiquid; @@ -87,10 +92,16 @@ public class SolidPump extends Pump{ public float validTiles; public float lastPump; + + @Override + public void drawCracks(){} + @Override public void draw(){ Draw.rect(region, x, y); - Drawf.liquid(liquidRegion, x, y, liquids.total() / liquidCapacity, liquids.current().color); + super.drawCracks(); + + Drawf.liquid(liquidRegion, x, y, liquids.get(result) / liquidCapacity, result.color); Drawf.spinSprite(rotatorRegion, x, y, pumpTime * rotateSpeed); Draw.rect(topRegion, x, y); } @@ -135,7 +146,7 @@ public class SolidPump extends Pump{ } public float typeLiquid(){ - return liquids.total(); + return liquids.get(result); } } } diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt index 8b0405139b..ce586ebece 100644 --- a/fastlane/metadata/android/ja-JP/full_description.txt +++ b/fastlane/metadata/android/ja-JP/full_description.txt @@ -1,14 +1,48 @@ -ベルトコンベアーを巧みに配置して、弾薬をタレットに送り込み、建設に必要な材料を集めて、敵からコアを守り切ろう。あなたのフレンドとクロスプラットフォームでマルチプレイして、お互いに協力したり、チームで戦ったりしよう。 +ベルトコンベアで緻密なサプライチェーンを作成し、弾薬をタレットに送り込んだり、建築する為の資材を生産したりして、敵の襲撃から建造物を守るゲームです。クロスプラットフォームのマルチプレイに対応していて、友達と協力して遊んだり、チームに分かれて PvP で戦う事もできます。 -Mindustryの特徴: -- 24個のマップ -- テックツリーや新しいエリアの解放を目指す -- 4つのパワフルなボス -- 電気、液体、アイテムの輸送システム -- 19個の個性的なドローンや機体 -- 120以上のテクノロジーブロックを使いこなす -- 75以上の異なる環境ブロック -- ローカルネットワークや専用サーバーで、クロスプラットフォームのマルチプレイが可能 -- カスタマイズ可能なゲーム: ブロックのコスト変更、敵のステータス、初期アイテム、ウェーブのタイミング など… -- 強力なエディター、鉱石をランダムに生成したり、地形、デコレーション、左右対称なマップも制作可能 -- マップごとにウェーブの構成もカスタマイズ可能 +

ゲームについて

+- 工場を建て、多種多様な資源や製品を製造していきましょう。 +- 敵の襲撃から建造物を守ってください。 +- クロスプラットフォームでのマルチプレイに対応。友達と協力して遊んだり、もしくはチームに分かれて PvP で戦う事ができます。 +- 液体を分配して火災や敵の空襲に立ち向かいましょう。 +- 冷却水や潤滑剤を供給することで、生産効率を高める事ができます。 +- 多種多様なユニットを生産し、自分の基地を自動管理させたり、敵基地を攻撃したりしましょう。 + +

キャンペーンモード

+ +- 250以上もの自動的に生成されたセクターや、16のマップで構成された惑星「セルプロ」を攻略しましょう。 +- 領土を獲得し、工場を設立して資源を生成しながら他のセクターも同時に制圧していきましょう。 +- 定期的に来る敵の侵略から自分のセクターを守り抜いて下さい。 +- 発射台を使用して、各セクターに効率よく資源を配分していきましょう。 +- 研究を進めてセクターを進化させていきましょう。 +- 友達を呼んで一緒に攻略する事もできます。 +- 130種類以上ものブロックを使いこなしていきましょう。 +- 33種類ものドローン・ロボット・船が登場! +- 50種類以上の実績をコンプリートしましょう + +

ゲームモード

+ +- サバイバル: タワーディフェンス型のゲームで、タレットを建てて敵から守りましょう。できるだけ長く生き残るために、コアを起動して、集めた資源を研究に使いましょう。空を飛ぶボスからの攻撃に備えて、基地を準備しましょう。 +- アタック: 工場を建設し敵のコアを破壊しましょう。同時に、敵襲から自分のコアも守りましょう。様々な種類の攻撃ユニットや支援ユニットがあなたをサポートしてくれます。防衛施設を建設する敵の AI オプションを有効にすれば更に難易度が上がります。 +- PvP: 最大4チームで戦い、他のチームのコアを破壊する事を目指します。ユニットを製造するか、敵の基地をタレットで直接狙いましょう。 +- サンドボックス: リソースは無限で襲撃する敵もいません。サンドボックス用のアイテムソース・液体ソースを利用してデザインを見たり、必要に応じて敵を召喚して防衛能力を確かめたりする事もできます。 + +

カスタムゲーム & クロスプラットフォームマルチプレイ

+ +- キャンペーンモードに加え、カスタムゲーム用に 16 のマップを用意しています。 +- 協力モードもよし、対戦もよし、サンドボックスもよし。 +- 公開サーバーに参加したり、友達とプライベートセッションを楽しんだり。 +- ゲームルールを変更する事もできます:建設コスト、敵のスタッツ、開始時のアイテム、ウェーブの間隔等… +- ミックスゲームモード: PvP と PvE を同時にやる事も…!? + +

マップエディター

+ +- エディターを使って地形を作りましょう。 +- ゲーム内で建築物を編集する事もできます。 +- ツールモードを変更する事で様々なツールを使えます。 +- 地形を自由に自動的に生成する為のマップ生成システムをご用意しています。 +- ノイズ、歪み、スムージング、侵食、対称化、鉱石生成を駆使し、ランダムな地形を生成していきましょう。 +- 鉱石や川の生成もランダムに行う事ができます。 +- 敵のウェーブを設定する事も可能です。 +- マップ別にルールを設定する事もできます。 +- 地形用のブロックは80種類以上! diff --git a/fastlane/metadata/android/ja-JP/summary.txt b/fastlane/metadata/android/ja-JP/summary.txt new file mode 100644 index 0000000000..093c9d2745 --- /dev/null +++ b/fastlane/metadata/android/ja-JP/summary.txt @@ -0,0 +1 @@ +工場ベースのサンドボックスタワーディフェンスゲーム。 diff --git a/fastlane/metadata/steam/japanese/achievements.vdf b/fastlane/metadata/steam/japanese/achievements.vdf new file mode 100644 index 0000000000..4aae36fb5d --- /dev/null +++ b/fastlane/metadata/steam/japanese/achievements.vdf @@ -0,0 +1,115 @@ +"lang" +{ + "Language" "japanese" + "Tokens" + { + "NEW_ACHIEVEMENT_20_1_NAME" "解体業者" + "NEW_ACHIEVEMENT_20_1_DESC" "敵ユニットを 1,000 体破壊する。" + "NEW_ACHIEVEMENT_20_2_NAME" "粛清" + "NEW_ACHIEVEMENT_20_2_DESC" "敵ユニットを 100,000 体破壊する。" + "NEW_ACHIEVEMENT_20_5_NAME" "エンドレス出荷" + "NEW_ACHIEVEMENT_20_5_DESC" "アイテムを合計で 100,000 個打ち上げる。" + "NEW_ACHIEVEMENT_20_6_NAME" "征服者" + "NEW_ACHIEVEMENT_20_6_DESC" "アタックモードで 10 回勝利する。" + "NEW_ACHIEVEMENT_20_7_NAME" "勝者" + "NEW_ACHIEVEMENT_20_7_DESC" "マルチプレイの PvP で 10 回勝利する。" + "NEW_ACHIEVEMENT_20_8_NAME" "電撃戦" + "NEW_ACHIEVEMENT_20_8_DESC" "アタックモードで 5 ウェーブ以内に敵のコアを破壊する。" + "NEW_ACHIEVEMENT_20_9_NAME" "コアの雨" + "NEW_ACHIEVEMENT_20_9_DESC" "コアを 30 回発射させる。" + "NEW_ACHIEVEMENT_20_10_NAME" "粘り強く" + "NEW_ACHIEVEMENT_20_10_DESC" "100 ウェーブ生存する。" + "NEW_ACHIEVEMENT_20_12_NAME" "研究者" + "NEW_ACHIEVEMENT_20_12_DESC" "あらゆる物を研究する。" + "NEW_ACHIEVEMENT_20_14_NAME" "過負荷" + "NEW_ACHIEVEMENT_20_14_DESC" "水に濡れた敵に電撃を浴びせる。" + "NEW_ACHIEVEMENT_20_15_NAME" "偏向" + "NEW_ACHIEVEMENT_20_15_DESC" "弾を反射させて敵を倒す。" + "NEW_ACHIEVEMENT_20_17_NAME" "大きな過ち" + "NEW_ACHIEVEMENT_20_17_DESC" "ルーターを研究する。" + "NEW_ACHIEVEMENT_20_18_NAME" "作る" + "NEW_ACHIEVEMENT_20_18_DESC" "ブロックを 10,000 個設置する。" + "NEW_ACHIEVEMENT_20_19_NAME" "消す" + "NEW_ACHIEVEMENT_20_19_DESC" "敵のブロックを 1,000 個破壊する。" + "NEW_ACHIEVEMENT_20_20_NAME" "災難" + "NEW_ACHIEVEMENT_20_20_DESC" "トリウムリアクターをオーバーヒートさせて爆発させる。" + "NEW_ACHIEVEMENT_20_21_NAME" "地図製作家" + "NEW_ACHIEVEMENT_20_21_DESC" "新しいマップを 10 個作る。" + "NEW_ACHIEVEMENT_20_22_NAME" "閲覧者" + "NEW_ACHIEVEMENT_20_22_DESC" "ワークショップからマップをダウンロードする。" + "NEW_ACHIEVEMENT_20_23_NAME" "クリエイター" + "NEW_ACHIEVEMENT_20_23_DESC" "ワークショップにマップを公開する。" + "NEW_ACHIEVEMENT_20_24_NAME" "スレイヤー" + "NEW_ACHIEVEMENT_20_24_DESC" "ボスを倒す。" + "NEW_ACHIEVEMENT_20_25_NAME" "探索家" + "NEW_ACHIEVEMENT_20_25_DESC" "キャンペーンモードで全ゾーンを開放する。" + "NEW_ACHIEVEMENT_20_29_NAME" "素材 II" + "NEW_ACHIEVEMENT_20_29_DESC" "トリウムを手に入れる。" + "NEW_ACHIEVEMENT_20_31_NAME" "素材 I" + "NEW_ACHIEVEMENT_20_31_DESC" "チタンを手に入れる。" + "NEW_ACHIEVEMENT_21_0_NAME" "神風特攻" + "NEW_ACHIEVEMENT_21_0_DESC" "爆発するアイテムを一杯に持った状態で機体を破壊される。" + "NEW_ACHIEVEMENT_21_1_NAME" "はじまり" + "NEW_ACHIEVEMENT_21_1_DESC" "陸軍工場を作る。" + "NEW_ACHIEVEMENT_21_2_NAME" "直接攻撃" + "NEW_ACHIEVEMENT_21_2_DESC" "司令塔を使って攻撃を命令する。" + "NEW_ACHIEVEMENT_21_3_NAME" "大群" + "NEW_ACHIEVEMENT_21_3_DESC" "ユニットを 100 体稼働させた状態にする。" + "NEW_ACHIEVEMENT_21_4_NAME" "群れる" + "NEW_ACHIEVEMENT_21_4_DESC" "ポリを 10 体稼働させた状態にする。" + "NEW_ACHIEVEMENT_21_5_NAME" "ロボット技術者" + "NEW_ACHIEVEMENT_21_5_DESC" "全種類のユニットを製造する。" + "NEW_ACHIEVEMENT_21_6_NAME" "軍団" + "NEW_ACHIEVEMENT_21_6_DESC" "累計でユニットを 1000 体製造する。" + "NEW_ACHIEVEMENT_21_9_NAME" "忠告は聞くべき" + "NEW_ACHIEVEMENT_21_9_DESC" "出現ポイントに入って殲滅される。" + "NEW_ACHIEVEMENT_21_10_NAME" "海軍ユニットを使ってみてはどう?" + "NEW_ACHIEVEMENT_21_10_DESC" "溺れる。" + "NEW_ACHIEVEMENT_21_11_NAME" "収集家" + "NEW_ACHIEVEMENT_21_11_DESC" "全種類のアイテムをコアの上限まで搬入する。" + "NEW_ACHIEVEMENT_21_12_NAME" "混雑" + "NEW_ACHIEVEMENT_21_12_DESC" "サーバーを立て、参加者数を10人にする。" + "NEW_ACHIEVEMENT_21_13_NAME" "難攻不落" + "NEW_ACHIEVEMENT_21_13_DESC" "メルトダウン、スペクター、フォーシャドウを建設する。" + "NEW_ACHIEVEMENT_21_14_NAME" "発射" + "NEW_ACHIEVEMENT_21_14_DESC" "発射台を使う。" + "NEW_ACHIEVEMENT_21_16_NAME" "異教" + "NEW_ACHIEVEMENT_21_16_DESC" "ルーターを 2 つ連続して設置する。" + "NEW_ACHIEVEMENT_21_17_NAME" "ソロ防衛" + "NEW_ACHIEVEMENT_21_17_DESC" "ブロックを一切置かずに 10 ウェーブ生存する。" + "NEW_ACHIEVEMENT_21_18_NAME" "火葬" + "NEW_ACHIEVEMENT_21_18_DESC" "ピラタイトをタレットに入れる。" + "NEW_ACHIEVEMENT_21_19_NAME" "効率" + "NEW_ACHIEVEMENT_21_19_DESC" "タレットを水か冷却水で冷却する。" + "NEW_ACHIEVEMENT_21_20_NAME" "クラシックモード" + "NEW_ACHIEVEMENT_21_20_DESC" "ピクセル化を有効にする。" + "NEW_ACHIEVEMENT_21_21_NAME" "学会" + "NEW_ACHIEVEMENT_21_21_DESC" "ゲーム内から Wiki を開く。" + "NEW_ACHIEVEMENT_21_22_NAME" "ヘッドスタート" + "NEW_ACHIEVEMENT_21_22_DESC" "アイテムを 10,000 個以上持って新しいゾーンに発射する。" + "NEW_ACHIEVEMENT_21_23_NAME" "点火" + "NEW_ACHIEVEMENT_21_23_DESC" "インパクトリアクターを起動する。" + "NEW_ACHIEVEMENT_21_24_NAME" "加速" + "NEW_ACHIEVEMENT_21_24_DESC" "惑星間加速器を起動する。" + "NEW_ACHIEVEMENT_21_25_NAME" "渦巻" + "NEW_ACHIEVEMENT_21_25_DESC" "まわるまわるよ世界は回る" + "NEW_ACHIEVEMENT_21_26_NAME" "エスカレーション" + "NEW_ACHIEVEMENT_21_26_DESC" "ティア 5 のユニットを製造する。" + "NEW_ACHIEVEMENT_21_27_NAME" "建築家" + "NEW_ACHIEVEMENT_21_27_DESC" "設計図を 20 個作る。" + "NEW_ACHIEVEMENT_21_28_NAME" "世界征服" + "NEW_ACHIEVEMENT_21_28_DESC" "セルプロの全セクターを制圧する。" + "NEW_ACHIEVEMENT_21_29_NAME" "空輸" + "NEW_ACHIEVEMENT_21_29_DESC" "ティア 5 のユニットをオクトで運ぶ。" + "NEW_ACHIEVEMENT_21_30_NAME" "究極の形" + "NEW_ACHIEVEMENT_21_30_DESC" "お前もそれにならないか?" + "NEW_ACHIEVEMENT_21_31_NAME" "生産 I" + "NEW_ACHIEVEMENT_21_31_DESC" "キャンペーンモードで生産速度が 5,000 アイテム/分 に到達する。" + "NEW_ACHIEVEMENT_26_0_NAME" "生産 II" + "NEW_ACHIEVEMENT_26_0_DESC" "キャンペーンモードで生産速度が 50,000 アイテム/分 に到達する。" + "NEW_ACHIEVEMENT_26_1_NAME" "確固たる勝利" + "NEW_ACHIEVEMENT_26_1_DESC" "セクターでプレイしている最中に他のセクターを制圧する。" + "NEW_ACHIEVEMENT_26_2_NAME" "小さな王様" + "NEW_ACHIEVEMENT_26_2_DESC" "10 セクターを支配下に置く。" + } +} diff --git a/fastlane/metadata/steam/japanese/description.txt b/fastlane/metadata/steam/japanese/description.txt new file mode 100644 index 0000000000..422e54c62f --- /dev/null +++ b/fastlane/metadata/steam/japanese/description.txt @@ -0,0 +1,64 @@ +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]ゲームについて[/h2] + +[list] +[*] ベルトコンベアで緻密なサプライチェーンを作成し、弾薬をタレットに送り込んだり、建築する為の資材を生産したりするゲームです。 +[*] 敵の襲撃から建造物を守ってください。 +[*] クロスプラットフォームでのマルチプレイに対応。友達と協力して遊んだり、もしくはチームに分かれて PvP で戦う事ができます。 +[*] 液体を分配して火災や敵の空襲に立ち向かいましょう。 +[*] 冷却水や潤滑剤を供給することで、生産効率を高める事ができます。 +[*] 多種多様なユニットを生産し、自分の基地を自動管理させたり、敵基地を攻撃したりしましょう。 +[/list] + +[img]{STEAM_APP_IMAGE}/extras/ezgif-1-8679abe089cd.gif[/img] + +[h2]キャンペーンモード[/h2] + +[list] +[*] 250以上もの自動的に生成されたセクターや、16のマップで構成された惑星「セルプロ」を攻略しましょう。 +[*] 領土を獲得し、工場を設立して資源を生成しながら他のセクターも同時に制圧していきましょう。 +[*] 定期的に来る敵の侵略から自分のセクターを守り抜いて下さい。 +[*] 発射台を使用して、各セクターに効率よく資源を配分していきましょう。 +[*] 研究を進めてセクターを進化させていきましょう。 +[*] 友達を呼んで一緒に攻略する事もできます。 +[*] 130種類以上ものブロックを使いこなしていきましょう。 +[*] 33種類ものドローン・ロボット・船が登場! +[*] 50種類以上の実績をコンプリートしましょう +[/list] + +[h2]ゲームモード[/h2] + +[list] +[*] [b]サバイバル[/b]: タワーディフェンス型のゲームで、タレットを建てて敵から守りましょう。できるだけ長く生き残るために、コアを起動して、集めた資源を研究に使いましょう。空を飛ぶボスからの攻撃に備えて、基地を準備しましょう。 +[*] [b]アタック[/b]: 工場を建設し敵のコアを破壊しましょう。同時に、敵襲から自分のコアも守りましょう。様々な種類の攻撃ユニットや支援ユニットがあなたをサポートしてくれます。防衛施設を建設する敵の AI オプションを有効にすれば更に難易度が上がります。 +[*] [b]PvP[/b]: 最大4チームで戦い、他のチームのコアを破壊する事を目指します。ユニットを製造するか、敵の基地をタレットで直接狙いましょう。 +[*] [b]サンドボックス[/b]: リソースは無限で襲撃する敵もいません。サンドボックス用のアイテムソース・液体ソースを利用してデザインを見たり、必要に応じて敵を召喚して防衛能力を確かめたりする事もできます。 +[/list] + +[img]{STEAM_APP_IMAGE}/extras/2020-11-30_10-46-02.gif[/img] + +[h2]カスタムゲーム & クロスプラットフォームマルチプレイ[/h2] + +[list] +[*] キャンペーンモードに加え、カスタムゲーム用に 16 のマップを用意しています。 +[*] 協力モードもよし、対戦もよし、サンドボックスもよし。 +[*] 公開サーバーに参加したり、友達とプライベートセッションを楽しんだり。 +[*] ゲームルールを変更する事もできます:建設コスト、敵のスタッツ、開始時のアイテム、ウェーブの間隔等… +[*] ミックスゲームモード: PvP と PvE を同時にやる事も…!? +[/list] + +[h2]マップエディター[/h2] + +[list] +[*] エディターを使って地形を作りましょう。 +[*] ゲーム内で建築物を編集する事もできます。 +[*] ツールモードを変更する事で様々なツールを使えます。 +[*] 地形を自由に自動的に生成する為のマップ生成システムをご用意しています。 +[*] ノイズ、歪み、スムージング、侵食、対称化、鉱石生成を駆使し、ランダムな地形を生成していきましょう。 +[*] 鉱石や川の生成もランダムに行う事ができます。 +[*] 敵のウェーブを設定する事も可能です。 +[*] 完成したマップは Steam Workshop で公開しましょう! +[*] マップ別にルールを設定する事もできます。 +[*] 地形用のブロックは80種類以上! +[/list] diff --git a/gradle.properties b/gradle.properties index 2bb25b051a..b3ec89f9e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,4 +11,4 @@ android.useAndroidX=true #used for slow jitpack builds; TODO see if this actually works http.socketTimeout=80000 http.connectionTimeout=80000 -archash=95a66af563dfad96ecc4992bd0ab36b07a14e28b +archash=7e96b986053ce489aae161aa6bcbb5d921c609d4 diff --git a/servers_v6.json b/servers_v6.json index e481eaf248..59224c074f 100644 --- a/servers_v6.json +++ b/servers_v6.json @@ -29,7 +29,7 @@ }, { "name": "Ranked", - "address": ["mindustryranked.ddns.net:16567"] + "address": ["mindustryranked.ddns.net:16567", "mindustryranked.ddns.net:16568", "mindustryranked.ddns.net:16569"] }, { "name": "TWS",