mirror of
https://github.com/Anuken/Mindustry.git
synced 2026-10-03 20:00:26 +03:00
Compare commits
80
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e453f3ccc7 | ||
|
|
2d1852470e | ||
|
|
5ef7c8bce8 | ||
|
|
1afa757f3b | ||
|
|
692c4c65e4 | ||
|
|
de5c858903 | ||
|
|
2effc25ad0 | ||
|
|
ca7f9662e2 | ||
|
|
b56d235233 | ||
|
|
60b4e9a0d7 | ||
|
|
0e5d6d1252 | ||
|
|
4da35f91d9 | ||
|
|
e6b17adf3a | ||
|
|
d22a2995a3 | ||
|
|
32dd187421 | ||
|
|
2bdedfed25 | ||
|
|
9d967277cd | ||
|
|
d925a0a1b2 | ||
|
|
b1135371ac | ||
|
|
40bf89df32 | ||
|
|
84d23af453 | ||
|
|
4e28dbbf09 | ||
|
|
5ce1b5acb3 | ||
|
|
0c31df6630 | ||
|
|
f681ce9036 | ||
|
|
9147b69c3a | ||
|
|
2ecc7ff340 | ||
|
|
991310be92 | ||
|
|
7359e05412 | ||
|
|
f5133aa8e3 | ||
|
|
35306423b5 | ||
|
|
69f95ee396 | ||
|
|
559b64b3ac | ||
|
|
4747ee35be | ||
|
|
ff84208703 | ||
|
|
1f1df02356 | ||
|
|
143585bd39 | ||
|
|
59347a3de1 | ||
|
|
ac25174a95 | ||
|
|
b6b42bad9d | ||
|
|
ffffd5751d | ||
|
|
fc867d38e6 | ||
|
|
9c98602f9a | ||
|
|
cc278a3a6e | ||
|
|
2dd86456cf | ||
|
|
e43d2db0d6 | ||
|
|
33a8406bd3 | ||
|
|
66be97ee47 | ||
|
|
45e44fd8bc | ||
|
|
479b3854ba | ||
|
|
0293c2a3a8 | ||
|
|
a10f4455f7 | ||
|
|
a586a34f36 | ||
|
|
fcf3f83737 | ||
|
|
24adf22c53 | ||
|
|
0e4d0f6216 | ||
|
|
3e4de7df52 | ||
|
|
ed130b1bac | ||
|
|
96e73c89d8 | ||
|
|
b8fc1a70ed | ||
|
|
6175104b0e | ||
|
|
d6400c573a | ||
|
|
a96611a68c | ||
|
|
aa82a26e1d | ||
|
|
dfcfabec66 | ||
|
|
04e74cba01 | ||
|
|
7542587558 | ||
|
|
5a83175d96 | ||
|
|
4f43020509 | ||
|
|
81841ad35a | ||
|
|
82d1df7445 | ||
|
|
b7b8c61d47 | ||
|
|
0672e7f37e | ||
|
|
7f67b1dbce | ||
|
|
368e787f89 | ||
|
|
de2cba940d | ||
|
|
54e2c15ae4 | ||
|
|
fad7afb97e | ||
|
|
d5c78639f3 | ||
|
|
b91d26c509 |
@@ -31,6 +31,13 @@
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="mindustry"/>
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
|
||||
</application>
|
||||
|
||||
@@ -60,7 +60,7 @@ android{
|
||||
def versionNameResult = "$versionNumber-$versionType-${getBuildVersion().replace(" ", "-")}"
|
||||
|
||||
applicationId "io.anuke.mindustry"
|
||||
minSdkVersion 14
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 36
|
||||
|
||||
versionName versionNameResult
|
||||
|
||||
@@ -685,13 +685,18 @@ public class EntityProcess extends BaseProcessor{
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
MethodSpec.Builder groupUpdate = MethodSpec.methodBuilder("update")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
MethodSpec.Builder groupPoolUpdate = MethodSpec.methodBuilder("updatePooling")
|
||||
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
//free everything pooled at the start of each updaet
|
||||
groupUpdate
|
||||
groupPoolUpdate
|
||||
.addStatement("for($T p : freeQueue) $T.free(p)", Poolable.class, Pools.class)
|
||||
.addStatement("freeQueue.clear()");
|
||||
|
||||
groupUpdate.addStatement("updatePooling()");
|
||||
|
||||
//method resize
|
||||
for(GroupDefinition group : groupDefs){
|
||||
if(group.spatial){
|
||||
@@ -713,6 +718,7 @@ public class EntityProcess extends BaseProcessor{
|
||||
}
|
||||
|
||||
groupsBuilder.addMethod(groupResize.build());
|
||||
groupsBuilder.addMethod(groupPoolUpdate.build());
|
||||
groupsBuilder.addMethod(groupUpdate.build());
|
||||
|
||||
write(groupsBuilder);
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 3.5 KiB |
@@ -536,7 +536,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Data Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets found.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -548,6 +547,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1097,6 +1097,7 @@ settings.resetKey = Reset
|
||||
settings.controls = Controls
|
||||
settings.game = Game
|
||||
settings.sound = Sound
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Graphics
|
||||
settings.cleardata = Clear Game Data...
|
||||
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
|
||||
@@ -1425,6 +1426,9 @@ setting.milliseconds = {0} milliseconds
|
||||
setting.fullscreen.name = Fullscreen
|
||||
setting.fps.name = Show FPS & Ping
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1454,7 +1458,8 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Adapt interface to display notch
|
||||
setting.macnotch.description = Restart required to apply changes
|
||||
steam.friendsonly = Friends Only
|
||||
|
||||
steam.friendsonly = Steam Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
setting.minmagnificationmultiplierpercent.name = Max Camera Distance
|
||||
@@ -2311,7 +2316,7 @@ ff.arc = :arc: [accent]Arc[] turrets require power to function. Research and pla
|
||||
fungalpass.tutorial1 = Use [accent]units[] to defend buildings and attack the enemy.\nResearch and place a :ground-factory: [accent]ground factory[].
|
||||
fungalpass.tutorial2 = Select :dagger: [accent]Dagger[] units in the factory.\nProduce 3 units.
|
||||
|
||||
frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Research and reconstruct\na []:dagger:[accent] dagger to a []:mace:[accent] mace.
|
||||
frontier.tutorial1 = The :additive-reconstructor: [accent]Additive Reconstructor[]\nupgrades tier 1 units to tier 2\nusing :silicon: silicon and :graphite: graphite.\n\n[accent]Reconstruct a []:dagger:[accent] dagger\nto a []:mace:[accent] mace.
|
||||
frontier.tutorial2 = Enemy waves send [accent]infinitely[] until all enemy cores are [unlaunched]destroyed.
|
||||
frontier.tutorial3 = [accent]Attack the enemy base fast to prevent waves from getting too high[].
|
||||
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Патчы кантэнту
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Няма загружаных набораў патчаў.
|
||||
patch.errors = Памылка набору патчаў
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} Паля
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Скінуць
|
||||
settings.controls = Кіраванне
|
||||
settings.game = Гульня
|
||||
settings.sound = Гук
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Графіка
|
||||
settings.cleardata = Ачысціць Гульнявыя Дадзеныя...
|
||||
settings.clear.confirm = Вы сапраўды хочаце ачысціць свае дадзеныя? \nГэта нельга адмяніць!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} мілісекунд
|
||||
setting.fullscreen.name = Поўнаэкранны рэжым
|
||||
setting.fps.name = Паказваць FPS і пінг
|
||||
setting.console.name = Уключыць Тэрмінал
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Павольная Камера
|
||||
setting.detach-camera.name = Вольная камера
|
||||
setting.detach-camera.description = Калі ўключана, камера рухаецца незалежна ад гульца.\nГэтую наладу можна змяняць на гарачую клавішу.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Паказаць Анімацыю Надвор'я
|
||||
setting.hidedisplays.name = Схаваць Лагічныя экраны
|
||||
setting.macnotch.name = Адаптуйце інтэрфейс для адлюстравання выемкі
|
||||
setting.macnotch.description = Каб змены ўжыліся патрабуецца перазапуск
|
||||
|
||||
steam.friendsonly = Толькі сябры
|
||||
steam.friendsonly.tooltip = Толькі сябры з Steam моргуць зайсці у вашу гульню.\nУбярыце птушачку адсюль і гульня стане публічнай - Кожны зможа зайсці.
|
||||
setting.maxmagnificationmultiplierpercent.name = Мін. дыстанцыя камеры
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Нулирай
|
||||
settings.controls = Управление
|
||||
settings.game = Игра
|
||||
settings.sound = Звук
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Графики
|
||||
settings.cleardata = Изчисти данните на играта...
|
||||
settings.clear.confirm = Сигурни ли сте, че искате да изтриете данните на играта?\nСтореното не може да бъде отменено!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} милисекунди
|
||||
setting.fullscreen.name = Цял екран
|
||||
setting.fps.name = Показвай FPS & пинг
|
||||
setting.console.name = Включване на конзолата
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Гладка камера
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Показвай графики за климата
|
||||
setting.hidedisplays.name = Скрий логическите екрани
|
||||
setting.macnotch.name = Адаптирайте интерфейса за показване на прорез
|
||||
setting.macnotch.description = За прилагане на промените е необходимо рестартиране
|
||||
|
||||
steam.friendsonly = Само приятели
|
||||
steam.friendsonly.tooltip = Дали вашите приятели от Steam ще могат да се включат в играта ви.\nИзключването на тази опция ще направи играта Ви публична и всеки ще може да се присъедини.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Pedaços de continguts
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No s’han carregat pedaços.
|
||||
patch.errors = Errors del conjunt de pedaços
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} camps
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Restableix
|
||||
settings.controls = Controls
|
||||
settings.game = Joc
|
||||
settings.sound = So
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Gràfics
|
||||
settings.cleardata = Esborra les dades de la partida
|
||||
settings.clear.confirm = Esteu segur que voleu esborrar les dades?\nAquesta acció no es pot desfer.
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} ms
|
||||
setting.fullscreen.name = Pantalla completa
|
||||
setting.fps.name = Mostra els FPS i el ping
|
||||
setting.console.name = Activa la consola
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Moviment de càmera suau
|
||||
setting.detach-camera.name = Càmera lliure
|
||||
setting.detach-camera.description = Si s’activa, la càmera es mou independentment de la unitat del jugador.\nA aquesta opció se li pot assignar una tecla de drecera.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Mostra l’estat meteorològic
|
||||
setting.hidedisplays.name = Amaga els monitors lògics
|
||||
setting.macnotch.name = Adapta la interfície per a mostrar el notch
|
||||
setting.macnotch.description = Cal reiniciar perquè s’apliquin els canvis
|
||||
|
||||
steam.friendsonly = Només amics
|
||||
steam.friendsonly.tooltip = Indica si només els amics de Steam podran unir-se a la vostra partida.\nSi no es selecciona aquesta opció, la vostra partida serà pública i s’hi podrà unir qualsevol jugador.
|
||||
setting.maxmagnificationmultiplierpercent.name = Distància mín. de la càmera
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Záplaty obsahu
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Nejsou načteny žádné sady záplat.
|
||||
patch.errors = Chyby sady záplat
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} polí
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Původní
|
||||
settings.controls = Ovládání
|
||||
settings.game = Hra
|
||||
settings.sound = Zvuky
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafika
|
||||
settings.cleardata = Vymazat data hry...
|
||||
settings.clear.confirm = Jsi si jistý, že chceš vymazat svá data ve hře?\nTento krok je nevratný!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisekund
|
||||
setting.fullscreen.name = Celá obrazovka
|
||||
setting.fps.name = Ukázat FPS a ping
|
||||
setting.console.name = Povolit Konzoli
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Plynulá kamera
|
||||
setting.detach-camera.name = Volná kamera
|
||||
setting.detach-camera.description = Pokud je zapnuto, kamera se pohybuje nezávisle na hráčově jednotce.\nTomuto nastavení lze přiřadit klávesovou zkratku.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Zobrazit Grafiku Počasí
|
||||
setting.hidedisplays.name = Skrýt displeje logiky
|
||||
setting.macnotch.name = Přizpůsobte rozhraní zobrazení zářezu
|
||||
setting.macnotch.description = Pro aplikování změn je potřeba restart
|
||||
|
||||
steam.friendsonly = Pouze pro přátele
|
||||
steam.friendsonly.tooltip = Určuje, zda bude hra přístupná jen tvým přátelům na Steamu, nebo všem. Odškrtnutí udělá hru veřejnou - připojit se bude moci každý.
|
||||
setting.maxmagnificationmultiplierpercent.name = Minimální vzdálenost kamery
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Nulstil
|
||||
settings.controls = Styring
|
||||
settings.game = Spil
|
||||
settings.sound = Lyd
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafik
|
||||
settings.cleardata = Ryd spildata...
|
||||
settings.clear.confirm = Er du helt sikker på at du vil rydde alt data?\nDet, der gøres, kan ikke gøres om!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millesekunder
|
||||
setting.fullscreen.name = Fuldskærm
|
||||
setting.fps.name = Vis FPS & Ping
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Blødt kamera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Tilpas grænsefladen til at vise hak
|
||||
setting.macnotch.description = Genstart påkrævet for at anvende ændringer
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Zurücksetzen
|
||||
settings.controls = Steuerung
|
||||
settings.game = Spiel
|
||||
settings.sound = Audio
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafik
|
||||
settings.cleardata = Spieldaten zurücksetzen...
|
||||
settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} Millisekunden
|
||||
setting.fullscreen.name = Vollbild
|
||||
setting.fps.name = FPS anzeigen
|
||||
setting.console.name = Konsole freigeben
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Sanfte Kamerabewegungen
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Wetter anzeigen
|
||||
setting.hidedisplays.name = Logik-Bildschirme verdecken
|
||||
setting.macnotch.name = Benutzeroberfläche an Aussparung anpassen
|
||||
setting.macnotch.description = Neustart erforderlich
|
||||
|
||||
steam.friendsonly = Nur Freunde
|
||||
steam.friendsonly.tooltip = Ob nur Steam-Freunde deinem Spiel beitreten können.\nDiese Einstellung zu deaktivieren macht dein Spiel öffentlich - jeder kann beitreten.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Kameradistanz
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Parches de datos
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No hay conjuntos de parches cargados.
|
||||
patch.errors = Errores del conjunto de parches
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} campos
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Reiniciar
|
||||
settings.controls = Controles
|
||||
settings.game = Juego
|
||||
settings.sound = Sonido
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Gráficos
|
||||
settings.cleardata = Eliminar datos del juego...
|
||||
settings.clear.confirm = ¿Quieres eliminar estos datos?\n¡Esta acción no se puede deshacer!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisegundos
|
||||
setting.fullscreen.name = Pantalla completa
|
||||
setting.fps.name = Mostrar FPS y ping
|
||||
setting.console.name = Activar consola
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Movimiento de cámara suave
|
||||
setting.detach-camera.name = Cámara libre
|
||||
setting.detach-camera.description = Si se habilita, la cámara se mueve independientemente de la unidad del jugador.\nEsta configuración puede ser asignada a una tecla.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Efectos visuales climáticos
|
||||
setting.hidedisplays.name = Ocultar pantallas lógicas
|
||||
setting.macnotch.name = Adaptar la interfaz para mostrar la muesca
|
||||
setting.macnotch.description = Es necesario reiniciar para aplicar los cambios
|
||||
|
||||
steam.friendsonly = Solo amigos
|
||||
steam.friendsonly.tooltip = Si solo los amigos de Steam podrán unirse a tu partida.\nDesmarcar esta opción hará tu partida pública - cualquiera podrá unirse.
|
||||
setting.maxmagnificationmultiplierpercent.name = Distancia de cámara mínima
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Reset
|
||||
settings.controls = Juhtnupud
|
||||
settings.game = Mäng
|
||||
settings.sound = Heli
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Graafika
|
||||
settings.cleardata = Kustuta mänguandmed...
|
||||
settings.clear.confirm = Oled kindel, et soovid olemasolevad\nsätted kustutada?\n[accent]Seda ei saa tagasi võtta!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milliseconds
|
||||
setting.fullscreen.name = Täisekraan
|
||||
setting.fps.name = Näita kaadrite arvu sekundis
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Kohandage liidest sälku kuvamiseks
|
||||
setting.macnotch.description = Muudatuste rakendamiseks on vaja taaskäivitada
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Eduki adabakiak
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Ez dago adabaki multzorik kargatuta.
|
||||
patch.errors = Adabaki multzoen erroreak
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} eremuak
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Berrezarri
|
||||
settings.controls = Kontrolak
|
||||
settings.game = Jolasa
|
||||
settings.sound = Soinua
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafikoak
|
||||
settings.cleardata = Garbitu jolasaren datuak...
|
||||
settings.clear.confirm = Ziur datu hauek garbitu nahi dituzula?\nEgindakoa ezin da desegin!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisegundo
|
||||
setting.fullscreen.name = Pantaila osoa
|
||||
setting.fps.name = Erakutsi FPS
|
||||
setting.console.name = Gaitu kontsola
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Kamera leuna
|
||||
setting.detach-camera.name = Kamera librea
|
||||
setting.detach-camera.description = Gaituta badago, kamera jokalari unitatearekiko independenteki mugitzen da.\nEzarpen honi laster-tekla bat esleitu dakioke.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Erakutsi eguraldi grafikoak
|
||||
setting.hidedisplays.name = Ezkutatu pantaila logikoak
|
||||
setting.macnotch.name = Egokitu interfazea bistaratzeko
|
||||
setting.macnotch.description = Berrabiarazi behar da aldaketak aplikatzeko
|
||||
|
||||
steam.friendsonly = Lagunak bakarrik
|
||||
steam.friendsonly.tooltip = Bai, Steam lagunak bakarrik sartu ahal izango dira zure jokoan.\nKutxa hau desblokeatzeak zure jokoa publiko egingo du. Edonork bat egin dezake.
|
||||
setting.maxmagnificationmultiplierpercent.name = Kameraren distantzia minimoa
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Aseta Uudelleen
|
||||
settings.controls = Kontrollit
|
||||
settings.game = Peli
|
||||
settings.sound = Ääni
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafiikat
|
||||
settings.cleardata = Tyhjennä Pelin Data...
|
||||
settings.clear.confirm = Oletko varma että haluat tyhjentää pelin datan?\nTätä ei voi peruuttaa!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millisekuntia
|
||||
setting.fullscreen.name = Täysnäyttö
|
||||
setting.fps.name = Näytä FPS
|
||||
setting.console.name = Salli konsoli
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Pehmeä kamera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Näytä säägrafiikat
|
||||
setting.hidedisplays.name = Piilota logiikkanäytöt
|
||||
setting.macnotch.name = Mukauta käyttöliittymä näyttämään lovi
|
||||
setting.macnotch.description = Muutosten toteuttaminen vaatii uudelleenkäynnistyksen
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = I-Reset
|
||||
settings.controls = Mga Controls
|
||||
settings.game = Game
|
||||
settings.sound = Sound
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Graphics
|
||||
settings.cleardata = I-Clear ang Game Data...
|
||||
settings.clear.confirm = Sigurado ka bang gusto mong i-clear ang data na ito?\nHindi na mababawi ang nagawa!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millisegundo
|
||||
setting.fullscreen.name = Fullscreen
|
||||
setting.fps.name = Ipakita ang FPS & Ping
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Iangkop ang interface upang ipakita ang bingaw
|
||||
setting.macnotch.description = Kinakailangan ang pag-restart upang mailapat ang mga pagbabago
|
||||
|
||||
steam.friendsonly = Mga Kaibigan lang
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Ensembles de patchs
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Aucun ensemble de patchs chargé.
|
||||
patch.errors = Erreurs dans l'ensemble de patchs
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} champs
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Réinitialiser
|
||||
settings.controls = Contrôles
|
||||
settings.game = Jeu
|
||||
settings.sound = Son
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Graphismes
|
||||
settings.cleardata = Effacer les données du jeu...
|
||||
settings.clear.confirm = Êtes-vous sûr de vouloir effacer ces données?\nAucun retour en arrière n'est possible !
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millisecondes
|
||||
setting.fullscreen.name = Plein Écran
|
||||
setting.fps.name = Afficher les FPS et le Ping
|
||||
setting.console.name = Activer la Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Lissage de la Caméra
|
||||
setting.detach-camera.name = Caméra libre
|
||||
setting.detach-camera.description = Si activée, la caméra se déplace indépendamment de l'unité du joueur.\nCette option peut être associée à une touche.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Montrer les Effets météo
|
||||
setting.hidedisplays.name = Cacher les Écrans
|
||||
setting.macnotch.name = Adapter l'interface pour afficher l'encoche
|
||||
setting.macnotch.description = Redémarrage du jeu nécessaire pour appliquer les changements
|
||||
|
||||
steam.friendsonly = Amis seulement
|
||||
steam.friendsonly.tooltip = Indique si seuls les amis Steam peuvent rejoindre votre partie.\nSi vous décochez cette case, votre partie deviendra publique et tout le monde pourra la rejoindre.
|
||||
setting.maxmagnificationmultiplierpercent.name = Distance min de la caméra
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Javítócsomag-adatok
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Nincsenek javítócsomagok betöltve.
|
||||
patch.errors = Javítócsomag-hibák
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} mező
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Vissza-\nállítás
|
||||
settings.controls = Irányítás
|
||||
settings.game = Játék
|
||||
settings.sound = Hangok
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafika
|
||||
settings.cleardata = Játékadatok törlése…
|
||||
settings.clear.confirm = Biztosan törlöd ezeket az adatokat?\nEzt a műveletet nem lehet visszavonni!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} ezredmásodperc
|
||||
setting.fullscreen.name = Teljes képernyő
|
||||
setting.fps.name = FPS, memóriahasználat és ping megjelenítése
|
||||
setting.console.name = Konzol engedélyezése
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Egyenletes kamera
|
||||
setting.detach-camera.name = Szabad kamera
|
||||
setting.detach-camera.description = Ha engedélyezve van, akkor a kamera a játékos által irányított egységtől (drón) függetlenül mozog.\nEz a beállítás hozzárendelhető egy gyorsbillentyűhöz.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Időjárás-grafika megjelenítése
|
||||
setting.hidedisplays.name = Logikai kijelzők elrejtése
|
||||
setting.macnotch.name = A felület igazítása a kijelző bevágásához
|
||||
setting.macnotch.description = A változtatások érvénybe lépéséhez újraindítás szükséges
|
||||
|
||||
steam.friendsonly = Csak barátok
|
||||
steam.friendsonly.tooltip = Meghatározza, hogy csak a Steam-barátok kapcsolódhassanak-e a játékodhoz.\nHa kikapcsolod, a játékod nyilvános lesz és bárki kapcsolódhat hozzá.
|
||||
setting.maxmagnificationmultiplierpercent.name = Legkisebb kameratávolság
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Patch Data
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Tidak ada patchset yang dimuat.
|
||||
patch.errors = Daftar Patchset Error
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} bidang
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Atur Ulang
|
||||
settings.controls = Kontrol
|
||||
settings.game = Permainan
|
||||
settings.sound = Suara
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafik
|
||||
settings.cleardata = Bersihkan Data Permainan...
|
||||
settings.clear.confirm = Apakah Anda yakin ingin membersihkan data ini?\nApa yang sudah dilakukan tidak dapat dibatalkan!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milidetik
|
||||
setting.fullscreen.name = Layar Penuh
|
||||
setting.fps.name = Tampilkan FPS & Ping
|
||||
setting.console.name = Hidupkan Konsol
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Kamera Halus
|
||||
setting.detach-camera.name = Kamera Bebas
|
||||
setting.detach-camera.description = Jika diaktifkan, kamera tidak akan mengikuti unit pemain.\nPengaturan ini dapat ditautkan ke keybind.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Tampilkan Cuaca
|
||||
setting.hidedisplays.name = Sembunyikan Tampilan Logika
|
||||
setting.macnotch.name = Sesuaikan tampilan dengan batas layar
|
||||
setting.macnotch.description = Mulai ulang diperlukan untuk menerapkan perubahan
|
||||
|
||||
steam.friendsonly = Hanya Teman
|
||||
steam.friendsonly.tooltip = Mengatur bisa atau tidaknya teman Steam bergabung ke permainanmu.\nMenghapus centang pada kotak ini akan membuat permainan Anda menjadi publik - siapa saja dapat bergabung.
|
||||
setting.maxmagnificationmultiplierpercent.name = Jarak Kamera Minimum
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Ripristina
|
||||
settings.controls = Controlli
|
||||
settings.game = Gioco
|
||||
settings.sound = Suoni
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafica
|
||||
settings.cleardata = Elimina Dati di Gioco
|
||||
settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millisecondi
|
||||
setting.fullscreen.name = Schermo Intero
|
||||
setting.fps.name = Mostra FPS e Ping
|
||||
setting.console.name = Attiva Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Visuale fluida
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Mostra grafica del meteo
|
||||
setting.hidedisplays.name = Nascondi display logici
|
||||
setting.macnotch.name = Adatta l'interfaccia per visualizzare la tacca
|
||||
setting.macnotch.description = Riavvio necessario per applicare le modifiche
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -331,10 +331,10 @@ cantconnect = ゲームに参加できませんでした。 ([accent]{0}[])
|
||||
connecting = [accent]接続中...
|
||||
reconnecting = [accent]再接続中...
|
||||
|
||||
connecting.establish = [accent]Establishing connection...
|
||||
receiving.world = [accent]Receiving world data ({0})...
|
||||
receiving.assets = [accent]Receiving assets ({0})...
|
||||
receiving.assets.fail = Error occurred while receiving assets.
|
||||
connecting.establish = [accent]接続を確立中...
|
||||
receiving.world = [accent]ワールドデータを受信中 ({0})...
|
||||
receiving.assets = [accent]アセットを受信中 ({0})...
|
||||
receiving.assets.fail = アセットの受信中にエラーが発生しました。
|
||||
|
||||
server.port = ポート:
|
||||
server.invalidport = 無効なポート番号です!
|
||||
@@ -352,10 +352,10 @@ save.export = エクスポート
|
||||
save.import.invalid = [accent]無効なセーブデータです!
|
||||
save.import.fail = [crimson]セーブデータのインポートに失敗しました: [accent]{0}
|
||||
save.export.fail = [crimson]セーブデータのエクスポートに失敗しました: [accent]{0}
|
||||
save.export.needsload = [scarlet]⚠ This save contains embedded assets.[]\nLoad into this save before exporting it.
|
||||
save.assets.missing = Missing Assets
|
||||
save.assets.missing.list = Asset List...
|
||||
save.assets.missing.info = [scarlet]⚠ This save contains missing assets![]\n\n[lightgray]This is likely because the save file was not properly exported.\n[lightgray]When sharing saves, only export through the in-game UI. Do not copy save files directly.\n[lightgray]If transferring files is necessary, make sure the [accent]assetCache[] folder is copied as well.
|
||||
save.export.needsload = [scarlet]⚠ このセーブには埋め込みアセットがあります。[]\nこのセーブに読み込んでからエクスポートしてください。
|
||||
save.assets.missing = 欠落アセット
|
||||
save.assets.missing.list = アセット一覧...
|
||||
save.assets.missing.info = [scarlet]⚠ このセーブには欠落しているアセットがあります![]\n\n[lightgray]これは、セーブファイルが正しくエクスポートされていないことが原因の可能性があります。\n[lightgray]セーブを共有する際は、必ずゲーム内UIからエクスポートしてください。セーブファイルを直接コピーしないでください。\n[lightgray]ファイルの転送が必要な場合は、[accent]assetCache[] フォルダも必ずコピーしてください。
|
||||
save.import = インポート
|
||||
save.newslot = セーブ名:
|
||||
save.rename = 名前を変更
|
||||
@@ -402,7 +402,7 @@ stance.shoot = 指示:発砲
|
||||
stance.holdfire = 指示:発砲控え
|
||||
stance.pursuetarget = 指示:追撃
|
||||
stance.patrol = 指示:偵察経路
|
||||
stance.holdposition = 指示:位置を保持
|
||||
stance.holdposition = 指示:位置を保持
|
||||
stance.ram = 指示: 突撃\n[lightgray]直線、経路捜索無し
|
||||
stance.boost = ブースト
|
||||
stance.mineauto = 自採掘掘
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = コンテンツパッチ
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]パッチセットは読み込みされていません
|
||||
patch.errors = パッチセットのエラー
|
||||
@@ -542,47 +541,48 @@ patch.fields = {0} フィールド
|
||||
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
asset.exportzip = Export Asset Zip
|
||||
asset.image.importzip = Import Zip
|
||||
asset.image.exportzip = Export Zip
|
||||
asset.clearall = Clear All
|
||||
asset.clearall.confirm = Are you sure that you want to clear [red]all[] assets from this map?\nThis includes images, audio, content, etc.
|
||||
asset.imports = Import Results
|
||||
asset.imported = [accent]{0} assets imported.
|
||||
asset.import.none = No valid asset files found in zip archive.
|
||||
asset.content.errors = Content Errors
|
||||
asset.content.add = Add Content
|
||||
images = 画像
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = 使用ガイド
|
||||
asset.bundle.exists = パスが'{0}'のバンドルはすでに存在します。
|
||||
asset.importzip = ZIPアセットをインポート
|
||||
asset.exportzip = ZIPアセットをエクスポート
|
||||
asset.image.importzip = ZIPをインポート
|
||||
asset.image.exportzip = ZIPをエクスポート
|
||||
asset.clearall = すべてを消去
|
||||
asset.clearall.confirm = このマップから[red]すべて[]のアセットを消去してもよろしいですか?\nこれには画像、音声、コンテンツなどが含まれます。
|
||||
asset.imports = インポート結果
|
||||
asset.imported = [accent]{0} 個のアセットをインポートしました。
|
||||
asset.import.none = ZIPアーカイブ内に有効なアセットファイルが見つかりませんでした。
|
||||
asset.content.errors = コンテンツエラー
|
||||
asset.content.add = コンテンツを追加
|
||||
asset.content.type = Type:
|
||||
asset.content.exists = [red]Content with that name already exists!
|
||||
asset.content.badname = [red]Invalid name! Most symbols are not allowed.
|
||||
asset.content.import.file = Import File
|
||||
asset.content.import.clipboard = Import From Clipboard
|
||||
asset.exists = An asset of that type with the same path/name already exists:\n[lightgray]{0}
|
||||
asset.broken = This asset file could not be located.\nThis can be caused by improper import of data, or an incorrectly exported save.
|
||||
asset.audio.invalid = Audio file could not be loaded.\nEnsure that it is a valid OGG or MP3 file.
|
||||
asset.delete.confirm = Are you sure you want to delete this asset?
|
||||
asset.images = Data Patch Images
|
||||
asset.image.imports = Import Results
|
||||
asset.image.imported = [accent]{0} images imported.
|
||||
asset.image.none = No valid PNG files found in zip archive.
|
||||
asset.image.error = [red]The following errors were encountered:[]
|
||||
asset.image.clearall.confirm = Are you certain that you wish to clear all images?
|
||||
asset.image.info = Image Info
|
||||
asset.image.toolarge = Image ([lightgray]{0}x{1}[]) is too large. Maximum size is {2}x{3}.
|
||||
asset.image.exists = An image with that path/name already exists:\n[lightgray]{0}
|
||||
asset.image.delete.confirm = Are you certain that you wish to delete this image?
|
||||
asset.image.name = [accent]File Name: [lightgray]{0}
|
||||
asset.image.region.name = [accent]Region Name: [lightgray]{0}
|
||||
asset.image.path = [accent]Path: [lightgray]{0}
|
||||
asset.image.env = [accent]Uses Environment Atlas: [lightgray]{0}
|
||||
asset.image.size = [accent]Size: [lightgray]{0}x{1}
|
||||
asset.image.filesize = [accent]File Size: [lightgray]{0}
|
||||
asset.image.packfailed = [red]⚠ Failed to pack sprite![]
|
||||
asset.image.packfailed.env = This is likely caused by a lack of space in the environment atlas.\nNote that environment sprites are limited to a 512x512 total area.
|
||||
asset.content.exists = [red]その名前のコンテンツはすでに存在します!
|
||||
asset.content.badname = [red]無効な名前です!ほとんどの符号は許可されていません。
|
||||
asset.content.import.file = ファイルをインポート
|
||||
asset.content.import.clipboard = クリップボードからインポート
|
||||
asset.exists = そのタイプのアセットで、同じパス/名前のものが既に存在します:\n[lightgray]{0}
|
||||
asset.broken = アセットファイルが見つかりませんでした。\nデータの不適切なインポート、または正しくエクスポートされていない保存ファイルが原因である可能性があります。
|
||||
asset.audio.invalid = 音声ファイルを読み込めませんでした。\n有効な OGG または MP3 ファイルであることを確認してください。
|
||||
asset.delete.confirm = このアセットを削除してもよろしいですか?
|
||||
asset.images = データパッチ画像:
|
||||
asset.image.imports = インポート結果
|
||||
asset.image.imported = [accent]{0} 枚の画像をインポートしました。
|
||||
asset.image.none = ZIP アーカイブ内に有効な PNG ファイルが見つかりませんでした。
|
||||
asset.image.error = [red]以下のエラーが発生しました:[]
|
||||
asset.image.clearall.confirm = すべての画像を消去してもよろしいですか?
|
||||
asset.image.info = 画像情報
|
||||
asset.image.toolarge = 画像 ([lightgray]{0}x{1}[]) が大きすぎます。最大サイズは {2}x{3}です。
|
||||
asset.image.exists = 同じパス/名前の画像が既に存在します:\n[lightgray]{0}
|
||||
asset.image.delete.confirm = この画像を削除してもよろしいですか?
|
||||
asset.image.name = [accent]ファイル名: [lightgray]{0}
|
||||
asset.image.region.name = [accent]リージョン名: [lightgray]{0}
|
||||
asset.image.path = [accent]パス: [lightgray]{0}
|
||||
asset.image.env = [accent]環境アトラスの使用: [lightgray]{0}
|
||||
asset.image.size = [accent]サイズ: [lightgray]{0}x{1}
|
||||
asset.image.filesize = [accent]ファイルサイズ: [lightgray]{0}
|
||||
asset.image.packfailed = [red]⚠ スプライトのパックに失敗しました![]
|
||||
asset.image.packfailed.env = おそらく環境アトラスの空き容量不足が原因です。\n環境スプライトは合計512x512の制限があります。
|
||||
|
||||
workshop = ワークショップ
|
||||
waves.title = ウェーブ
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = リセット
|
||||
settings.controls = コントロール
|
||||
settings.game = ゲーム
|
||||
settings.sound = サウンド
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = グラフィック
|
||||
settings.cleardata = データを削除...
|
||||
settings.clear.confirm = データを削除してもよろしいですか?\nこれを元に戻すことはできません!
|
||||
@@ -1141,7 +1142,7 @@ stat.targetsground = 対地攻撃
|
||||
stat.crushdamage = クラッシュダメージ
|
||||
stat.legsplashdamage = 踏みつぶしダメージ
|
||||
stat.itemsmoved = 輸送速度
|
||||
stat.itemsmoved.info = Throughput is often not linear and tied to FPS/TPS.
|
||||
stat.itemsmoved.info = スループットは線形とは限らず、FPS/TPSに依存することが多い。
|
||||
stat.launchtime = 発射の待機時間
|
||||
stat.shootrange = 範囲
|
||||
stat.size = 大きさ
|
||||
@@ -1164,8 +1165,8 @@ stat.weapons = 武器
|
||||
stat.bullet = 弾丸
|
||||
stat.moduletier = モジュールレベル
|
||||
stat.unittype = ユニット種
|
||||
stat.receiverate = Receiving Rate
|
||||
stat.receiverate.info = Affected by overdrive. Throughput can be increased by placing additional unloaders.
|
||||
stat.receiverate = 受信速度
|
||||
stat.receiverate.info = オーバードライブの影響を受ける。スループットは追加の搬出機を設置することで増加できる。
|
||||
stat.speedincrease = 速度向上
|
||||
stat.range = 範囲
|
||||
stat.drilltier = ドリル
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} ミリ秒
|
||||
setting.fullscreen.name = フルスクリーン
|
||||
setting.fps.name = FPSを表示
|
||||
setting.console.name = コンソールを有効にする
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = スムーズなカメラ
|
||||
setting.detach-camera.name = フリーカメラ
|
||||
setting.detach-camera.description = 有効にすると、カメラがプレイヤーユニットから独立して移動します。\nこの設定はホットキーに割り当て可能です。
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = 天気のグラフィックを表示
|
||||
setting.hidedisplays.name = 描画されているロジックディスプレイを非表示
|
||||
setting.macnotch.name = インターフェイスをノッチ表示に適応させる
|
||||
setting.macnotch.description = 再起動が必要です。
|
||||
|
||||
steam.friendsonly = フレンドのみ
|
||||
steam.friendsonly.tooltip = Steamのフレンドのみがゲームに参加できるようにします。\nこの設定を無効にするとゲームは公開され、誰でも参加できます。
|
||||
setting.maxmagnificationmultiplierpercent.name = 最低描写距離
|
||||
@@ -2185,9 +2190,9 @@ block.disperse.name = ディスパーズ
|
||||
block.afflict.name = アフリクト
|
||||
block.lustre.name = ラストル
|
||||
block.scathe.name = スケース
|
||||
block.scathe.carbide.info = Travels significantly faster.\nModerate damage at any range.
|
||||
block.scathe.surge-alloy.info = Splits into micro missiles.\nHeavy damage at close distance.
|
||||
block.scathe.phase-fabric.info = Equipped with a force field.\nLow damage, largest radius.
|
||||
block.scathe.carbide.info = かなり高速で移動する。\nどの距離でも中程度のダメージ。
|
||||
block.scathe.surge-alloy.info = 微小ミサイルに分裂する。\n近距離で高ダメージ。
|
||||
block.scathe.phase-fabric.info = フォースフィールドを搭載している。\nダメージは低いが、最大の範囲を持つ。
|
||||
block.tank-refabricator.name = 戦車再加工工場
|
||||
block.mech-refabricator.name = メカ再加工工場
|
||||
block.ship-refabricator.name = 戦艦再加工工場
|
||||
@@ -2766,7 +2771,7 @@ lst.setprop = ユニットまたは建物のプロパティを設定します。
|
||||
lst.effect = パーティクルエフェクトを作成します。
|
||||
lst.sync = ネットワーク経由で変数を同期します。\n最大で1秒間に10回まで呼び出されます。
|
||||
lst.playsound = サウンドを再生します。\n音量とパンはグローバル値として設定するか、位置に基づいて計算できます。
|
||||
lst.playmusic = Plays a music track by name, e.g. [accent]"game1"[].\nIf [accent]interrupt[] is true, the previously playing music will be stopped.\nPlaying with null music and interrupt set to true will stop the current track.\nNote that music from data patches must be prefixed with [accent]dp-[].
|
||||
lst.playmusic = 名前で音楽トラックを再生する。例: [accent]"game1"[]。\n[accent]interrupt[] が true の場合、再生中の音楽は停止される。\nnull の音楽を再生し、interrupt を true にすると現在のトラックを停止できる。\ndata patch の音楽を再生する場合は、[accent]dp-[] を接頭辞として付ける必要がある。
|
||||
lst.makemarker = ワールドに新しいロジックマーカーを作成します。\nこのマーカーを識別するためのIDを指定する必要があります。\nマーカーは現在、1ワールドにつき最大20,000個までです。
|
||||
lst.setmarker = マーカーのプロパティを設定します。\n使用するIDは"Make Marker"命令で指定したものと同じである必要があります。
|
||||
lst.localeprint = マップのロケールプロパティの値をテキストバッファに追加します。\nマップエディタでロケールバンドルを設定するには、[accent]Map Info > Locale Bundles[] を確認してください。\nクライアントがモバイルの場合、末尾が ".mobile" のプロパティを優先して出力します。
|
||||
@@ -2775,8 +2780,8 @@ lst.query = 指定した範囲内のユニット/建物を検索します。結
|
||||
lglobal.false = 0
|
||||
lglobal.true = 1
|
||||
lglobal.null = null
|
||||
lglobal.@pi = 円周率(π:3.141...)という数学定数
|
||||
lglobal.@e = ネイピア数(e:2.718...)という数学定数
|
||||
lglobal.@pi = 円周率(π:3.141...)という数学定数
|
||||
lglobal.@e = ネイピア数(e:2.718...)という数学定数
|
||||
lglobal.@degToRad = 度をラジアンに変換するための乗算係数
|
||||
lglobal.@radToDeg = ラジアンを度に変換するための乗算係数
|
||||
|
||||
@@ -2809,13 +2814,13 @@ lglobal.@liquidCount = ゲーム内液体種類数(lookup命令で使用)
|
||||
lglobal.@server = サーバーまたはシングルプレイで実行中なら true、それ以外は false
|
||||
lglobal.@client = クライアント接続中なら true
|
||||
|
||||
lglobal.@clientLocale = クライアントの言語設定(例:en_US)
|
||||
lglobal.@clientLocale = クライアントの言語設定(例: en_US)
|
||||
lglobal.@clientUnit = クライアントが操作しているユニット
|
||||
lglobal.@clientName = クライアントのプレイヤー名
|
||||
lglobal.@clientTeam = クライアントのチームID
|
||||
lglobal.@clientMobile = クライアントがモバイルなら true、それ以外は false
|
||||
|
||||
lenum.type = ユニットや建物の種類を取得します。\n例:任意のルーターに対して、 [accent]@router[] を返します。\n文字列ではありません。
|
||||
lenum.type = ユニットや建物の種類を取得します。\n例: 任意のルーターに対して、 [accent]@router[] を返します。\n文字列ではありません。
|
||||
lenum.shoot = 指定した座標に向かって撃ちます。
|
||||
lenum.shootp = 任意のユニットや建物を撃ちます。
|
||||
lenum.config = 建物の設定を取得します。\n例:ソーターに設定されているアイテムなど
|
||||
@@ -2828,7 +2833,7 @@ laccess.controller = ユニットを制御しているものを取得します
|
||||
laccess.dead = ユニットや建物が機能しているかどうか、またはもう有効でないかどうか。
|
||||
laccess.controlled = ユニットや建物がどのように制御されているのかを取得します。\nプロセッサ制御の場合、 [accent]@ctrlProcessor[] を返します。\nプレイヤー制御の場合、 [accent]@ctrlPlayer[] を返します。\n隊列を組んでいる場合、 [accent]@ctrlFormation[] を返します。\nそれ以外は 0 を返します。
|
||||
laccess.progress = アクションの進行状況を0〜1で取得します。\n生産、リロード、または建設の進捗状況を返します。
|
||||
laccess.speed = ユニットの最高速度を返します。(単位:タイル/秒)
|
||||
laccess.speed = ユニットの最高速度を返します。(単位: タイル/秒)
|
||||
laccess.size = ユニット/建物の大きさ、または紐の長さ。
|
||||
laccess.id = ユニット/ブロック/アイテム/液体のID。\nこれは検索操作の逆です。
|
||||
laccess.displaywidth = 表示ブロックの幅(ピクセル単位)
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = 데이터 패치
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]패치셋이 로드되지 않음.
|
||||
patch.errors = 패치셋 에러
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} 필드
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = 초기화
|
||||
settings.controls = 조작
|
||||
settings.game = 게임
|
||||
settings.sound = 소리
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = 그래픽
|
||||
settings.cleardata = 게임 데이터 초기화
|
||||
settings.clear.confirm = 정말로 이 데이터를 지우시겠습니까?\n되돌릴 수 없습니다!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} 밀리초
|
||||
setting.fullscreen.name = 전체 화면
|
||||
setting.fps.name = FPS와 핑 표시
|
||||
setting.console.name = 콘솔 활성화
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = 부드러운 시점
|
||||
setting.detach-camera.name = 자유 카메라
|
||||
setting.detach-camera.description = 이 기능을 활성화하면 카메라가 플레이어 유닛과 독립적으로 움직입니다.\n이 설정에는 단축키를 지정할 수 있습니다.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = 날씨 그래픽 표시
|
||||
setting.hidedisplays.name = 로직 디스플레이 숨김
|
||||
setting.macnotch.name = 노치를 표시하도록 인터페이스 조정
|
||||
setting.macnotch.description = 적용하려면 재시작이 필요합니다.
|
||||
|
||||
steam.friendsonly = 친구 전용
|
||||
steam.friendsonly.tooltip = 스팀 친구만 게임에 접속할 수 있을지 정합니다.\n체크를 해제하면 누구나 접속할 수 있습니다.
|
||||
setting.maxmagnificationmultiplierpercent.name = 최소 카메라 거리
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Atkuri
|
||||
settings.controls = Valdymas
|
||||
settings.game = Žaidimas
|
||||
settings.sound = Garsai
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafikos
|
||||
settings.cleardata = Išvalyti žaidimo duomenis...
|
||||
settings.clear.confirm = Ar tikrai norite ištrinti šiuos duomenis?\nTai negali būti atkurta!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisekundžių
|
||||
setting.fullscreen.name = Fullscreen
|
||||
setting.fps.name = Rodyti FPS ir Ping
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Pritaikykite sąsają, kad būtų rodoma įpjova
|
||||
setting.macnotch.description = Norint pritaikyti pakeitimus, reikia paleisti iš naujo
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Reset
|
||||
settings.controls = Bediening
|
||||
settings.game = Spel
|
||||
settings.sound = Geluid
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafisch
|
||||
settings.cleardata = Wis Spelgegevens...
|
||||
settings.clear.confirm = Weet je zeker dat je deze gegevens wilt verwijderen?\nDit is niet terug te draaien!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millisecondes
|
||||
setting.fullscreen.name = Volledig Scherm
|
||||
setting.fps.name = Toon FPS
|
||||
setting.console.name = Console Inschakelen
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Vloeiende Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Toon Weer Graphics
|
||||
setting.hidedisplays.name = Verberg Logische Displays
|
||||
setting.macnotch.name = Pas de interface aan om de inkeping weer te geven
|
||||
setting.macnotch.description = Herstart vereist om veranderingen door te voeren
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Reset
|
||||
settings.controls = Controls
|
||||
settings.game = Game
|
||||
settings.sound = Sound
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Graphics
|
||||
settings.cleardata = Clear Game Data...
|
||||
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milliseconds
|
||||
setting.fullscreen.name = Fullscreen
|
||||
setting.fps.name = Show FPS
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Adapt interface to display notch
|
||||
setting.macnotch.description = Restart required to apply changes
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Łatki danych
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Brak załadowanych zestawów łatek.
|
||||
patch.errors = Błędy zestawu łatek
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} pola
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Resetuj
|
||||
settings.controls = Sterowanie
|
||||
settings.game = Gra
|
||||
settings.sound = Dźwięk
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafika
|
||||
settings.cleardata = Wyczyść Dane Gry...
|
||||
settings.clear.confirm = Czy jesteś pewien, że chcesz usunąć te dane?\nPo tym nie ma powrotu!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisekund
|
||||
setting.fullscreen.name = Pełny ekran
|
||||
setting.fps.name = Pokazuj FPS oraz ping
|
||||
setting.console.name = Włącz konsolę
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Płynna kamera
|
||||
setting.detach-camera.name = Wolna Kamera
|
||||
setting.detach-camera.description = Gdy włączone, kamera porusza się niezależnie od jednostki gracza.\nTo ustawienie można przypisać do skrótu klawiszowego.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Pokaż pogodę
|
||||
setting.hidedisplays.name = Ukryj wyświetlacze logiczne
|
||||
setting.macnotch.name = Dostosuj interfejs do wyświetlania wycięcia ekranu
|
||||
setting.macnotch.description = Aby zastosować zmiany, wymagane jest ponowne uruchomienie
|
||||
|
||||
steam.friendsonly = Tylko Znajomi
|
||||
steam.friendsonly.tooltip = Czy tylko Znajomi ze Steam będą mogli dołączyć do twojej gry?\nOdznaczenie tego okienka ustawi twoją grę na publiczną - każdy może dołączyć.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min. odległość kamery
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Nenhum conjunto de patches carregado.
|
||||
patch.errors = Erros no Conjunto de Patches
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} campos
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Resetar
|
||||
settings.controls = Controles
|
||||
settings.game = Jogo
|
||||
settings.sound = Som
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Gráficos
|
||||
settings.cleardata = Apagar dados
|
||||
settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milissegundos
|
||||
setting.fullscreen.name = Tela Cheia
|
||||
setting.fps.name = Mostrar FPS e Ping
|
||||
setting.console.name = Ativar console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Suavizar movimentos da câmera
|
||||
setting.detach-camera.name = Câmera Livre
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Mostrar Gráficos do Clima
|
||||
setting.hidedisplays.name = Ocultar Displays de Lógicos
|
||||
setting.macnotch.name = Adaptar a interface para exibir o entalhe
|
||||
setting.macnotch.description = Reinicialização necessária para aplicar as alterações
|
||||
|
||||
steam.friendsonly = Amigos apenas
|
||||
steam.friendsonly.tooltip = Se apenas amigos do Steam poderão entrar no seu jogo.\nDesmarcar esta caixa tornará seu jogo público - qualquer pessoa pode entrar.
|
||||
setting.maxmagnificationmultiplierpercent.name = Distância Mínima da Câmera
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Repor
|
||||
settings.controls = Controlos
|
||||
settings.game = Jogo
|
||||
settings.sound = Som
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Gráficos
|
||||
settings.cleardata = Apagar dados...
|
||||
settings.clear.confirm = Tens a certeza que queres limpar os dados?\nOque é feito não pode ser desfeito!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milissegundos
|
||||
setting.fullscreen.name = Ecrã Inteiro
|
||||
setting.fps.name = Mostrar FPS e Ping
|
||||
setting.console.name = Ativar Consola
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Câmara Suave
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Mostrar Gráficos do Clima
|
||||
setting.hidedisplays.name = Ocultar Ecrãs Lógicos
|
||||
setting.macnotch.name = Adaptar a interface para exibir o entalhe
|
||||
setting.macnotch.description = É necessário reiniciar para aplicar as alterações
|
||||
|
||||
steam.friendsonly = Amigos Apenas
|
||||
steam.friendsonly.tooltip = Define se apenas amigos da Steam podem juntar-se ao teu jogo.\nDesativar esta opção fará o teu jogo público - qualquer um pode-se juntar ao teu mapa.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Resetează
|
||||
settings.controls = Controale
|
||||
settings.game = Joc
|
||||
settings.sound = Sunet
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafică
|
||||
settings.cleardata = Șterge Datele Jocului...
|
||||
settings.clear.confirm = Sigur vrei să ștergi datele?\nCe e făcut nu poate fi desfăcut!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} millisecunde
|
||||
setting.fullscreen.name = Ecran Complet
|
||||
setting.fps.name = Vezi FPS & Ping
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Cameră Graduală
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Vezi Vremea
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Adaptați interfața pentru a afișa notch-ul
|
||||
setting.macnotch.description = Repornire necesară pt a aplica schimbările.
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Патчи контента
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Ни одного набора патчей не загружено.
|
||||
patch.errors = Ошибки набора патчей
|
||||
@@ -543,6 +542,7 @@ patch.fields = Параметров: {0}
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Сбросить
|
||||
settings.controls = Управление
|
||||
settings.game = Игра
|
||||
settings.sound = Звук
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Графика
|
||||
settings.cleardata = Очистить игровые данные...
|
||||
settings.clear.confirm = Вы действительно хотите очистить свои данные?\nЭто нельзя отменить!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} миллисекунд
|
||||
setting.fullscreen.name = Полноэкранный режим
|
||||
setting.fps.name = Показывать FPS и пинг
|
||||
setting.console.name = Включить консоль
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Плавная камера
|
||||
setting.detach-camera.name = Свободная камера
|
||||
setting.detach-camera.description = При включении, вместо единицы можно будет двигать камеру.\nМожно быстро переключать через горячую клавишу.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Отображать погоду
|
||||
setting.hidedisplays.name = Скрыть логические дисплеи
|
||||
setting.macnotch.name = Адаптировать интерфейс к вырезу на экране
|
||||
setting.macnotch.description = Для вступления изменений в силу требуется перезагрузка игры
|
||||
|
||||
steam.friendsonly = Только друзья
|
||||
steam.friendsonly.tooltip = Только ли друзья из Steam могут присоединяться к вашей игре.\nУбрав эту галочку, вы сделаете вашу игру публичной - присоединиться сможет любой желающий.
|
||||
setting.maxmagnificationmultiplierpercent.name = Минимальная дистанция камеры
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Resetuj
|
||||
settings.controls = Kontrole
|
||||
settings.game = Igra
|
||||
settings.sound = Zvuk
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafika
|
||||
settings.cleardata = Rasčisti podatke igre...
|
||||
settings.clear.confirm = Da li ste sigurni da želite rasčistiti ove podatke?\nŠta je bilo ne može se vratiti!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisekundi
|
||||
setting.fullscreen.name = Ceo Ekran
|
||||
setting.fps.name = Prikazuj FPS i Ping
|
||||
setting.console.name = Osposobi Konzolu
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Glatka Kamera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Prikazuj Grafiku Vremena
|
||||
setting.hidedisplays.name = Sakrij Logičke Displeje
|
||||
setting.macnotch.name = Prilagodi interfejs da prikaže zarez
|
||||
setting.macnotch.description = Restartovanje je zahtevano da bi se učitale promene
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Reset
|
||||
settings.controls = Kontroller
|
||||
settings.game = Spel
|
||||
settings.sound = Ljud
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafik
|
||||
settings.cleardata = Rensa Data...
|
||||
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milliseconds
|
||||
setting.fullscreen.name = Fullskärm
|
||||
setting.fps.name = Show FPS
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Anpassa gränssnittet för att visa skåra
|
||||
setting.macnotch.description = Omstart krävs för att tillämpa ändringar
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = แพตช์เนื้อหา
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]ไม่มีชุดแพตช์ที่โหลดมา
|
||||
patch.errors = ข้อผิดพลาดชุดแพตช์
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} ฟิลด์
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = รีเซ็ต
|
||||
settings.controls = การควบคุม
|
||||
settings.game = เกม
|
||||
settings.sound = เสียง
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = กราฟิก
|
||||
settings.cleardata = เคลียร์ข้อมูลเกม...
|
||||
settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลนี้?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้นะ!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} มิลลิวินาที
|
||||
setting.fullscreen.name = เต็มจอ
|
||||
setting.fps.name = แสดง FPS และ Ping
|
||||
setting.console.name = เปิดใช้งานคอนโซล
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = กล้องแบบลื่นไหล
|
||||
setting.detach-camera.name = กล้องอิสระ
|
||||
setting.detach-camera.description = หากเปิดใช้งาน กล้องจะขยับแบบอิสระโดยไม่ตามยูนิตผู้เล่น\nการตั้งค่านี้สามารถตั้งปุ่มลัดได้
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = แสดงกราฟิกสภาพอาก
|
||||
setting.hidedisplays.name = ซ่อนหน้าจอลอจิก
|
||||
setting.macnotch.name = ปรับอินเตอร์เฟซให้เข้ากับติ่งหน้าจอ
|
||||
setting.macnotch.description = อาจจะต้องรีสตาร์ทเพื่อใช้งานการเปลี่ยนแปลง
|
||||
|
||||
steam.friendsonly = เพื่อนเท่านั้น
|
||||
steam.friendsonly.tooltip = ว่าจะให้แค่เพื่อนเท่านั้นหรือไม่ที่จะสามารถเข้าร่วมเกมของคุณได้\nหากคุณติ๊กช่องนี้ออกนั้นจะทำให้เกมของคุณเปิดเป็นสาธารณะ - ใครๆก็จะสามารถเข้าร่วมเกมของคุณได้
|
||||
setting.maxmagnificationmultiplierpercent.name = ระยะห่างกล้องต่ำสุด
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Reset
|
||||
settings.controls = Kontroller
|
||||
settings.game = Oyun
|
||||
settings.sound = Ses
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafikler
|
||||
settings.cleardata = Clear Game Data...
|
||||
settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milliseconds
|
||||
setting.fullscreen.name = Tam ekran
|
||||
setting.fps.name = FPS'i goster
|
||||
setting.console.name = Enable Console
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Smooth Camera
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Show Weather Graphics
|
||||
setting.hidedisplays.name = Hide Logic Displays
|
||||
setting.macnotch.name = Kesgitlemek üçin interfeýsi uýgunlaşdyryň
|
||||
setting.macnotch.description = Üýtgeşmeleri ulanmak üçin täzeden başlaň
|
||||
|
||||
steam.friendsonly = Friends Only
|
||||
steam.friendsonly.tooltip = Whether only Steam friends will be able to join your game.\nUnchecking this box will make your game public - anyone can join.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = İçerik Yamaları
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Yama bulunamadı.
|
||||
patch.errors = Yama Hataları
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} alanlar
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Tuşu Sıfırla
|
||||
settings.controls = Kontroller
|
||||
settings.game = Oyun
|
||||
settings.sound = Ses
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Grafikler
|
||||
settings.cleardata = ⚠ Tüm Oyun Verisini Sil ⚠
|
||||
settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBu işlemi geri alamazsınız!!!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} milisaniye
|
||||
setting.fullscreen.name = Tam Ekran
|
||||
setting.fps.name = FPS Göster
|
||||
setting.console.name = Konsolu Aktifleştir
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Yumuşak Geçişli Kamera
|
||||
setting.detach-camera.name = Özgür Kamera
|
||||
setting.detach-camera.description = Etkinleştirilirse, kamera oyuncu biriminden bağımsız hareket eder.\nBu ayara bir kısayol tuşu atanabilir.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Hava Durumu Grafiklerini Göster
|
||||
setting.hidedisplays.name = İşlemci İpuçlarını Gizle
|
||||
setting.macnotch.name = Arayüzü çentik gösterecek şekilde uyarlayın
|
||||
setting.macnotch.description = Değişikleri uygulamak için yeniden başlatma gerekli
|
||||
|
||||
steam.friendsonly = Arkadaşlara özel
|
||||
steam.friendsonly.tooltip = Sadece Steam arkadaşlarının katılıp katılabilemeyeceğini belirler.\nBu kutudan tiki kaldırmak oyununuzu herkese açık yapacaktır.
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Набір патчів вмісту
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Набір патчів вмісту не завантажено.
|
||||
patch.errors = Помилки набору патчу
|
||||
@@ -543,6 +542,7 @@ patch.fields = Кількість полів: {0}
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Скинути
|
||||
settings.controls = Керування
|
||||
settings.game = Гра
|
||||
settings.sound = Звук
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Графіка
|
||||
settings.cleardata = Очистити всі дані…
|
||||
settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} мілісекунд
|
||||
setting.fullscreen.name = Повноекранний режим
|
||||
setting.fps.name = Показувати FPS і затримку до сервера
|
||||
setting.console.name = Увімкнути консоль
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Гладка камера
|
||||
setting.detach-camera.name = Вільна камера
|
||||
setting.detach-camera.description = Якщо увімкнено, камера рухається незалежно від одиниці гравця.\nДля цього параметра можна призначити гарячу клавішу.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Показувати погоду
|
||||
setting.hidedisplays.name = Приховувати логічні дисплеї
|
||||
setting.macnotch.name = Адаптувати інтерфейс для показу виїмки
|
||||
setting.macnotch.description = Потрібен перезапуск для застосування змін
|
||||
|
||||
steam.friendsonly = Лише друзі
|
||||
steam.friendsonly.tooltip = Чи лише друзі Steam зможуть приєднатися до вашої гри. Якщо зняти цей прапорець, ваша гра стане загальнодоступною – будь-хто зможе приєднатися.
|
||||
setting.maxmagnificationmultiplierpercent.name = Мінімальна відстань камери
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Bản Vá Dữ Liệu
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]Không có bản vá nào được nạp.
|
||||
patch.errors = Lỗi Bộ Vá
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} trường
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = Đặt lại
|
||||
settings.controls = Điều Khiển
|
||||
settings.game = Trò Chơi
|
||||
settings.sound = Âm Thanh
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = Đồ Họa
|
||||
settings.cleardata = Xóa Dữ Liệu Trò Chơi...
|
||||
settings.clear.confirm = Bạn có chắc chắn muốn xóa dữ liệu này không?\nThực hiện xong không thể hoàn tác!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} mili-giây
|
||||
setting.fullscreen.name = Toàn màn hình
|
||||
setting.fps.name = Hiện FPS & Ping
|
||||
setting.console.name = Bật Bảng điều khiển
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = Khung quay mượt mà
|
||||
setting.detach-camera.name = Máy quay tự do
|
||||
setting.detach-camera.description = Nếu bật, máy quay di chuyển độc lập với đơn vị người chơi.\nCài đặt này có thể gán vào một phím nóng.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = Hiện đồ họa thời tiết
|
||||
setting.hidedisplays.name = Ẩn hiển thị logic
|
||||
setting.macnotch.name = Giao diện phù hợp với hiển thị tai thỏ
|
||||
setting.macnotch.description = Cần khởi động lại để áp dụng các thay đổi
|
||||
|
||||
steam.friendsonly = Chỉ bạn bè
|
||||
steam.friendsonly.tooltip = Liệu chỉ bạn bè trên Steam mới có thể tham gia trò chơi của bạn hay không.\nBỏ chọn ô này sẽ làm trò chơi của bạn công khai - mọi người có thể tham gia.
|
||||
setting.maxmagnificationmultiplierpercent.name = Tầm xa tối thiểu của máy quay
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = 数据包
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]未加载补丁集。
|
||||
patch.errors = 补丁集出错
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} 处变动
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = 恢复默认
|
||||
settings.controls = 控制
|
||||
settings.game = 游戏
|
||||
settings.sound = 声音
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = 图形
|
||||
settings.cleardata = 清除游戏数据
|
||||
settings.clear.confirm = 确认要清除该数据吗?\n此操作无法撤销!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0} 毫秒
|
||||
setting.fullscreen.name = 全屏
|
||||
setting.fps.name = 显示帧数和网络延迟
|
||||
setting.console.name = 启用控制台
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = 平滑镜头
|
||||
setting.detach-camera.name = 自由视角
|
||||
setting.detach-camera.description = 启用后,视角可独立于玩家单位自由移动。\n此设置可绑定快捷键。
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = 显示天气效果
|
||||
setting.hidedisplays.name = 不显示逻辑绘图
|
||||
setting.macnotch.name = 适应刘海显示
|
||||
setting.macnotch.description = 需要重启才能应用更改
|
||||
|
||||
steam.friendsonly = 仅限好友
|
||||
steam.friendsonly.tooltip = 是否只有 Steam 好友才能加入你的游戏。\n取消选中该选项将使你的游戏公开 - 任何人都可以加入。
|
||||
setting.maxmagnificationmultiplierpercent.name = 最小视距
|
||||
|
||||
@@ -531,7 +531,6 @@ content.planet = Planet
|
||||
content.weather = Weather
|
||||
content.status = Status Effect
|
||||
|
||||
patches = Content Patches
|
||||
patch.set = Patchset: {0}
|
||||
patch.none = [lightgray]No patchsets loaded.
|
||||
patch.errors = Patchset Errors
|
||||
@@ -543,6 +542,7 @@ patch.fields = {0} fields
|
||||
bundle.lines = {0} lines
|
||||
|
||||
images = Images
|
||||
asset.title = Data Patches & Assets
|
||||
asset.guide = Usage Guide
|
||||
asset.bundle.exists = A bundle with path '{0}' already exists.
|
||||
asset.importzip = Import Asset Zip
|
||||
@@ -1092,6 +1092,7 @@ settings.resetKey = 重設按鍵
|
||||
settings.controls = 控制
|
||||
settings.game = 遊戲
|
||||
settings.sound = 音效
|
||||
settings.dev = Developer Options
|
||||
settings.graphics = 圖形
|
||||
settings.cleardata = 清除遊戲資料……
|
||||
settings.clear.confirm = 您確定要清除資料嗎?\n此動作無法復原!
|
||||
@@ -1420,6 +1421,9 @@ setting.milliseconds = {0}毫秒
|
||||
setting.fullscreen.name = 全螢幕
|
||||
setting.fps.name = 顯示FPS與延遲
|
||||
setting.console.name = 啟用搖桿
|
||||
setting.drawhitboxes.name = Display Hitboxes
|
||||
setting.buildingtimestep.name = Fixed Building Timestep
|
||||
setting.buildingtimestep.description = Runs buildings on a fixed timestep with constant delta,\nas opposed to every frame with variable delta.\nIf buildings cannot be updated fast enough, the game will slow down.\nIf you don't know what that means, don't touch this option.
|
||||
setting.smoothcamera.name = 平滑攝影機
|
||||
setting.detach-camera.name = Free Camera
|
||||
setting.detach-camera.description = If enabled, the camera moves independently of the player unit.\nThis setting can be assigned a hotkey.
|
||||
@@ -1449,6 +1453,7 @@ setting.showweather.name = 顯示天氣動畫
|
||||
setting.hidedisplays.name = 隱藏邏輯顯示
|
||||
setting.macnotch.name = 使界面適應顯示槽口
|
||||
setting.macnotch.description = 需要重新啟動遊戲以更改大小
|
||||
|
||||
steam.friendsonly = 僅限好友
|
||||
steam.friendsonly.tooltip = 是否只有 Steam 好友可以加入您的遊戲。\n取消勾選後,遊戲為公開的,任何人都可以加入。
|
||||
setting.maxmagnificationmultiplierpercent.name = Min Camera Distance
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -85,17 +85,17 @@ public class Vars implements Loadable{
|
||||
public static final String patchesGuideURL = "https://mindustrygame.github.io/wiki/datapatches/";
|
||||
/** URLs to the JSON file containing all the BE servers. Only queried in BE. */
|
||||
public static final String[] serverJsonBeURLs = {"https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_be.json", "https://cdn.jsdelivr.net/gh/anuken/mindustryserverlist/servers_be.json"};
|
||||
/** URLs to the JSON file containing all the stable servers. */
|
||||
/** URLs to the JSON file containing all the stable servers. */
|
||||
public static final String[] serverJsonURLs = {"https://raw.githubusercontent.com/Anuken/MindustryServerList/master/servers_v8.json", "https://cdn.jsdelivr.net/gh/anuken/mindustryserverlist/servers_v8.json"};
|
||||
/** URLs to the JSON files containing the list of mods. */
|
||||
/** URLs to the JSON files containing the list of mods. */
|
||||
public static final String[] modJsonURLs = {"https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", "https://cdn.jsdelivr.net/gh/anuken/mindustrymods/mods.json"};
|
||||
/** URLs to the JSON file containing players banned from Steam. */
|
||||
/** URLs to the JSON file containing players banned from Steam. */
|
||||
public static final String[] steamBansURLs = {"https://raw.githubusercontent.com/Anuken/MindustrySteamBans/master/data.json", "https://cdn.jsdelivr.net/gh/anuken/mindustrysteambans/data.json"};
|
||||
/** URL of the github issue report template.*/
|
||||
/** URL of the github issue report template. */
|
||||
public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md";
|
||||
/** list of built-in servers.*/
|
||||
public static final Seq<ServerGroup> defaultServers = Seq.with();
|
||||
/** cached server list - only used if defaultServers have not been fetched*/
|
||||
/** cached server list - only used if defaultServers have not been fetched */
|
||||
public static final Seq<ServerGroup> cachedServers = Seq.with();
|
||||
/** maximum openGL errors logged */
|
||||
public static final int maxGlErrors = 100;
|
||||
@@ -216,8 +216,6 @@ public class Vars implements Loadable{
|
||||
/** Whether to draw shadows of blocks at map edges and static blocks.
|
||||
* Do not change unless you know exactly what you are doing.*/
|
||||
public static boolean enableDarkness = true;
|
||||
/** Whether to draw debug lines for collisions. */
|
||||
public static boolean drawDebugHitboxes = false;
|
||||
/** Whether to draw avoidance fields. */
|
||||
public static boolean debugDrawAvoidance = false;
|
||||
/** Whether the on-disk server file cache has been loaded. */
|
||||
|
||||
@@ -11,6 +11,7 @@ import mindustry.ai.types.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.entities.comp.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.game.Teams.*;
|
||||
import mindustry.gen.*;
|
||||
@@ -160,7 +161,7 @@ public class RtsAI{
|
||||
ay /= units.size;
|
||||
|
||||
if(debug){
|
||||
Vars.ui.showLabel("Squad: " + units.size, -1, 2f, ax, ay);
|
||||
Vars.ui.showLabel("Squad: " + units.size, -1, 2f, ax, ay, WorldLabel.flagBackground | WorldLabel.flagAutoscale);
|
||||
}
|
||||
|
||||
Building defend = null;
|
||||
@@ -192,7 +193,7 @@ public class RtsAI{
|
||||
defend = best;
|
||||
|
||||
if(debug){
|
||||
Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), -1, 8f, best.x, best.y);
|
||||
Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), -1, 8f, best.x, best.y, WorldLabel.flagBackground | WorldLabel.flagAutoscale);
|
||||
}
|
||||
|
||||
if(best instanceof CoreBuild){
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package mindustry.audio;
|
||||
|
||||
import arc.audio.*;
|
||||
import arc.math.geom.*;
|
||||
|
||||
public interface AmbientSource extends Position{
|
||||
boolean isValid();
|
||||
boolean shouldAmbientSound();
|
||||
float getAmbientVolume();
|
||||
Sound getAmbientSound();
|
||||
}
|
||||
@@ -13,6 +13,8 @@ import mindustry.content.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.gen.*;
|
||||
|
||||
import java.util.concurrent.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
/** Controls playback of multiple audio tracks.*/
|
||||
@@ -35,6 +37,10 @@ public class SoundControl{
|
||||
protected float fade;
|
||||
protected boolean silenced, keepSilent;
|
||||
|
||||
protected @Nullable AudioThread ambientThread;
|
||||
protected boolean launchingAmbientThread;
|
||||
protected Seq<SoundData> localData = new Seq<>();
|
||||
|
||||
protected boolean wasPlaying;
|
||||
protected AudioFilter filter = new BiquadFilter(){{
|
||||
set(0, 500, 1);
|
||||
@@ -64,6 +70,13 @@ public class SoundControl{
|
||||
//stop all in-game voices
|
||||
Core.audio.soundBus.stop();
|
||||
Core.audio.soundBus.play();
|
||||
|
||||
launchingAmbientThread = false;
|
||||
if(ambientThread != null){
|
||||
ambientThread.running = false;
|
||||
ambientThread.interrupt();
|
||||
ambientThread = null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -90,31 +103,6 @@ public class SoundControl{
|
||||
Events.fire(new MusicRegisterEvent());
|
||||
}
|
||||
|
||||
public void loop(Sound sound, float volume){
|
||||
if(Vars.headless) return;
|
||||
|
||||
loop(sound, Core.camera.position, volume);
|
||||
}
|
||||
|
||||
public void loop(Sound sound, Position pos, float volume){
|
||||
loop(sound, pos, volume, 1f);
|
||||
}
|
||||
|
||||
public void loop(Sound sound, Position pos, float volume, float pitch){
|
||||
if(Vars.headless || sound == Sounds.none || volume <= 0.00001f) return;
|
||||
|
||||
float baseVol = sound.calcFalloff(pos.getX(), pos.getY());
|
||||
float vol = baseVol * volume;
|
||||
|
||||
SoundData data = sounds.get(sound, SoundData::new);
|
||||
data.volume += vol;
|
||||
data.pitch += pitch * vol;
|
||||
data.volume = Mathf.clamp(data.volume, 0f, 1f);
|
||||
data.total += baseVol;
|
||||
data.totalVolume += vol;
|
||||
data.sum.add(pos.getX() * baseVol, pos.getY() * baseVol);
|
||||
}
|
||||
|
||||
public void stop(){
|
||||
silenced = true;
|
||||
if(current != null){
|
||||
@@ -198,48 +186,6 @@ public class SoundControl{
|
||||
keepSilent = true;
|
||||
}
|
||||
|
||||
protected void updateLoops(){
|
||||
//clear loops when in menu
|
||||
if(!state.isGame()){
|
||||
sounds.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
if(state.isPaused()) return;
|
||||
|
||||
float avol = Core.settings.getInt("ambientvol", 100) / 100f;
|
||||
|
||||
sounds.each((sound, data) -> {
|
||||
data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.11f);
|
||||
|
||||
boolean play = data.curVolume > 0.01f;
|
||||
float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total);
|
||||
float pitch = Mathf.zero(data.totalVolume, 0.0001f) ? 1f : data.pitch / data.totalVolume;
|
||||
if(data.soundID <= 0 || !Core.audio.isPlaying(data.soundID)){
|
||||
if(play){
|
||||
data.soundID = sound.loop(data.curVolume, pitch, pan);
|
||||
Core.audio.protect(data.soundID, true);
|
||||
}
|
||||
}else{
|
||||
if(data.curVolume <= 0.001f){
|
||||
sound.stop();
|
||||
data.soundID = -1;
|
||||
return;
|
||||
}
|
||||
Core.audio.set(data.soundID, pan, data.curVolume);
|
||||
if(!Mathf.equal(pitch, 1f, 0.001f)){
|
||||
Core.audio.setPitch(data.soundID, pitch);
|
||||
}
|
||||
}
|
||||
|
||||
data.pitch = 0f;
|
||||
data.volume = 0f;
|
||||
data.total = 0f;
|
||||
data.totalVolume = 0f;
|
||||
data.sum.setZero();
|
||||
});
|
||||
}
|
||||
|
||||
public void playMusic(@Nullable Music music, boolean interrupt){
|
||||
if(interrupt && current != null){
|
||||
current.stop();
|
||||
@@ -375,15 +321,6 @@ public class SoundControl{
|
||||
play(null);
|
||||
}
|
||||
|
||||
protected static class SoundData{
|
||||
float volume, pitch;
|
||||
float total;
|
||||
Vec2 sum = new Vec2();
|
||||
|
||||
int soundID;
|
||||
float curVolume, totalVolume;
|
||||
}
|
||||
|
||||
public static @Nullable Music findMusic(String name){
|
||||
if(name == null) return null;
|
||||
Music cached = Core.assets.getOrNull(name, Music.class);
|
||||
@@ -393,4 +330,233 @@ public class SoundControl{
|
||||
if(cached == null) cached = Core.assets.getOrNull("music/" + name + ".mp3", Music.class);
|
||||
return cached;
|
||||
}
|
||||
|
||||
//loop system
|
||||
|
||||
public void loop(Sound sound, float volume){
|
||||
if(Vars.headless) return;
|
||||
|
||||
loop(sound, Core.camera.position, volume);
|
||||
}
|
||||
|
||||
public void loop(Sound sound, Position pos, float volume){
|
||||
loop(sound, pos, volume, 1f);
|
||||
}
|
||||
|
||||
public void loop(Sound sound, Position pos, float volume, float pitch){
|
||||
if(Vars.headless || sound == Sounds.none || volume <= 0.00001f) return;
|
||||
|
||||
loop(sounds.get(sound, SoundData::new), sound, pos, volume, pitch);
|
||||
}
|
||||
|
||||
static void loop(SoundData data, Sound sound, Position pos, float volume, float pitch){
|
||||
float baseVol = sound.calcFalloff(pos.getX(), pos.getY());
|
||||
float vol = baseVol * volume;
|
||||
|
||||
data.volume += vol;
|
||||
data.pitch += pitch * vol;
|
||||
data.volume = Mathf.clamp(data.volume, 0f, 1f);
|
||||
data.total += baseVol;
|
||||
data.totalVolume += vol;
|
||||
data.sumX += pos.getX() * baseVol;
|
||||
data.sumY += pos.getY() * baseVol;
|
||||
}
|
||||
|
||||
public void addAmbientSource(AmbientSource source){
|
||||
if(headless) return;
|
||||
|
||||
if(launchingAmbientThread && ambientThread != null){
|
||||
ambientThread.sources.add(source); //directly add to buffer while thread is launching; this prevents a million add calls to the queue during map load
|
||||
}else if(ambientThread != null){
|
||||
ambientThread.inputSources.add(source);
|
||||
}else{
|
||||
launchingAmbientThread = true;
|
||||
ambientThread = new AudioThread();
|
||||
ambientThread.setDaemon(true);
|
||||
|
||||
//start thread with all the sources that were added during launch
|
||||
Core.app.post(() -> {
|
||||
if(ambientThread != null){
|
||||
ambientThread.start();
|
||||
launchingAmbientThread = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateLoops(){
|
||||
//clear loops when in menu
|
||||
if(!state.isGame()){
|
||||
sounds.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
if(state.isPaused()) return;
|
||||
|
||||
float avol = Core.settings.getInt("ambientvol", 100) / 100f;
|
||||
|
||||
sounds.each((sound, data) -> {
|
||||
data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.11f);
|
||||
|
||||
boolean play = data.curVolume > 0.01f;
|
||||
float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sumX / data.total, data.sumY / data.total);
|
||||
float pitch = Mathf.zero(data.totalVolume, 0.0001f) ? 1f : data.pitch / data.totalVolume;
|
||||
if(data.soundID <= 0 || !Core.audio.isPlaying(data.soundID)){
|
||||
if(play){
|
||||
data.soundID = sound.loop(data.curVolume, pitch, pan);
|
||||
Core.audio.protect(data.soundID, true);
|
||||
}
|
||||
}else{
|
||||
if(data.curVolume <= 0.001f){
|
||||
sound.stop();
|
||||
data.soundID = -1;
|
||||
return;
|
||||
}
|
||||
Core.audio.set(data.soundID, pan, data.curVolume);
|
||||
if(!Mathf.equal(pitch, 1f, 0.001f)){
|
||||
Core.audio.setPitch(data.soundID, pitch);
|
||||
}
|
||||
}
|
||||
|
||||
data.pitch = 0f;
|
||||
data.volume = 0f;
|
||||
data.total = 0f;
|
||||
data.totalVolume = 0f;
|
||||
data.sumX = 0f;
|
||||
data.sumY = 0f;
|
||||
});
|
||||
|
||||
//grab data from ambient thread
|
||||
if(ambientThread != null){
|
||||
synchronized(ambientThread.outputData){
|
||||
localData.set(ambientThread.outputData);
|
||||
}
|
||||
|
||||
for(var data : localData){
|
||||
var target = sounds.get(data.sound, SoundData::new);
|
||||
|
||||
target.pitch = data.pitch;
|
||||
target.volume = data.volume;
|
||||
target.total = data.total;
|
||||
target.totalVolume = data.totalVolume;
|
||||
target.sumX = data.sumX;
|
||||
target.sumY = data.sumY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected static class SoundData implements Cloneable{
|
||||
float volume, pitch;
|
||||
float total;
|
||||
float sumX, sumY;
|
||||
|
||||
int soundID;
|
||||
float curVolume, totalVolume;
|
||||
Sound sound;
|
||||
|
||||
@Override
|
||||
public SoundData clone(){
|
||||
try{
|
||||
return (SoundData)super.clone();
|
||||
}catch(CloneNotSupportedException e){
|
||||
throw new AssertionError("death");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class AudioThread extends Thread{
|
||||
static final int targetFps = 20;
|
||||
static final long targetNanos = Time.millisToNanos(1000) / targetFps;
|
||||
|
||||
volatile boolean running = true;
|
||||
Seq<AmbientSource> sources = new Seq<>(false, 16, AmbientSource.class);
|
||||
|
||||
LinkedBlockingQueue<AmbientSource> inputSources = new LinkedBlockingQueue<>();
|
||||
ObjectMap<Sound, SoundData> sounds = new ObjectMap<>();
|
||||
|
||||
//buffer that is built up on the audio thread
|
||||
final Seq<SoundData> localData = new Seq<>();
|
||||
//buffer for output sound data
|
||||
final Seq<SoundData> outputData = new Seq<>();
|
||||
|
||||
void doLoop(){
|
||||
var items = sources.items;
|
||||
int size = sources.size;
|
||||
localData.size = 0;
|
||||
|
||||
AmbientSource source;
|
||||
while((source = inputSources.poll()) != null){
|
||||
sources.add(source);
|
||||
}
|
||||
|
||||
for(int i = 0; i < size; i++){
|
||||
var item = items[i];
|
||||
if(item.isValid()){
|
||||
if(item.shouldAmbientSound()){
|
||||
float volume = item.getAmbientVolume();
|
||||
if(volume > 0.00001f){
|
||||
|
||||
Sound sound = item.getAmbientSound();
|
||||
var data = sounds.get(sound, SoundData::new);
|
||||
data.sound = sound;
|
||||
|
||||
boolean silent = data.volume == 0f;
|
||||
|
||||
loop(data, sound, item, volume, 1f);
|
||||
|
||||
if(silent && data.volume > 0f){
|
||||
localData.add(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
sources.remove(i); //unordered swap
|
||||
i --;
|
||||
size --;
|
||||
}
|
||||
}
|
||||
|
||||
//copy built-up data to output buffer
|
||||
synchronized(outputData){
|
||||
outputData.size = 0;
|
||||
for(var data : localData){
|
||||
|
||||
//this allocates, which is bad, but it only happens at 20fps with a few audio types at most
|
||||
outputData.add(data.clone());
|
||||
}
|
||||
}
|
||||
|
||||
//reset data for next iteration
|
||||
sounds.each((sound, data) -> {
|
||||
data.pitch = 0f;
|
||||
data.volume = 0f;
|
||||
data.total = 0f;
|
||||
data.totalVolume = 0f;
|
||||
data.sumX = 0f;
|
||||
data.sumY = 0f;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(){
|
||||
try{
|
||||
while(running){
|
||||
long nanos = Time.nanos();
|
||||
|
||||
if(state.isMenu()) break;
|
||||
if(state.isPlaying()){
|
||||
doLoop();
|
||||
}
|
||||
|
||||
long elapsed = Time.timeSinceNanos(nanos);
|
||||
if(elapsed < targetNanos){
|
||||
long remaining = targetNanos - elapsed;
|
||||
Thread.sleep(remaining / Time.nanosPerMilli, (int)(remaining % Time.nanosPerMilli));
|
||||
}
|
||||
}
|
||||
}catch(InterruptedException e){
|
||||
//exit
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ public class Blocks{
|
||||
//defense - erekir
|
||||
radar,
|
||||
buildTower,
|
||||
regenProjector, barrierProjector, shockwaveTower,
|
||||
regenProjector, shockwaveTower,
|
||||
//campaign only
|
||||
shieldProjector,
|
||||
largeShieldProjector,
|
||||
@@ -1503,7 +1503,7 @@ public class Blocks{
|
||||
}};
|
||||
|
||||
smallHeatRedirector = new HeatConductor("small-heat-redirector"){{
|
||||
requirements(Category.crafting, with(Items.surgeAlloy, 8, Items.graphite, 8));
|
||||
requirements(Category.crafting, with(Items.surgeAlloy, 3, Items.graphite, 8));
|
||||
|
||||
researchCostMultiplier = 2f;
|
||||
researchCostMultipliers.put(Items.graphite, 7f);
|
||||
@@ -2034,19 +2034,6 @@ public class Blocks{
|
||||
}});
|
||||
}};
|
||||
|
||||
//TODO implement
|
||||
if(false)
|
||||
barrierProjector = new DirectionalForceProjector("barrier-projector"){{
|
||||
requirements(Category.effect, with(Items.surgeAlloy, 100, Items.silicon, 125));
|
||||
size = 3;
|
||||
width = 50f;
|
||||
length = 36;
|
||||
shieldHealth = 2000f;
|
||||
cooldownNormal = 3f;
|
||||
cooldownBrokenBase = 0.35f;
|
||||
|
||||
consumePower(4f);
|
||||
}};
|
||||
|
||||
shockwaveTower = new ShockwaveTower("shockwave-tower"){{
|
||||
requirements(Category.effect, with(Items.surgeAlloy, 50, Items.silicon, 150, Items.oxide, 30, Items.tungsten, 100));
|
||||
@@ -2090,7 +2077,7 @@ public class Blocks{
|
||||
titaniumConveyor = new Conveyor("titanium-conveyor"){{
|
||||
requirements(Category.distribution, with(Items.copper, 1, Items.lead, 1, Items.titanium, 1));
|
||||
health = 65;
|
||||
speed = 0.08f;
|
||||
speed = 0.0801f;
|
||||
displayedSpeed = 10f;
|
||||
}};
|
||||
|
||||
|
||||
@@ -142,6 +142,7 @@ public class Planets{
|
||||
r.waveTeam = Team.crux;
|
||||
r.placeRangeCheck = false;
|
||||
r.hideSpawns = true;
|
||||
r.derelictRepair = true;
|
||||
r.coreDestroyClear = true;
|
||||
};
|
||||
showRtsAIRule = true;
|
||||
|
||||
@@ -41,8 +41,8 @@ public class SerpuloTechTree{
|
||||
|
||||
node(itemBridge, () -> {
|
||||
node(titaniumConveyor, Seq.with(new SectorComplete(crateredBattleground)), () -> {
|
||||
node(phaseConveyor, () -> {
|
||||
node(massDriver, Seq.with(new SectorComplete(tarFields)), () -> {
|
||||
node(massDriver, Seq.with(new SectorComplete(tarFields)), () -> {
|
||||
node(phaseConveyor, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
@@ -53,8 +53,8 @@ public class SerpuloTechTree{
|
||||
});
|
||||
});
|
||||
|
||||
node(armoredConveyor, () -> {
|
||||
node(plastaniumConveyor, () -> {
|
||||
node(plastaniumConveyor, () -> {
|
||||
node(armoredConveyor, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@@ -460,6 +460,34 @@ public class Logic implements ApplicationListener{
|
||||
Core.settings.manualSave();
|
||||
}
|
||||
|
||||
public boolean hasFixedTimestep(){
|
||||
return Core.settings.getInt("buildingtimestep", 65) <= 60;
|
||||
}
|
||||
|
||||
protected void updateEntities(){
|
||||
int timestep = Core.settings.getInt("buildingtimestep", 65);
|
||||
|
||||
PerfCounter.entityUpdate.begin();
|
||||
|
||||
Groups.updatePooling();
|
||||
|
||||
Groups.bullet.updatePhysics();
|
||||
Groups.unit.updatePhysics();
|
||||
Groups.all.update();
|
||||
|
||||
PerfCounter.buildingUpdate.begin();
|
||||
if(timestep > 60){
|
||||
Groups.build.update();
|
||||
}else{
|
||||
Groups.build.fixedUpdate(timestep);
|
||||
}
|
||||
|
||||
PerfCounter.buildingUpdate.begin();
|
||||
|
||||
Groups.bullet.collide();
|
||||
PerfCounter.entityUpdate.end();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(){
|
||||
PerfCounter.frame.end();
|
||||
@@ -564,9 +592,7 @@ public class Logic implements ApplicationListener{
|
||||
state.envAttrs.add(state.rules.attributes);
|
||||
Groups.weather.each(w -> state.envAttrs.add(w.weather.attrs, w.opacity));
|
||||
|
||||
PerfCounter.entityUpdate.begin();
|
||||
Groups.update();
|
||||
PerfCounter.entityUpdate.end();
|
||||
updateEntities();
|
||||
|
||||
Events.fire(Trigger.afterGameUpdate);
|
||||
}
|
||||
|
||||
@@ -373,7 +373,7 @@ public class NetClient implements ApplicationListener{
|
||||
|
||||
@Remote(called = Loc.client, variants = Variant.one)
|
||||
public static void connect(String ip, int port){
|
||||
if(!steam && ip.startsWith("steam:")) return;
|
||||
if(!steam && (ip.startsWith("steam:") || ip.startsWith("steamserver:"))) return;
|
||||
netClient.disconnectQuietly();
|
||||
logic.reset();
|
||||
|
||||
|
||||
@@ -8,13 +8,15 @@ public enum PerfCounter{
|
||||
frame,
|
||||
update,
|
||||
entityUpdate,
|
||||
buildingUpdate,
|
||||
unitUpdate,
|
||||
ui,
|
||||
render;
|
||||
|
||||
public static final PerfCounter[] all = values();
|
||||
|
||||
static final int meanWindow = 30;
|
||||
static final int refreshTimeMillis = 500;
|
||||
static final int meanWindow = 120;
|
||||
static final int refreshTimeMillis = 100;
|
||||
|
||||
private long valueRefreshTime;
|
||||
private float refreshValue;
|
||||
|
||||
@@ -26,7 +26,9 @@ import static mindustry.Vars.*;
|
||||
|
||||
public class Renderer implements ApplicationListener{
|
||||
/** These are global variables, for headless access. Cached. */
|
||||
public static float laserOpacity = 0.5f, unitLaserOpacity = 1f, bridgeOpacity = 0.75f;
|
||||
public static float laserOpacity = 0.5f, unitLaserOpacity = 1f, bridgeOpacity = 0.75f, blockInterp = 1f;
|
||||
public static boolean blockTimestep = false, renderUpdate = false;
|
||||
public static long blockRenderUpdateId;
|
||||
|
||||
public final BlockRenderer blocks = new BlockRenderer();
|
||||
public final FogRenderer fog = new FogRenderer();
|
||||
@@ -165,6 +167,8 @@ public class Renderer implements ApplicationListener{
|
||||
unitLaserOpacity = settings.getInt("unitlaseropacity") / 100f;
|
||||
laserOpacity = settings.getInt("lasersopacity") / 100f;
|
||||
bridgeOpacity = settings.getInt("bridgeopacity") / 100f;
|
||||
blockTimestep = logic.hasFixedTimestep();
|
||||
blockRenderUpdateId = Groups.build.getFixedUpdateId();
|
||||
animateShields = settings.getBool("animatedshields");
|
||||
animateWater = settings.getBool("animatedwater");
|
||||
drawStatus = settings.getBool("blockstatus");
|
||||
@@ -414,11 +418,13 @@ public class Renderer implements ApplicationListener{
|
||||
}
|
||||
|
||||
Events.fire(Trigger.drawOver);
|
||||
blockInterp = blockTimestep ? Groups.build.getRenderInterpolation() : 1f;
|
||||
renderUpdate = !state.isPaused();
|
||||
blocks.drawBlocks();
|
||||
|
||||
Groups.draw.draw(Drawc::draw);
|
||||
|
||||
if(drawDebugHitboxes){
|
||||
if(settings.getBool("drawhitboxes")){
|
||||
DebugCollisionRenderer.draw();
|
||||
}
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ public class UI implements ApplicationListener, Loadable{
|
||||
/** Maps popups to ids so that they can be removed or updated by id. */
|
||||
private final ObjectMap<String, Table> popups = new ObjectMap<>();
|
||||
/** Maps labels to ids so that they can be removed or updated by id. */
|
||||
private final IntMap<Table> labels = new IntMap<>();
|
||||
private final IntMap<WorldLabel> labels = new IntMap<>();
|
||||
|
||||
public UI(){
|
||||
Fonts.loadFonts();
|
||||
@@ -437,34 +437,20 @@ public class UI implements ApplicationListener, Loadable{
|
||||
}
|
||||
|
||||
/** Shows a label in the world. This label is behind everything. Does not fade. */
|
||||
public void showLabel(@Nullable String info, int id, float duration, float worldx, float worldy){
|
||||
public void showLabel(@Nullable String info, int id, float duration, float worldx, float worldy, int flags){
|
||||
if(info == null){ // null info allows deletion of old labels provided they have ids
|
||||
var table = labels.remove(id);
|
||||
if(table != null) table.remove();
|
||||
var label = labels.remove(id);
|
||||
if(label != null) label.remove();
|
||||
return;
|
||||
}
|
||||
var table = new Table(Styles.black3).margin(4);
|
||||
if(id != -1){
|
||||
Table old = labels.put(id, table);
|
||||
if(old != null) old.remove();
|
||||
}
|
||||
table.touchable = Touchable.disabled;
|
||||
table.update(() -> {
|
||||
if(state.isMenu()){
|
||||
table.remove();
|
||||
if(id != -1) labels.remove(id);
|
||||
}
|
||||
Vec2 v = Core.camera.project(worldx, worldy);
|
||||
table.setPosition(v.x, v.y, Align.center);
|
||||
});
|
||||
table.actions(Actions.delay(duration), Actions.remove(), Actions.run(() -> { if(id != -1) labels.remove(id); }));
|
||||
table.add(info).style(Styles.outlineLabel);
|
||||
table.pack();
|
||||
table.act(0f);
|
||||
//make sure it's at the back
|
||||
Core.scene.root.addChildAt(0, table);
|
||||
|
||||
table.getChildren().first().act(0f);
|
||||
var label = labels.get(id, WorldLabel::create); // todo: pool?
|
||||
label.x = worldx;
|
||||
label.y = worldy;
|
||||
label.text = info;
|
||||
label.flags = (byte)flags; // flag | flag2 at call site turns it into an int so the flags param here has to be int or casting has to be done at every call site
|
||||
label.duration = duration;
|
||||
label.add();
|
||||
}
|
||||
|
||||
public void showInfo(String info){
|
||||
|
||||
@@ -315,10 +315,10 @@ public class World{
|
||||
}
|
||||
|
||||
Liquid liquid = tile.floor().liquidDrop;
|
||||
if(tile.floor().itemDrop != null && tile.block() == Blocks.air) content.add(tile.floor().itemDrop);
|
||||
if(tile.overlay().itemDrop != null && tile.block() == Blocks.air) content.add(tile.overlay().itemDrop);
|
||||
if(tile.floor().itemDrop != null && tile.block().isStatic()) content.add(tile.floor().itemDrop);
|
||||
if(tile.overlay().itemDrop != null && tile.block().isStatic()) content.add(tile.overlay().itemDrop);
|
||||
if(tile.wallDrop() != null) content.add(tile.wallDrop());
|
||||
if(liquid != null && tile.block() == Blocks.air) content.add(liquid);
|
||||
if(liquid != null && tile.block().isStatic()) content.add(liquid);
|
||||
}
|
||||
state.rules.limitMapArea = border;
|
||||
|
||||
|
||||
@@ -429,7 +429,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
||||
editor.tags.put("steamid", map.tags.get("steamid"));
|
||||
workshop = true;
|
||||
}
|
||||
returned = maps.saveMap(editor.tags);
|
||||
returned = maps.saveMap(editor.tags, false);
|
||||
if(workshop){
|
||||
returned.workshop = workshop;
|
||||
}
|
||||
@@ -788,7 +788,11 @@ public class MapEditorDialog extends Dialog implements Disposable{
|
||||
}
|
||||
|
||||
private void tryExit(){
|
||||
ui.showConfirm("@confirm", "@editor.unsaved", this::hide);
|
||||
ui.showConfirm("@confirm", "@editor.unsaved", () -> {
|
||||
//clears data patches
|
||||
logic.reset();
|
||||
hide();
|
||||
});
|
||||
}
|
||||
|
||||
private void addBlockSelection(Table cont){
|
||||
|
||||
@@ -118,13 +118,10 @@ public class MapInfoDialog extends BaseDialog{
|
||||
|
||||
r.row();
|
||||
|
||||
r.button("@patches", Icon.file, style, () -> {
|
||||
r.button("@asset.title", Icon.fileCode, style, () -> {
|
||||
hide();
|
||||
patches.show();
|
||||
}).marginLeft(10f);
|
||||
|
||||
//empty space
|
||||
r.add().marginLeft(10f);
|
||||
}).marginLeft(10f).colspan(2).width(460f).row();
|
||||
}).colspan(2).center();
|
||||
|
||||
name.change();
|
||||
@@ -132,6 +129,6 @@ public class MapInfoDialog extends BaseDialog{
|
||||
author.change();
|
||||
|
||||
t.margin(16f);
|
||||
});
|
||||
}).growX().scrollX(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,6 +233,9 @@ public class MapView extends Element implements GestureListener{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
//can cause NaN
|
||||
if(editor.width() == 0 || editor.height() == 0) return;
|
||||
|
||||
float ratio = 1f / ((float)editor.width() / editor.height());
|
||||
float size = Math.min(width, height);
|
||||
float sclwidth = size * zoom;
|
||||
|
||||
@@ -48,7 +48,7 @@ public class MapAssetsDialog extends BaseDialog{
|
||||
private DataAssetType currentType = DataAssetType.music;
|
||||
|
||||
public MapAssetsDialog(){
|
||||
super("@patches");
|
||||
super(""); //title is not displayed
|
||||
|
||||
shown(() -> {
|
||||
searchString = null;
|
||||
|
||||
@@ -82,7 +82,7 @@ public class MapContentView implements AssetView{
|
||||
list.add().size(h);
|
||||
}
|
||||
|
||||
list.button(content.content instanceof UnlockableContent u && (u.uiIcon.found() || u.fullIcon.found()) ? new TextureRegionDrawable(u.uiIcon.found() ? u.uiIcon : u.fullIcon) :
|
||||
list.button(content.content instanceof UnlockableContent u && u.uiIcon != null && (u.uiIcon.found() || u.fullIcon.found()) ? new TextureRegionDrawable(u.uiIcon.found() ? u.uiIcon : u.fullIcon) :
|
||||
contentIcons.get(content.type, Icon.warning), Styles.graySquarei, iconMed, () -> {}).touchable(Touchable.disabled).size(h);
|
||||
|
||||
list.button(("[accent]" + content.name + "\n") + "[lightgray]" + Core.bundle.get("content." + content.type), Styles.grayt, () -> {
|
||||
|
||||
@@ -45,7 +45,7 @@ public class MapImagesView implements AssetView{
|
||||
|
||||
if(width > DataPatcher.maxImageSize || height > DataPatcher.maxImageSize){
|
||||
ui.showErrorMessage(Core.bundle.format("asset.image.toolarge", width, height, DataPatcher.maxImageSize, DataPatcher.maxImageSize));
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
|
||||
String name = result.nameWithoutExtension();
|
||||
@@ -53,7 +53,7 @@ public class MapImagesView implements AssetView{
|
||||
var other = images.find(p -> p.path.equalsIgnoreCase(path) || p.name.equalsIgnoreCase(name));
|
||||
if(other != null){
|
||||
ui.showErrorMessage(Core.bundle.format("asset.image.exists", other.name + " (" + other.path + ")"));
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
|
||||
byte[] hash = assetCache.add(bytes);
|
||||
@@ -212,7 +212,7 @@ public class MapImagesView implements AssetView{
|
||||
inner.top().left();
|
||||
|
||||
float size = 200f;
|
||||
int cols = (int)Math.max(1, Core.graphics.getWidth() / Scl.scl(size + 12f));
|
||||
int cols = (int)Math.max(1, (Core.graphics.getWidth() - Scl.scl(20f)) * 0.9f / Scl.scl(size + 14f));
|
||||
int i = 0;
|
||||
for(var image : getImages()){
|
||||
//showing generated images is confusing, so don't.
|
||||
|
||||
@@ -5,6 +5,8 @@ import arc.func.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import arc.util.Time.*;
|
||||
import arc.util.pooling.*;
|
||||
import mindustry.gen.*;
|
||||
|
||||
import java.util.*;
|
||||
@@ -27,6 +29,12 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
|
||||
|
||||
private int index;
|
||||
|
||||
private double fixedCounter, timeCounter;
|
||||
private long lastTimeAccess = -1;
|
||||
private long totalUpdates = 0, updateId;
|
||||
private float lastRenderInterpolation = 1f;
|
||||
private Seq<DelayRun> timeRuns = new Seq<>();
|
||||
|
||||
public static int nextId(){
|
||||
if(lastId >= Integer.MAX_VALUE - 2) lastId = 0;
|
||||
return lastId++;
|
||||
@@ -85,6 +93,71 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
|
||||
}
|
||||
}
|
||||
|
||||
/** Calls {@link #fixedUpdate(int, int)} with a minimum FPS of 10. */
|
||||
public void fixedUpdate(int targetFps){
|
||||
fixedUpdate(targetFps, Math.max(2, targetFps / 10));
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this entity group at a fixed rate and delta time, regardless of framerate.
|
||||
* If updates per frame exceed {@param maxUpdatesPerFrame}, they will be skipped - visually, the game will look like it is slowing down.
|
||||
* For example, a value of 60 targetUps and 10 maxUpdatesPerFrame will mean that the game only starts slowing down below (60 / 10) = 6 FPS.
|
||||
* */
|
||||
public void fixedUpdate(int targetUps, int maxUpdatesPerFrame){
|
||||
//if fixedUpdate isn't called, e.g. when the game is paused or map is reloaded, the time counter needs to 'sync' with the actual proper time
|
||||
if(lastTimeAccess < Core.graphics.getFrameId() - 1){
|
||||
totalUpdates = 0;
|
||||
updateId = state.updateId;
|
||||
timeCounter = Time.getInternalTime();
|
||||
}
|
||||
|
||||
long prevUpdateId = state.updateId;
|
||||
double targetDelta = 1.0 / targetUps;
|
||||
float timeDelta = (float)targetDelta * 60f;
|
||||
float prevDelta = Time.delta;
|
||||
double prevTime = Time.getInternalTime();
|
||||
var oldRuns = Time.getRuns();
|
||||
|
||||
//since some logic (incorrectly!) relies on Time.time, it has to be passed like this across several variables.
|
||||
Time.delta = timeDelta;
|
||||
Time.setInternalTime(timeCounter);
|
||||
Time.setRuns(timeRuns);
|
||||
|
||||
float delta = Core.graphics.getDeltaTime();
|
||||
|
||||
//the first two updates are usually bogus
|
||||
if(totalUpdates++ < 2) delta = Math.min(delta, 1f / 60f);
|
||||
|
||||
fixedCounter += delta;
|
||||
fixedCounter = Math.min(fixedCounter, targetDelta * maxUpdatesPerFrame);
|
||||
|
||||
while(fixedCounter >= targetDelta){
|
||||
//this executes any pending tasks (manually reassigned), and increments internal time, which is local to this group
|
||||
Time.update();
|
||||
update();
|
||||
fixedCounter -= targetDelta;
|
||||
state.updateId = updateId ++;
|
||||
}
|
||||
|
||||
timeCounter = Time.getInternalTime();
|
||||
|
||||
Time.delta = prevDelta;
|
||||
Time.setInternalTime(prevTime);
|
||||
Time.setRuns(oldRuns);
|
||||
state.updateId = prevUpdateId;
|
||||
|
||||
lastRenderInterpolation = (float)(fixedCounter / targetDelta);
|
||||
lastTimeAccess = Core.graphics.getFrameId();
|
||||
}
|
||||
|
||||
public long getFixedUpdateId(){
|
||||
return updateId;
|
||||
}
|
||||
|
||||
public float getRenderInterpolation(){
|
||||
return lastRenderInterpolation;
|
||||
}
|
||||
|
||||
public Seq<T> copy(){
|
||||
return copy(new Seq<>());
|
||||
}
|
||||
@@ -269,8 +342,15 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
|
||||
array.each(Entityc::remove);
|
||||
array.clear();
|
||||
if(map != null) map.clear();
|
||||
Pools.freeAll(timeRuns, true);
|
||||
timeRuns.clear();
|
||||
|
||||
clearing = false;
|
||||
totalUpdates = 0;
|
||||
|
||||
lastRenderInterpolation = 0f;
|
||||
lastTimeAccess = -1;
|
||||
updateId = 0;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
||||
@@ -3,6 +3,7 @@ package mindustry.entities.comp;
|
||||
import arc.*;
|
||||
import arc.Graphics.*;
|
||||
import arc.Graphics.Cursor.*;
|
||||
import arc.audio.*;
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
@@ -16,6 +17,7 @@ import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.audio.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.ctype.*;
|
||||
@@ -49,7 +51,7 @@ import static mindustry.Vars.*;
|
||||
|
||||
@EntityDef(value = {Buildingc.class}, excludeGroups = {"all"}, isFinal = false, genio = false, serialize = false)
|
||||
@Component(base = true, genInterface = false)
|
||||
abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Sized, Senseable, Controllable, Settable{
|
||||
abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, QuadTreeObject, Displayable, Sized, Senseable, Controllable, Settable, AmbientSource{
|
||||
//region vars and initialization
|
||||
static final float timeToSleep = 60f * 1, recentDamageTime = 60f * 5f;
|
||||
static final ObjectSet<Building> tmpTiles = new ObjectSet<>();
|
||||
@@ -125,6 +127,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
|
||||
if(shouldAdd){
|
||||
add();
|
||||
|
||||
if(block.ambientSound != Sounds.none && !headless){
|
||||
control.sound.addAmbientSource(this);
|
||||
}
|
||||
}
|
||||
|
||||
checkAllowUpdate();
|
||||
@@ -625,6 +631,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
(tile instanceof EditorTile || block.privileged || !state.rules.limitMapArea || !state.rules.disableOutsideArea || Rect.contains(state.rules.limitX, state.rules.limitY, state.rules.limitWidth, state.rules.limitHeight, tile.x, tile.y));
|
||||
}
|
||||
|
||||
public boolean inMapArea(){
|
||||
return !state.rules.limitMapArea || Rect.contains(state.rules.limitX * tilesize, state.rules.limitY * tilesize, state.rules.limitWidth * tilesize, state.rules.limitHeight * tilesize, x, y);
|
||||
}
|
||||
|
||||
public BlockStatus status(){
|
||||
if(!enabled){
|
||||
return BlockStatus.logicDisable;
|
||||
@@ -1283,8 +1293,15 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
}
|
||||
|
||||
public void payloadDraw(){
|
||||
if(block.isAir()) return;
|
||||
draw();
|
||||
float z = Draw.z();
|
||||
if(block.drawCached){
|
||||
Draw.z(block.buildingCacheLayer.layer);
|
||||
drawCached();
|
||||
}
|
||||
if(block.drawDynamic){
|
||||
Draw.z(z);
|
||||
draw();
|
||||
}
|
||||
}
|
||||
|
||||
public void drawTeamTop(){
|
||||
@@ -1793,6 +1810,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
|
||||
if(power != null && updatePower){
|
||||
var oldGraph = power.graph;
|
||||
for(var other : proximity){
|
||||
if(other != null && other.team != team && other.power != null && other.power.graph == oldGraph){
|
||||
new PowerGraph().reflow(other);
|
||||
}
|
||||
}
|
||||
for(int i = 0; i < power.links.size; i++){
|
||||
var other = world.build(power.links.items[i]);
|
||||
|
||||
@@ -2250,11 +2272,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
timeScale = 1f;
|
||||
}
|
||||
|
||||
//TODO separate multithreaded system for sound? AudioSource, etc
|
||||
if(!headless && block.ambientSound != Sounds.none && shouldAmbientSound()){
|
||||
control.sound.loop(block.ambientSound, self(), block.ambientSoundVolume * ambientVolume());
|
||||
}
|
||||
|
||||
updateConsumption();
|
||||
|
||||
if(enabled || !block.noUpdateDisabled){
|
||||
@@ -2272,6 +2289,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getAmbientVolume(){
|
||||
return block.ambientSoundVolume * ambientVolume();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Sound getAmbientSound(){
|
||||
return block.ambientSound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hitbox(Rect out){
|
||||
out.setCentered(x, y, block.size * tilesize, block.size * tilesize);
|
||||
|
||||
@@ -32,12 +32,22 @@ public abstract class WorldLabelComp implements Posc, Drawc, Syncc{
|
||||
public byte flags = flagBackground | flagOutline;
|
||||
/** If not null, this label gets set to the parent position with x, y used as offsets. */
|
||||
public @Nullable Posc parent;
|
||||
/** Duration in seconds. Ignored if zero or negative. */
|
||||
public transient float duration;
|
||||
|
||||
@Replace
|
||||
public float clipSize(){
|
||||
return text.length() * 10f * fontSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(){
|
||||
if(duration > 0){
|
||||
duration -= Time.delta / 60f;
|
||||
if(duration <= 0) hide();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
float x = this.x, y = this.y;
|
||||
|
||||
@@ -670,7 +670,7 @@ public class BlockRenderer{
|
||||
|
||||
drawDestroyed();
|
||||
|
||||
if(chunksToDraw.size > 0 && !input.keyDown(KeyCode.y)){
|
||||
if(chunksToDraw.size > 0){
|
||||
|
||||
for(int mlayer = 0; mlayer < BuildingCacheLayer.amount; mlayer++){
|
||||
int layer = mlayer;
|
||||
|
||||
@@ -522,7 +522,7 @@ public class Drawf{
|
||||
|
||||
if(a >= 1f/255f){
|
||||
if(lod > 0.0001f){
|
||||
Draw.alpha(lod);
|
||||
Draw.alpha(lod * a);
|
||||
Draw.rect(start, x, y, start.width * scale * start.scl(), start.height * scale * start.scl(), rot + 180);
|
||||
Draw.rect(end, x2, y2, end.width * scale * end.scl(), end.height * scale * end.scl(), rot);
|
||||
Draw.alpha(a);
|
||||
|
||||
@@ -5,7 +5,7 @@ import arc.math.*;
|
||||
import static arc.Core.*;
|
||||
|
||||
public class Lod{
|
||||
private static final float threshold1 = 1.4f, threshold2 = 0.7f;
|
||||
private static final float threshold1 = 1.4f, threshold2 = 0.8f;
|
||||
private static final float fade = 0.2f;
|
||||
|
||||
public static boolean disable = false;
|
||||
|
||||
@@ -12,7 +12,7 @@ import java.util.concurrent.*;
|
||||
|
||||
/** WIP experimental point-sprite based particle renderer. */
|
||||
public class ParticleRenderer{
|
||||
static final boolean useAsync = true;
|
||||
static final boolean useAsync = !OS.isIos && !OS.isAndroid;
|
||||
static final int maxParticles = 100_000, maxParticlesPerFrame = 25_000;
|
||||
static final int particleSize =
|
||||
1 + //time
|
||||
|
||||
@@ -241,7 +241,7 @@ public class DesktopInput extends InputHandler{
|
||||
|
||||
if(!scene.hasField() && !scene.hasDialog()){
|
||||
if(input.keyTap(Binding.debugHitboxes)){
|
||||
drawDebugHitboxes = !drawDebugHitboxes;
|
||||
Core.settings.put("drawhitboxes", !settings.getBool("drawhitboxes"));
|
||||
}
|
||||
|
||||
if(input.keyTap(Binding.detachCamera)){
|
||||
|
||||
@@ -1424,7 +1424,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
overlappingPlayer= player;
|
||||
}
|
||||
|
||||
plan.animScale = Mathf.lerpDelta(plan.animScale, 1f, 0.2f * Time.delta);
|
||||
plan.animScale = Mathf.lerpDelta(plan.animScale, 1f, 0.2f);
|
||||
plan.block.drawOtherPlayerPlan(plan, player.planEachable, overlappingPlan == plan ? 0.7f : 0.25f);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -47,10 +47,15 @@ public class MapIO{
|
||||
}
|
||||
|
||||
public static void writeMap(Fi file, Map map) throws IOException{
|
||||
writeMap(file, map, true);
|
||||
}
|
||||
|
||||
/** @param embed if true, assets will be embedded in the map - this is needed for external export. */
|
||||
public static void writeMap(Fi file, Map map, boolean embed) throws IOException{
|
||||
try{
|
||||
SaveIO.write(file, new SaveOptions(){{
|
||||
extraTags = map.tags;
|
||||
embedAssets = true;
|
||||
embedAssets = embed;
|
||||
}});
|
||||
}catch(Exception e){
|
||||
throw new IOException(e);
|
||||
|
||||
@@ -630,6 +630,7 @@ public class TypeIO{
|
||||
int x = read.us();
|
||||
int y = read.us();
|
||||
Block block = Vars.content.block(read.us());
|
||||
if(block == null) throw new ArcRuntimeException("Invalid block ID in block plans! Client is likely using an incorrectly configured mod.");
|
||||
int rotation = (block.rotate ? read.b() : 0);
|
||||
Object config = readClientPlanConfig(read);
|
||||
BuildPlan plan = new BuildPlan(x, y, rotation, block, config);
|
||||
|
||||
@@ -1558,7 +1558,7 @@ public class LExecutor{
|
||||
public void run(LExecutor exec){
|
||||
if(net.client()) return;
|
||||
|
||||
Tile tile = world.tile(x.numi(), y.numi());
|
||||
Tile tile = world.tile(Mathf.round(x.numf()), Mathf.round(y.numf()));
|
||||
if(tile != null && block.obj() instanceof Block b){
|
||||
switch(layer){
|
||||
case ore -> {
|
||||
|
||||
@@ -68,7 +68,7 @@ public class LStatements{
|
||||
|
||||
table.add(" = ");
|
||||
|
||||
fields(table, target, str -> target = str);
|
||||
field(table, target, str -> target = str);
|
||||
|
||||
row(table);
|
||||
|
||||
@@ -100,7 +100,7 @@ public class LStatements{
|
||||
|
||||
table.add(" to ");
|
||||
|
||||
fields(table, target, str -> target = str);
|
||||
field(table, target, str -> target = str);
|
||||
|
||||
row(table);
|
||||
|
||||
@@ -1574,7 +1574,7 @@ public class LStatements{
|
||||
}).size(80f, 40f).pad(4f).color(table.color);
|
||||
|
||||
if(statusNames == null){
|
||||
statusNames = content.statusEffects().select(s -> !s.isHidden()).map(s -> s.name).toArray(String.class);
|
||||
statusNames = content.statusEffects().map(s -> s.name).toArray(String.class);
|
||||
}
|
||||
|
||||
table.button(b -> {
|
||||
|
||||
@@ -189,11 +189,15 @@ public class Maps{
|
||||
load();
|
||||
}
|
||||
|
||||
public Map saveMap(ObjectMap<String, String> baseTags){
|
||||
return saveMap(baseTags, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a custom map to the directory. This updates all values and stored data necessary.
|
||||
* The tags are copied to prevent mutation later.
|
||||
*/
|
||||
public Map saveMap(ObjectMap<String, String> baseTags){
|
||||
public Map saveMap(ObjectMap<String, String> baseTags, boolean embedAssets){
|
||||
|
||||
try{
|
||||
StringMap tags = new StringMap(baseTags);
|
||||
@@ -219,7 +223,7 @@ public class Maps{
|
||||
//create map, write it, etc etc etc
|
||||
Map map = new Map(file, world.width(), world.height(), tags, true);
|
||||
fogControl.resetFog();
|
||||
MapIO.writeMap(file, map);
|
||||
MapIO.writeMap(file, map, embedAssets);
|
||||
|
||||
if(!headless){
|
||||
//reset attributes
|
||||
|
||||
@@ -165,8 +165,6 @@ public class ClassMap{
|
||||
classes.put("BaseShieldBuild", mindustry.world.blocks.defense.BaseShield.BaseShieldBuild.class);
|
||||
classes.put("BuildTurret", mindustry.world.blocks.defense.BuildTurret.class);
|
||||
classes.put("BuildTurretBuild", mindustry.world.blocks.defense.BuildTurret.BuildTurretBuild.class);
|
||||
classes.put("DirectionalForceProjector", mindustry.world.blocks.defense.DirectionalForceProjector.class);
|
||||
classes.put("DirectionalForceProjectorBuild", mindustry.world.blocks.defense.DirectionalForceProjector.DirectionalForceProjectorBuild.class);
|
||||
classes.put("Door", mindustry.world.blocks.defense.Door.class);
|
||||
classes.put("DoorBuild", mindustry.world.blocks.defense.Door.DoorBuild.class);
|
||||
classes.put("ForceProjector", mindustry.world.blocks.defense.ForceProjector.class);
|
||||
@@ -422,9 +420,6 @@ public class ClassMap{
|
||||
classes.put("Unloader", mindustry.world.blocks.storage.Unloader.class);
|
||||
classes.put("ContainerStat", mindustry.world.blocks.storage.Unloader.ContainerStat.class);
|
||||
classes.put("UnloaderBuild", mindustry.world.blocks.storage.Unloader.UnloaderBuild.class);
|
||||
classes.put("DroneCenter", mindustry.world.blocks.units.DroneCenter.class);
|
||||
classes.put("DroneCenterBuild", mindustry.world.blocks.units.DroneCenter.DroneCenterBuild.class);
|
||||
classes.put("EffectDroneAI", mindustry.world.blocks.units.DroneCenter.EffectDroneAI.class);
|
||||
classes.put("Reconstructor", mindustry.world.blocks.units.Reconstructor.class);
|
||||
classes.put("ReconstructorBuild", mindustry.world.blocks.units.Reconstructor.ReconstructorBuild.class);
|
||||
classes.put("RepairTower", mindustry.world.blocks.units.RepairTower.class);
|
||||
|
||||
@@ -89,6 +89,7 @@ public class DataImagePacker{
|
||||
}
|
||||
}
|
||||
|
||||
AtomicBoolean failedEnv = new AtomicBoolean();
|
||||
var tasks = new Seq<Future<?>>();
|
||||
for(var image : toPack){
|
||||
tasks.add(Vars.mainExecutor.submit(() -> {
|
||||
@@ -101,27 +102,32 @@ public class DataImagePacker{
|
||||
String name = regionPrefix + image.name;
|
||||
|
||||
if(anyEnv && image.path.contains("blocks/environment/")){
|
||||
envPacker.pack(name, pixmap);
|
||||
if(!failedEnv.get()) envPacker.pack(name, pixmap);
|
||||
}else{
|
||||
packer.pack(name, pixmap);
|
||||
}
|
||||
|
||||
pixmap.dispose();
|
||||
}catch(Throwable e){
|
||||
Log.err("Invalid patch image: " + image.path, e);
|
||||
if(e instanceof ArcRuntimeException && e.getMessage().contains("one page")){
|
||||
failedEnv.set(true);
|
||||
}else{
|
||||
Log.err("Invalid patch image: " + image.path, e);
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
Threads.awaitAll(tasks);
|
||||
|
||||
if(envPacker != null && failedEnv.get()){
|
||||
Log.warn("[Patch Atlas] Unable to fit all environment images into a " + envPacker.getPageWidth() + "x" + envPacker.getPageHeight() + " page. Reduce the size or number of images.");
|
||||
}
|
||||
|
||||
TextureFilter filter = Core.settings.getBool("linear", !Vars.mobile) ? TextureFilter.linear : TextureFilter.nearest;
|
||||
patchAtlas = packer.generateTextureAtlas(filter, filter, false);
|
||||
|
||||
if(envPacker != null && envPacker.getPages().size > 0){
|
||||
if(envPacker.getPages().size > 1){
|
||||
Log.warn("[Patch Atlas] Unable to fit all environment images into a " + envPacker.getPageWidth() + "x" + envPacker.getPageHeight() + " page. Reduce the size or number of images.");
|
||||
}
|
||||
//directly update existing atlas page's reserved region
|
||||
var page = envPacker.getPages().first();
|
||||
envReserveRegion.texture.draw(page.getPixmap(), envReserveRegion.getX(), envReserveRegion.getY());
|
||||
|
||||
@@ -197,13 +197,6 @@ public class DataPatcher{
|
||||
|
||||
parser.finishParsing();
|
||||
|
||||
for(var errored : dpMod.erroredContent){
|
||||
if(errored.minfo.error != null && errored.minfo.asset != null){
|
||||
errored.minfo.asset.warnings.add(errored.minfo.error);
|
||||
}
|
||||
Vars.content.remove(errored);
|
||||
}
|
||||
|
||||
addedContent.clear();
|
||||
Seq<Content> all = addedContent;
|
||||
|
||||
@@ -211,6 +204,13 @@ public class DataPatcher{
|
||||
all.addAll(arr.select(c -> c.minfo.mod == dpMod));
|
||||
}
|
||||
|
||||
for(var errored : dpMod.erroredContent){
|
||||
if(errored.minfo.error != null && errored.minfo.asset != null){
|
||||
errored.minfo.asset.warnings.add(errored.minfo.error);
|
||||
}
|
||||
Vars.content.remove(errored);
|
||||
}
|
||||
|
||||
for(var cont : all){
|
||||
try{
|
||||
cont.init();
|
||||
|
||||
@@ -63,7 +63,8 @@ public class SteamAdmin{
|
||||
}
|
||||
|
||||
public static boolean isBanned(String id){
|
||||
if(!id.startsWith("steam:")) return false;
|
||||
//bans are ignored with private lobbies
|
||||
if(!id.startsWith("steam:") || !Core.settings.getBool("steampublichost2")) return false;
|
||||
return data.bans.contains(id.substring("steam:".length()));
|
||||
}
|
||||
|
||||
|
||||
@@ -141,9 +141,19 @@ public class Menus{
|
||||
infoPopup(message, duration, align, top, left, bottom, right);
|
||||
}
|
||||
|
||||
@Remote(variants = Variant.both, unreliable = true)
|
||||
public static void label(@Nullable String message, int id, float duration, float worldx, float worldy, int flags){
|
||||
ui.showLabel(message, id, duration, worldx, worldy, flags);
|
||||
}
|
||||
|
||||
@Remote(variants = Variant.both)
|
||||
public static void labelReliable(@Nullable String message, int id, float duration, float worldx, float worldy, int flags){
|
||||
label(message, id, duration, worldx, worldy, flags);
|
||||
}
|
||||
|
||||
@Remote(variants = Variant.both, unreliable = true)
|
||||
public static void label(@Nullable String message, int id, float duration, float worldx, float worldy){
|
||||
ui.showLabel(message, id, duration, worldx, worldy);
|
||||
label(message, id, duration, worldx, worldy, WorldLabel.flagBackground | WorldLabel.flagAutoscale | WorldLabel.flagOutline);
|
||||
}
|
||||
|
||||
@Remote(variants = Variant.both)
|
||||
|
||||
@@ -43,7 +43,7 @@ public class HostDialog extends BaseDialog{
|
||||
|
||||
cont.add().width(65f);
|
||||
|
||||
cont.check("@steam.friendsonly", !Core.settings.getBool("steampublichost"), val -> Core.settings.put("steampublichost", !val)).colspan(2).left()
|
||||
cont.check("@steam.friendsonly", !Core.settings.getBool("steampublichost2"), val -> Core.settings.put("steampublichost2", !val)).colspan(2).left()
|
||||
.with(c -> ui.addDescTooltip(c, "@steam.friendsonly.tooltip")).padBottom(15f).row();
|
||||
}
|
||||
|
||||
@@ -98,9 +98,9 @@ public class HostDialog extends BaseDialog{
|
||||
player.admin = true;
|
||||
Events.fire(new HostEvent());
|
||||
|
||||
if(steam && Core.settings.getBool("steampublichost")){
|
||||
if(steam && Core.settings.getBool("steampublichost2")){
|
||||
if(Version.modifier.contains("beta") || Version.modifier.contains("alpha")){
|
||||
Core.settings.put("steampublichost", false);
|
||||
Core.settings.put("steampublichost2", false);
|
||||
platform.updateLobby();
|
||||
Core.settings.getBoolOnce("betapublic", () -> ui.showInfo("@public.beta"));
|
||||
}
|
||||
|
||||
@@ -598,6 +598,8 @@ public class JoinDialog extends BaseDialog{
|
||||
netClient.disconnectQuietly();
|
||||
});
|
||||
|
||||
ui.editor.hide();
|
||||
|
||||
Time.runTask(2f, () -> {
|
||||
logic.reset();
|
||||
net.reset();
|
||||
|
||||
@@ -58,6 +58,14 @@ public class PausedDialog extends BaseDialog{
|
||||
});
|
||||
|
||||
if(!mobile){
|
||||
if(steam){
|
||||
cont.check("@steam.friendsonly", !Core.settings.getBool("steampublichost2"), val -> {
|
||||
Core.settings.put("steampublichost2", !val);
|
||||
platform.updateLobby();
|
||||
}).colspan(2).left().with(c -> ui.addDescTooltip(c, "@steam.friendsonly.tooltip")).width(440f)
|
||||
.visible(() -> net.server()).center().colspan(2).fillX().padBottom(10f).row();
|
||||
}
|
||||
|
||||
float dw = 220f;
|
||||
cont.defaults().width(dw).height(55).pad(5f);
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ import mindustry.game.EventType.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.input.*;
|
||||
import mindustry.type.Planet;
|
||||
import mindustry.type.*;
|
||||
import mindustry.ui.*;
|
||||
|
||||
import java.io.*;
|
||||
@@ -36,6 +36,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
public SettingsTable graphics;
|
||||
public SettingsTable game;
|
||||
public SettingsTable sound;
|
||||
public SettingsTable dev;
|
||||
public SettingsTable main;
|
||||
|
||||
private Table prefs;
|
||||
@@ -63,6 +64,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
graphics.rebuild();
|
||||
sound.rebuild();
|
||||
game.rebuild();
|
||||
dev.rebuild();
|
||||
updateScrollFocus();
|
||||
lastRebuildSize[0] = Core.graphics.getWidth();
|
||||
lastRebuildSize[1] = Core.graphics.getHeight();
|
||||
@@ -78,6 +80,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
game = new SettingsTable();
|
||||
graphics = new SettingsTable();
|
||||
sound = new SettingsTable();
|
||||
dev = new SettingsTable();
|
||||
|
||||
prefs = new Table();
|
||||
prefs.top();
|
||||
@@ -347,6 +350,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
}
|
||||
|
||||
menu.button("@settings.data", Icon.save, style, isize, () -> dataDialog.show()).marginLeft(marg).row();
|
||||
menu.button("@settings.dev", Icon.fileCode, style, isize, () -> visible(3)).marginLeft(marg).row();
|
||||
|
||||
int i = 3;
|
||||
for(var cat : categories){
|
||||
@@ -411,25 +415,13 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
game.checkPref("doubletapmine", false);
|
||||
game.checkPref("commandmodehold", true);
|
||||
|
||||
if(!ios){
|
||||
game.checkPref("modcrashdisable", true);
|
||||
}
|
||||
|
||||
if(steam){
|
||||
game.sliderPref("playerlimit", 16, 2, 32, i -> {
|
||||
platform.updateLobby();
|
||||
return i + "";
|
||||
});
|
||||
|
||||
if(!Version.modifier.contains("beta")){
|
||||
game.checkPref("steampublichost", false, i -> {
|
||||
platform.updateLobby();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
game.checkPref("console", false);
|
||||
|
||||
graphics.sliderPref("uiEdgePadding", 0, 0, 100, s -> s + "px", s -> {
|
||||
if(ui != null){
|
||||
ui.updateMargins();
|
||||
@@ -573,6 +565,14 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
if(!mobile){
|
||||
Core.settings.put("swapdiagonal", false);
|
||||
}
|
||||
|
||||
dev.sliderPref("buildingtimestep", 30, 10, 65, 5, s -> s > 60 ? bundle.get("off") : s + "");
|
||||
dev.checkPref("console", false);
|
||||
dev.checkPref("drawhitboxes", false);
|
||||
|
||||
if(!ios){
|
||||
dev.checkPref("modcrashdisable", true);
|
||||
}
|
||||
}
|
||||
|
||||
public void exportData(Fi file) throws IOException{
|
||||
@@ -648,7 +648,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
prefs.clearChildren();
|
||||
|
||||
Seq<Table> tables = new Seq<>();
|
||||
tables.addAll(game, graphics, sound);
|
||||
tables.addAll(game, graphics, sound, dev);
|
||||
for(var custom : categories){
|
||||
tables.add(custom.table);
|
||||
}
|
||||
@@ -816,11 +816,18 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
|
||||
@Override
|
||||
public void add(SettingsTable table){
|
||||
CheckBox box = new CheckBox(title);
|
||||
Button box = new Button(Styles.grayt);
|
||||
box.background(Styles.grayPanel);
|
||||
box.margin(10f);
|
||||
|
||||
box.add(new Image()).update(i -> i.setDrawable(box.isOver() ? (box.isChecked() ? Tex.checkOnOver : Tex.checkOver) : box.isChecked() ? Tex.checkOn : Tex.checkOff))
|
||||
.size(32f).padRight(8f).padLeft(-4f);
|
||||
|
||||
box.add(title);
|
||||
|
||||
box.update(() -> box.setChecked(settings.getBool(name)));
|
||||
|
||||
box.changed(() -> {
|
||||
box.clicked(() -> {
|
||||
settings.put(name, box.isChecked());
|
||||
if(changed != null){
|
||||
changed.get(box.isChecked());
|
||||
@@ -828,7 +835,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
});
|
||||
|
||||
box.left();
|
||||
addDesc(table.add(box).left().padTop(3f).get());
|
||||
addDesc(table.add(box).minWidth(Math.min(500f, Core.graphics.getWidth() / 1.2f / Scl.scl(1f))).fillX().height(45f).left().padTop(7f).get());
|
||||
table.row();
|
||||
}
|
||||
}
|
||||
@@ -869,7 +876,7 @@ public class SettingsMenuDialog extends BaseDialog{
|
||||
|
||||
slider.change();
|
||||
|
||||
addDesc(table.stack(slider, content).width(Math.min(Core.graphics.getWidth() / 1.2f, 460f)).left().padTop(4f).get());
|
||||
addDesc(table.stack(slider, content).width(Math.min(Core.graphics.getWidth() / 1.2f / Scl.scl(1f), 500f)).left().padTop(4f).get());
|
||||
table.row();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ public class HudFragment{
|
||||
|
||||
private Seq<Block> blocksOut = new Seq<>();
|
||||
private Table hudLabel;
|
||||
private float coreAttackTime;
|
||||
|
||||
private static ObjectSet<String> favoriteBlocks = new ObjectSet<>();
|
||||
private static String lastFavorited = null;
|
||||
@@ -592,9 +593,11 @@ public class HudFragment{
|
||||
c.top().collapser(coreItems, () -> Core.settings.getBool("coreitems") && !mobile && shown).fillX().row();
|
||||
|
||||
float notifDuration = 240f;
|
||||
float[] coreAttackTime = {0};
|
||||
|
||||
Events.run(Trigger.teamCoreDamage, () -> coreAttackTime[0] = notifDuration);
|
||||
Events.run(Trigger.teamCoreDamage, () -> coreAttackTime = notifDuration);
|
||||
Events.on(ResetEvent.class, e -> {
|
||||
coreAttackTime = 0f;
|
||||
});
|
||||
|
||||
//'core is under attack' table
|
||||
c.collapser(top -> top.background(Styles.black6).add("@coreattack").pad(8)
|
||||
@@ -608,13 +611,13 @@ public class HudFragment{
|
||||
})
|
||||
.update(label -> label.color.set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time, 2f, 1f))), true,
|
||||
() -> {
|
||||
if(!shown || state.isPaused()) return false;
|
||||
if(state.isMenu() || !player.team().data().hasCore()){
|
||||
coreAttackTime[0] = 0f;
|
||||
coreAttackTime = 0f;
|
||||
return false;
|
||||
}
|
||||
if(!shown || state.isPaused()) return false;
|
||||
|
||||
return (coreAttackTime[0] -= Time.delta) > 0;
|
||||
return (coreAttackTime -= Time.delta) > 0;
|
||||
})
|
||||
.touchable(Touchable.disabled)
|
||||
.fillX().row();
|
||||
@@ -1070,7 +1073,6 @@ public class HudFragment{
|
||||
lcell[0].padRight(-42f);
|
||||
}
|
||||
table.invalidateHierarchy();
|
||||
table.pack();
|
||||
couldSkip[0] = can;
|
||||
}
|
||||
|
||||
|
||||
@@ -788,9 +788,9 @@ public class PlacementFragment{
|
||||
|
||||
//check tile being hovered over
|
||||
Tile hoverTile = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y);
|
||||
if(hoverTile != null){
|
||||
if(hoverTile != null && hoverTile.inMapArea()){
|
||||
//if the tile has a building, display it
|
||||
if(hoverTile.build != null && hoverTile.build.displayable() && !hoverTile.build.inFogTo(player.team())){
|
||||
if(hoverTile.build != null && hoverTile.build.displayable() && !hoverTile.build.inFogTo(player.team()) && hoverTile.build.inMapArea()){
|
||||
return nextFlowBuild = hoverTile.build;
|
||||
}
|
||||
|
||||
|
||||
@@ -190,8 +190,6 @@ public class PlayerListFragment{
|
||||
var teamSelect = new BaseDialog(Core.bundle.get("player.team") + ": " + user.name);
|
||||
teamSelect.setFillParent(false);
|
||||
|
||||
var group = new ButtonGroup<>();
|
||||
|
||||
int i = 0;
|
||||
|
||||
for(Team team : Team.baseTeams){
|
||||
@@ -203,7 +201,7 @@ public class PlayerListFragment{
|
||||
Call.adminRequest(user, AdminAction.switchTeam, team);
|
||||
teamSelect.hide();
|
||||
});
|
||||
teamSelect.cont.add(b).size(50f).checked(a -> user.team() == team).group(group);
|
||||
teamSelect.cont.add(b).size(50f).checked(a -> user.team() == team);
|
||||
|
||||
if(i++ % 3 == 2) teamSelect.cont.row();
|
||||
}
|
||||
|
||||
@@ -159,6 +159,10 @@ public class Tile implements Position, QuadTreeObject, Displayable{
|
||||
return 0;
|
||||
}
|
||||
|
||||
public boolean inMapArea(){
|
||||
return !state.rules.limitMapArea || Rect.contains(state.rules.limitX , state.rules.limitY , state.rules.limitWidth, state.rules.limitHeight, x, y);
|
||||
}
|
||||
|
||||
public float worldx(){
|
||||
return x * tilesize;
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@ public class BaseShield extends Block{
|
||||
hasPower = true;
|
||||
update = solid = true;
|
||||
rebuildable = false;
|
||||
canPickup = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -119,6 +119,8 @@ public class BuildTurret extends BaseTurret{
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
prevRotation = rotation;
|
||||
|
||||
unit.tile(this);
|
||||
unit.team(team);
|
||||
|
||||
|
||||
@@ -1,275 +0,0 @@
|
||||
package mindustry.world.blocks.defense;
|
||||
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.util.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.consumers.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
//TODO use completely different layer
|
||||
//TODO consume heat
|
||||
//TODO broken class!!!!!
|
||||
public class DirectionalForceProjector extends Block{
|
||||
protected static final Vec2 intersectOut = new Vec2(), p1 = new Vec2(), p2 = new Vec2();
|
||||
protected static DirectionalForceProjectorBuild paramEntity;
|
||||
protected static Effect paramEffect;
|
||||
protected static final Cons<Bullet> dirShieldConsumer = b -> {
|
||||
if(b.team != paramEntity.team && b.type.absorbable){
|
||||
//just in case
|
||||
float deltaAdd = 1.1f;
|
||||
|
||||
if(Intersector.intersectSegments(b.x, b.y,
|
||||
b.x + b.vel.x * (Time.delta + deltaAdd),
|
||||
b.y + b.vel.y * (Time.delta + deltaAdd), p1.x, p1.y, p2.x, p2.y, intersectOut)){
|
||||
b.set(intersectOut);
|
||||
b.absorb();
|
||||
paramEffect.at(b);
|
||||
paramEntity.hit = 1f;
|
||||
paramEntity.buildup += b.damage();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public float width = 30f;
|
||||
public float shieldHealth = 3000f;
|
||||
public float cooldownNormal = 1.75f;
|
||||
public float cooldownLiquid = 1.5f;
|
||||
public float cooldownBrokenBase = 0.35f;
|
||||
|
||||
public Effect absorbEffect = Fx.absorb;
|
||||
public Effect shieldBreakEffect = Fx.shieldBreak;
|
||||
public @Load("@-top") TextureRegion topRegion;
|
||||
|
||||
public float length = 40f;
|
||||
public float padSize = 40f;
|
||||
|
||||
public DirectionalForceProjector(String name){
|
||||
super(name);
|
||||
|
||||
rotate = true;
|
||||
rotateDraw = false;
|
||||
|
||||
update = true;
|
||||
solid = true;
|
||||
group = BlockGroup.projectors;
|
||||
envEnabled |= Env.space;
|
||||
ambientSound = Sounds.loopShield;
|
||||
ambientSoundVolume = 0.08f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
updateClipRadius((width + 3f));
|
||||
|
||||
super.init();
|
||||
|
||||
if(length < 0){
|
||||
length = size * tilesize/2f;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBars(){
|
||||
super.setBars();
|
||||
addBar("shield", (DirectionalForceProjectorBuild entity) -> new Bar("stat.shieldhealth", Pal.accent, () -> entity.broken ? 0f : 1f - entity.buildup / (shieldHealth)).blink(Color.white));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean outputsItems(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStats(){
|
||||
super.setStats();
|
||||
stats.add(Stat.shieldHealth, shieldHealth, StatUnit.none);
|
||||
stats.add(Stat.cooldownTime, (int) (shieldHealth / cooldownBrokenBase / 60f), StatUnit.seconds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawPlace(int x, int y, int rotation, boolean valid){
|
||||
drawPotentialLinks(x, y);
|
||||
|
||||
x *= tilesize;
|
||||
y *= tilesize;
|
||||
|
||||
Tmp.v1.set(length - size/2f, (width + size/2f)).rotate(rotation * 90).add(x, y);
|
||||
Tmp.v2.set(length - size/2f, -(width + size/2f)).rotate(rotation * 90).add(x, y);
|
||||
|
||||
Drawf.dashLine(Color.lightGray, x, y, Tmp.v1.x, Tmp.v1.y);
|
||||
Drawf.dashLine(Color.lightGray, x, y, Tmp.v2.x, Tmp.v2.y);
|
||||
Drawf.dashLine(Pal.accent, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y);
|
||||
}
|
||||
|
||||
public class DirectionalForceProjectorBuild extends Building{
|
||||
public boolean broken = true;
|
||||
public float buildup, hit, warmup, shieldRadius;
|
||||
|
||||
@Override
|
||||
public boolean shouldAmbientSound(){
|
||||
return !broken && shieldRadius > 1f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pickedUp(){
|
||||
super.pickedUp();
|
||||
shieldRadius = warmup = 0f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
shieldRadius = Mathf.lerpDelta(shieldRadius, broken ? 0f : warmup * width, 0.05f);
|
||||
|
||||
//TODO ?????????????????
|
||||
if(Mathf.chanceDelta(buildup / shieldHealth * 0.1f)){
|
||||
Fx.reactorsmoke.at(x + Mathf.range(tilesize / 2f), y + Mathf.range(tilesize / 2f));
|
||||
}
|
||||
|
||||
warmup = Mathf.lerpDelta(warmup, efficiency, 0.1f);
|
||||
|
||||
//TODO aaaaaaaaaaaaAAAAAAAAAAAAAAaa
|
||||
if(buildup > 0 && false){
|
||||
float scale = !broken ? cooldownNormal : cooldownBrokenBase;
|
||||
Consume cons = null;
|
||||
//if(cons.valid(this)){
|
||||
// cons.update(this);
|
||||
// scale *= (cooldownLiquid * (1f + (liquids.current().heatCapacity - 0.4f) * 0.9f));
|
||||
//}
|
||||
|
||||
buildup -= delta() * scale;
|
||||
}
|
||||
|
||||
if(broken && buildup <= 0){
|
||||
broken = false;
|
||||
}
|
||||
|
||||
if(buildup >= shieldHealth && !broken){
|
||||
broken = true;
|
||||
buildup = shieldHealth;
|
||||
shieldBreakEffect.at(x, y, shieldRadius, team.color);
|
||||
}
|
||||
|
||||
if(hit > 0f){
|
||||
hit -= 1f / 5f * Time.delta;
|
||||
}
|
||||
|
||||
deflectBullets();
|
||||
}
|
||||
|
||||
public void deflectBullets(){
|
||||
|
||||
if(shieldRadius > 0 && !broken){
|
||||
paramEntity = this;
|
||||
paramEffect = absorbEffect;
|
||||
|
||||
//top
|
||||
p1.set(length, shieldRadius).rotate(rotdeg());
|
||||
//bot
|
||||
p2.set(length, -shieldRadius).rotate(rotdeg());
|
||||
|
||||
//"check" radius is grown to catch bullets moving at high velocity
|
||||
Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(padSize);
|
||||
|
||||
p1.add(x, y);
|
||||
p2.add(x, y);
|
||||
|
||||
Groups.bullet.intersect(x + Tmp.r1.x, y + Tmp.r1.y, Tmp.r1.width, Tmp.r1.height, dirShieldConsumer);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
super.draw();
|
||||
|
||||
//TODO wrong
|
||||
if(buildup > 0f){
|
||||
Draw.alpha(buildup / shieldHealth * 0.75f);
|
||||
Draw.z(Layer.blockAdditive);
|
||||
Draw.blend(Blending.additive);
|
||||
Draw.rect(topRegion, x, y);
|
||||
Draw.blend();
|
||||
Draw.z(Layer.block);
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
drawShield();
|
||||
}
|
||||
|
||||
public void drawShield(){
|
||||
if(!broken && shieldRadius > 0){
|
||||
float rot = rotdeg();
|
||||
|
||||
p1.set(length, shieldRadius).rotate(rot).add(this);
|
||||
p2.set(length, -shieldRadius).rotate(rot).add(this);
|
||||
float size = 4f;
|
||||
Tmp.r1.set(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y).normalize().grow(size);
|
||||
|
||||
Draw.z(Layer.shields);
|
||||
|
||||
Draw.color(team.color, Color.white, Mathf.clamp(hit));
|
||||
|
||||
if(renderer.animateShields){
|
||||
Fill.rect(Tmp.r1);
|
||||
|
||||
Tmp.v1.set(length - size/2f, (shieldRadius + size/2f)).rotate(rot).add(this);
|
||||
Tmp.v2.set(length - size/2f, -(shieldRadius + size/2f)).rotate(rot).add(this);
|
||||
|
||||
//Fill.tri(x, y, Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y);
|
||||
Lines.stroke(3f);
|
||||
Lines.line(x, y, Tmp.v1.x, Tmp.v1.y);
|
||||
Lines.line(x, y, Tmp.v2.x, Tmp.v2.y);
|
||||
|
||||
Draw.z(Layer.shields);
|
||||
|
||||
for(int i : Mathf.signs){
|
||||
Tmp.v1.set(length - size/2f, (shieldRadius + size/2f) * i).rotate(rot).add(this);
|
||||
Tmp.v3.set(length + size/2f, (shieldRadius + size/2f) * i).rotate(rot).add(this);
|
||||
Tmp.v2.set(length, (shieldRadius + size) * i).rotate(rot).add(this);
|
||||
Fill.tri(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, Tmp.v3.x, Tmp.v3.y);
|
||||
}
|
||||
}else{
|
||||
Lines.stroke(1.5f);
|
||||
Draw.alpha(0.09f + Mathf.clamp(0.08f * hit));
|
||||
Fill.rect(Tmp.r1);
|
||||
Draw.alpha(1f);
|
||||
Lines.rect(Tmp.r1);
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
Draw.reset();
|
||||
}
|
||||
}
|
||||
|
||||
//TODO
|
||||
/*
|
||||
@Override
|
||||
public void write(Writes write){
|
||||
super.write(write);
|
||||
write.bool(broken);
|
||||
write.f(buildup);
|
||||
write.f(radscl);
|
||||
write.f(warmup);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Reads read, byte revision){
|
||||
super.read(read, revision);
|
||||
broken = read.bool();
|
||||
buildup = read.f();
|
||||
radscl = read.f();
|
||||
warmup = read.f();
|
||||
}*/
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ public class Thruster extends Wall{
|
||||
public class ThrusterBuild extends WallBuild{
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
public void drawCached(){
|
||||
Draw.rect(block.region, x, y);
|
||||
Draw.rect(topRegion, x, y, rotdeg());
|
||||
}
|
||||
|
||||
@@ -5,11 +5,13 @@ import arc.audio.*;
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.util.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
import static mindustry.Vars.*;
|
||||
@@ -27,6 +29,10 @@ public class Wall extends Block{
|
||||
public boolean flashHit;
|
||||
public Color flashColor = Color.white;
|
||||
public Sound deflectSound = Sounds.none;
|
||||
/** If true, this block uses autotiling; variants are not supported. See https://github.com/GglLfr/tile-gen*/
|
||||
public boolean autotile = false;
|
||||
|
||||
protected TextureRegion[] autotileRegions;
|
||||
|
||||
public Wall(String name){
|
||||
super(name);
|
||||
@@ -54,6 +60,15 @@ public class Wall extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(){
|
||||
super.load();
|
||||
|
||||
if(autotile){
|
||||
autotileRegions = TileBitmask.load(name);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
if(size == 2 && destroySound == Sounds.unset) destroySound = Sounds.blockExplodeWall;
|
||||
@@ -70,11 +85,61 @@ public class Wall extends Block{
|
||||
}
|
||||
|
||||
public class WallBuild extends Building{
|
||||
public float hit;
|
||||
protected int autotileBits;
|
||||
protected float hit;
|
||||
|
||||
protected void updateAutotileBits(){
|
||||
int prev = autotileBits;
|
||||
autotileBits = 0;
|
||||
for(int i = 0; i < 8; i++){
|
||||
int dx = Geometry.d8[i].x, dy = Geometry.d8[i].y;
|
||||
Tile other = tile.nearby(dx * size, dy * size);
|
||||
if(other != null && other.build != null && other.build.block == block && other.build.team == team){
|
||||
autotileBits |= (1 << i);
|
||||
}
|
||||
}
|
||||
if(prev != autotileBits) recache();
|
||||
}
|
||||
|
||||
protected void updateOtherBits(){
|
||||
for(int i = 0; i < 8; i++){
|
||||
int dx = Geometry.d8[i].x, dy = Geometry.d8[i].y;
|
||||
Tile other = tile.nearby(dx * size, dy * size);
|
||||
if(other != null && other.build != null && other.isCenter() && other.build.block == block && other.build.team == team && other.build instanceof WallBuild w){
|
||||
w.updateAutotileBits();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProximityUpdate(){
|
||||
super.onProximityUpdate();
|
||||
|
||||
if(autotile) updateAutotileBits();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProximityRemoved(){
|
||||
super.onProximityRemoved();
|
||||
|
||||
if(autotile) updateOtherBits();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProximityAdded(){
|
||||
super.onProximityAdded();
|
||||
|
||||
if(autotile && !world.isGenerating()) updateOtherBits();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawCached(){
|
||||
super.draw();
|
||||
if(autotile){
|
||||
TextureRegion region = autotileRegions[TileBitmask.values[autotileBits]];
|
||||
Draw.rect(region, x, y);
|
||||
}else{
|
||||
super.draw();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -5,6 +5,7 @@ import arc.math.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
@@ -111,9 +112,14 @@ public class BaseTurret extends Block{
|
||||
}
|
||||
|
||||
public class BaseTurretBuild extends Building implements Ranged, RotBlock{
|
||||
protected float prevRotation = Float.NaN;
|
||||
public float rotation = 90;
|
||||
public float activationTimer = 0;
|
||||
|
||||
public float getVisualRotation(){
|
||||
return Renderer.blockTimestep ? (Float.isNaN(prevRotation) ? rotation : Mathf.slerp(prevRotation, rotation, Renderer.blockInterp)) : rotation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void placed(){
|
||||
super.placed();
|
||||
|
||||
@@ -63,7 +63,7 @@ public class ContinuousTurret extends Turret{
|
||||
|
||||
@Override
|
||||
public boolean shouldConsume(){
|
||||
return isShooting();
|
||||
return isShooting;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -123,7 +123,7 @@ public class ContinuousTurret extends Turret{
|
||||
entry.bullet.damage = entry.bullet.type.damage * Math.min(efficiency, 1f) * timeScale * entry.bullet.damageMultiplier();
|
||||
}
|
||||
|
||||
if(isShooting() && hasAmmo()){
|
||||
if(isShooting && hasAmmo()){
|
||||
entry.bullet.time = entry.bullet.lifetime * entry.bullet.type.optimalLifeFract * Math.min(shootWarmup, efficiency);
|
||||
entry.bullet.keepAlive = true;
|
||||
}
|
||||
|
||||
@@ -51,7 +51,7 @@ public class ItemTurret extends Turret{
|
||||
|
||||
stats.remove(Stat.itemCapacity);
|
||||
stats.add(Stat.ammo, StatValues.ammo(ammoTypes, name));
|
||||
stats.add(Stat.ammoCapacity, maxAmmo / ammoPerShot, StatUnit.shots);
|
||||
stats.add(Stat.ammoCapacity, maxAmmo / Math.max(ammoPerShot, 1), StatUnit.shots);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -52,7 +52,8 @@ public class LaserTurret extends PowerTurret{
|
||||
@Override
|
||||
public boolean shouldConsume(){
|
||||
//still consumes power when bullet is around
|
||||
return bullets.any() || isActive() || isShooting();
|
||||
if(bullets.any() || isActive()) return true;
|
||||
return isShooting;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -150,6 +150,8 @@ public class Turret extends ReloadTurret{
|
||||
public float elevation = -1f;
|
||||
/** How much the screen shakes per shot. */
|
||||
public float shake = 0f;
|
||||
/** Maximum shots fired in a single building tick. */
|
||||
public int maxShotsPerUpdate = 3;
|
||||
|
||||
/** Defines drawing behavior for this turret. */
|
||||
public DrawBlock drawer = new DrawTurret();
|
||||
@@ -260,7 +262,6 @@ public class Turret extends ReloadTurret{
|
||||
public abstract BulletType type();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean rotatedOutput(int x, int y){
|
||||
return false;
|
||||
@@ -289,7 +290,7 @@ public class Turret extends ReloadTurret{
|
||||
public @Nullable Posc target;
|
||||
public Vec2 targetPos = new Vec2();
|
||||
public BlockUnitc unit = (BlockUnitc)UnitTypes.block.create(team);
|
||||
public boolean wasShooting;
|
||||
public boolean wasShooting, isShooting;
|
||||
public int queuedBullets = 0;
|
||||
|
||||
public float heatReq;
|
||||
@@ -357,12 +358,12 @@ public class Turret extends ReloadTurret{
|
||||
|
||||
@Override
|
||||
public float drawrot(){
|
||||
return rotation - 90;
|
||||
return getVisualRotation() - 90;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldConsume(){
|
||||
return isShooting() || reloadCounter < reload;
|
||||
return isShooting || reloadCounter < reload;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -410,7 +411,7 @@ public class Turret extends ReloadTurret{
|
||||
case rotation -> rotation;
|
||||
case shootX -> World.conv(targetPos.x);
|
||||
case shootY -> World.conv(targetPos.y);
|
||||
case shooting -> isShooting() ? 1 : 0;
|
||||
case shooting -> isShooting ? 1 : 0;
|
||||
case progress -> progress();
|
||||
default -> super.sense(sensor);
|
||||
};
|
||||
@@ -427,7 +428,7 @@ public class Turret extends ReloadTurret{
|
||||
}
|
||||
|
||||
public boolean isShooting(){
|
||||
return alwaysShooting || (unit.controller() instanceof Player ? unit.isShooting() : logicControlled() ? logicShooting : target != null);
|
||||
return isShooting;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -438,6 +439,10 @@ public class Turret extends ReloadTurret{
|
||||
return (Unit)unit;
|
||||
}
|
||||
|
||||
public boolean controlled(){
|
||||
return unit.isPlayer();
|
||||
}
|
||||
|
||||
public boolean logicControlled(){
|
||||
return logicControlTime > 0;
|
||||
}
|
||||
@@ -484,7 +489,10 @@ public class Turret extends ReloadTurret{
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
prevRotation = rotation;
|
||||
|
||||
if(!validateTarget()) target = null;
|
||||
isShooting = alwaysShooting || (unit.controller() instanceof Player ? unit.isShooting() : logicControlled() ? logicShooting : target != null);
|
||||
|
||||
if(unit.isPlayer()){ //there's no reason to update this when a player isn't controlling it
|
||||
unit.ammo(getAmmoFraction());
|
||||
@@ -494,8 +502,8 @@ public class Turret extends ReloadTurret{
|
||||
soundLoop.update(x, y, shouldActiveSound(), activeSoundVolume());
|
||||
}
|
||||
|
||||
float warmupTarget = (isShooting() && canConsume()) || charging() ? 1f : 0f;
|
||||
if(warmupTarget > 0 && !isControlled()){
|
||||
float warmupTarget = (isShooting && canConsume()) || charging() ? 1f : 0f;
|
||||
if(warmupTarget > 0 && !controlled()){
|
||||
warmupHold = 1f;
|
||||
}
|
||||
if(warmupHold > 0f){
|
||||
@@ -568,7 +576,7 @@ public class Turret extends ReloadTurret{
|
||||
if(validateTarget()){
|
||||
boolean canShoot;
|
||||
|
||||
if(isControlled()){ //player behavior
|
||||
if(controlled()){ //player behavior
|
||||
targetPos.set(unit.aimX(), unit.aimY());
|
||||
canShoot = unit.isShooting();
|
||||
}else if(logicControlled()){ //logic behavior
|
||||
@@ -580,7 +588,7 @@ public class Turret extends ReloadTurret{
|
||||
canShoot = within(target, range() + (target instanceof Sized hb ? hb.hitSize()/1.9f : 0f));
|
||||
}
|
||||
|
||||
if(!isControlled()){
|
||||
if(!controlled()){
|
||||
unit.aimX(targetPos.x);
|
||||
unit.aimY(targetPos.y);
|
||||
}
|
||||
@@ -624,7 +632,7 @@ public class Turret extends ReloadTurret{
|
||||
}
|
||||
|
||||
protected boolean validateTarget(){
|
||||
return !Units.invalidateTarget(target, canHeal() ? Team.derelict : team, x, y) || isControlled() || logicControlled();
|
||||
return !Units.invalidateTarget(target, canHeal() ? Team.derelict : team, x, y) || controlled() || logicControlled();
|
||||
}
|
||||
|
||||
protected boolean canHeal(){
|
||||
@@ -713,9 +721,6 @@ public class Turret extends ReloadTurret{
|
||||
|
||||
protected void updateReload(){
|
||||
reloadCounter += delta() * ammoReloadMultiplier() * baseReloadSpeed();
|
||||
|
||||
//cap reload for visual reasons
|
||||
reloadCounter = Math.min(reloadCounter, reload);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -724,13 +729,16 @@ public class Turret extends ReloadTurret{
|
||||
}
|
||||
|
||||
protected void updateShooting(){
|
||||
if(charging() || shootWarmup < minWarmup) return;
|
||||
|
||||
if(reloadCounter >= reload && !charging() && shootWarmup >= minWarmup){
|
||||
reloadCounter = Math.min(reloadCounter, reload * maxShotsPerUpdate);
|
||||
|
||||
while(reloadCounter >= reload){
|
||||
BulletType type = peekAmmo();
|
||||
|
||||
shoot(type);
|
||||
|
||||
reloadCounter %= reload;
|
||||
reloadCounter -= reload;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.entities.units.*;
|
||||
@@ -140,6 +141,14 @@ public class Conveyor extends Block implements Autotiler{
|
||||
|
||||
public float clogHeat = 0f;
|
||||
|
||||
private static int nextItemId = 0;
|
||||
|
||||
private int[] itemIds = new int[capacity];
|
||||
|
||||
private int prevLen = 0;
|
||||
private int[] prevItemIds = new int[capacity];
|
||||
private float[] prevXs = new float[capacity], prevYs = new float[capacity];
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
int frame = enabled && clogHeat <= 0.5f ? (int)(((Time.time * speed * 8f * timeScale * efficiency)) % 4) : 0;
|
||||
@@ -160,16 +169,52 @@ public class Conveyor extends Block implements Autotiler{
|
||||
Draw.rect(regions[blendbits][frame], x, y, tilesize * blendsclx, tilesize * blendscly, rotation * 90);
|
||||
|
||||
Draw.z(Layer.block - 0.1f);
|
||||
float layer = Layer.block - 0.1f, wwidth = world.unitWidth(), wheight = world.unitHeight(), scaling = 0.01f;
|
||||
|
||||
float
|
||||
|
||||
layer = Layer.block - 0.1f,
|
||||
wwidth = world.unitWidth(),
|
||||
wheight = world.unitHeight(),
|
||||
scaling = 0.01f,
|
||||
alpha = Renderer.blockInterp,
|
||||
|
||||
rotationRad = rotation * 90f * Mathf.degreesToRadians,
|
||||
cos = Mathf.cos(rotationRad),
|
||||
sin = Mathf.sin(rotationRad);
|
||||
|
||||
for(int i = 0; i < len; i++){
|
||||
Item item = ids[i];
|
||||
Tmp.v1.trns(rotation * 90, tilesize, 0);
|
||||
Tmp.v2.trns(rotation * 90, -tilesize / 2f, xs[i] * tilesize / 2f);
|
||||
long id = itemIds[i];
|
||||
|
||||
float cx = xs[i], cy = ys[i];
|
||||
|
||||
float px = cx, py = cy;
|
||||
boolean found = false;
|
||||
int start = Math.min(i, prevLen - 1);
|
||||
//TODO: awful code, should be deleted when a proper solution is found
|
||||
//scan for prev item's position based on ID (not as slow as it appears)
|
||||
for(int d = 0; d <= prevLen; d++){
|
||||
int lo = start - d, hi = start + d;
|
||||
if(lo >= 0 && prevItemIds[lo] == id){
|
||||
px = prevXs[lo]; py = prevYs[lo];
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
if(d != 0 && hi < prevLen && prevItemIds[hi] == id){
|
||||
px = prevXs[hi]; py = prevYs[hi];
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
float ixl = found ? Mathf.lerp(px, cx, alpha) : cx;
|
||||
float iyl = found ? Mathf.lerp(py, cy, alpha) : cy;
|
||||
|
||||
float
|
||||
ix = (x + Tmp.v1.x * ys[i] + Tmp.v2.x),
|
||||
iy = (y + Tmp.v1.y * ys[i] + Tmp.v2.y);
|
||||
vx = -tilesize / 2f + tilesize * iyl,
|
||||
vy = ixl * tilesize / 2f,
|
||||
ix = x + vx * cos - vy * sin,
|
||||
iy = y + vx * sin + vy * cos;
|
||||
|
||||
//keep draw position deterministic.
|
||||
Draw.z(layer + (ix / wwidth + iy / wheight) * scaling);
|
||||
@@ -252,6 +297,12 @@ public class Conveyor extends Block implements Autotiler{
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
//save snapshot for interpolation
|
||||
prevLen = len;
|
||||
System.arraycopy(itemIds, 0, prevItemIds, 0, len);
|
||||
System.arraycopy(xs, 0, prevXs, 0, len);
|
||||
System.arraycopy(ys, 0, prevYs, 0, len);
|
||||
|
||||
minitem = 1f;
|
||||
mid = 0;
|
||||
|
||||
@@ -262,7 +313,7 @@ public class Conveyor extends Block implements Autotiler{
|
||||
return;
|
||||
}
|
||||
|
||||
float nextMax = aligned ? 1f - Math.max(itemSpace - nextc.minitem, 0) : 1f;
|
||||
float nextMax = aligned ? 1f - Math.max(itemSpace - nextc.minitem, 0f) : 1f;
|
||||
float moved = speed * edelta();
|
||||
|
||||
for(int i = len - 1; i >= 0; i--){
|
||||
@@ -343,6 +394,7 @@ public class Conveyor extends Block implements Autotiler{
|
||||
xs[0] = 0;
|
||||
ys[0] = i * itemSpace;
|
||||
ids[0] = item;
|
||||
itemIds[0] = nextItemId++;
|
||||
items.add(item, 1);
|
||||
}
|
||||
|
||||
@@ -375,11 +427,13 @@ public class Conveyor extends Block implements Autotiler{
|
||||
xs[0] = x;
|
||||
ys[0] = 0;
|
||||
ids[0] = item;
|
||||
}else{ //idx = mid
|
||||
itemIds[0] = nextItemId++;
|
||||
}else{
|
||||
add(mid);
|
||||
xs[mid] = x;
|
||||
ys[mid] = 0.5f;
|
||||
ids[mid] = item;
|
||||
itemIds[mid] = nextItemId++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -466,6 +520,7 @@ public class Conveyor extends Block implements Autotiler{
|
||||
ids[i] = ids[i - 1];
|
||||
xs[i] = xs[i - 1];
|
||||
ys[i] = ys[i - 1];
|
||||
itemIds[i] = itemIds[i - 1];
|
||||
}
|
||||
|
||||
len++;
|
||||
@@ -476,6 +531,7 @@ public class Conveyor extends Block implements Autotiler{
|
||||
ids[i] = ids[i + 1];
|
||||
xs[i] = xs[i + 1];
|
||||
ys[i] = ys[i + 1];
|
||||
itemIds[i] = itemIds[i + 1];
|
||||
}
|
||||
|
||||
len--;
|
||||
|
||||
@@ -10,6 +10,7 @@ import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.entities.units.*;
|
||||
import mindustry.gen.*;
|
||||
@@ -135,6 +136,9 @@ public class Duct extends Block implements Autotiler{
|
||||
public @Nullable Building next;
|
||||
public @Nullable DuctBuild nextc;
|
||||
|
||||
float lastFrom, lastTo;
|
||||
Item lastItem;
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
draw(false);
|
||||
@@ -160,14 +164,26 @@ public class Duct extends Block implements Autotiler{
|
||||
}
|
||||
}
|
||||
|
||||
//draw item
|
||||
if(!under && current != null){
|
||||
Draw.z(Layer.blockUnder + 0.1f);
|
||||
Tmp.v1.set(Geometry.d4x(recDir) * tilesize / 2f, Geometry.d4y(recDir) * tilesize / 2f)
|
||||
.lerp(Geometry.d4x(r) * tilesize / 2f, Geometry.d4y(r) * tilesize / 2f,
|
||||
Mathf.clamp((progress + 1f) / (2f - 1f/speed)));
|
||||
if(Renderer.blockTimestep){
|
||||
//draw item
|
||||
if(!under && lastItem != null){
|
||||
Draw.z(Layer.blockUnder + 0.1f);
|
||||
Tmp.v1.set(Geometry.d4x(recDir) * tilesize / 2f, Geometry.d4y(recDir) * tilesize / 2f)
|
||||
.lerp(Geometry.d4x(r) * tilesize / 2f, Geometry.d4y(r) * tilesize / 2f,
|
||||
Mathf.clamp((Mathf.lerp(lastFrom, lastTo, Renderer.blockInterp) + 1f) / (2f - 1f/speed)));
|
||||
|
||||
Draw.rect(current.fullIcon, x + Tmp.v1.x, y + Tmp.v1.y, itemSize, itemSize);
|
||||
Draw.rect(lastItem.fullIcon, x + Tmp.v1.x, y + Tmp.v1.y, itemSize, itemSize);
|
||||
}
|
||||
}else{
|
||||
//draw item
|
||||
if(!under && current != null){
|
||||
Draw.z(Layer.blockUnder + 0.1f);
|
||||
Tmp.v1.set(Geometry.d4x(recDir) * tilesize / 2f, Geometry.d4y(recDir) * tilesize / 2f)
|
||||
.lerp(Geometry.d4x(r) * tilesize / 2f, Geometry.d4y(r) * tilesize / 2f,
|
||||
Mathf.clamp((progress + 1f) / (2f - 1f/speed)));
|
||||
|
||||
Draw.rect(current.fullIcon, x + Tmp.v1.x, y + Tmp.v1.y, itemSize, itemSize);
|
||||
}
|
||||
}
|
||||
|
||||
Draw.scl(xscl, yscl);
|
||||
@@ -191,16 +207,23 @@ public class Duct extends Block implements Autotiler{
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
lastItem = current;
|
||||
lastFrom = progress;
|
||||
progress += edelta() / speed * 2f;
|
||||
lastTo = progress;
|
||||
|
||||
if(current != null && next != null){
|
||||
if(progress >= (1f - 1f/speed) && moveForward(current)){
|
||||
float target = (1f - 1f/speed);
|
||||
|
||||
if(progress >= target && next.acceptItem(this, current)){
|
||||
next.handleItem(this, current);
|
||||
items.remove(current, 1);
|
||||
current = null;
|
||||
progress %= (1f - 1f/speed);
|
||||
|
||||
progress = 0f;
|
||||
}
|
||||
}else{
|
||||
progress = 0;
|
||||
lastTo = progress = 0;
|
||||
}
|
||||
|
||||
if(current == null && items.total() > 0){
|
||||
@@ -253,6 +276,7 @@ public class Duct extends Block implements Autotiler{
|
||||
yscl = bits[2];
|
||||
blending = bits[4];
|
||||
next = front();
|
||||
if(next != null && next.team != team) next = null;
|
||||
nextc = next instanceof DuctBuild d ? d : null;
|
||||
}
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ public class ItemBridge extends Block{
|
||||
public IntSeq incoming = new IntSeq(false, 4);
|
||||
public float warmup;
|
||||
public float time = -8f, timeSpeed;
|
||||
public boolean wasMoved, moved;
|
||||
public boolean wasMoved, moved, hadValidLink;
|
||||
public float transportCounter;
|
||||
|
||||
@Override
|
||||
@@ -330,7 +330,9 @@ public class ItemBridge extends Block{
|
||||
checkIncoming();
|
||||
|
||||
Tile other = world.tile(link);
|
||||
if(!linkValid(tile, other)){
|
||||
hadValidLink = linkValid(tile, other);
|
||||
|
||||
if(!hadValidLink){
|
||||
doDump();
|
||||
warmup = 0f;
|
||||
}else{
|
||||
@@ -491,7 +493,7 @@ public class ItemBridge extends Block{
|
||||
|
||||
@Override
|
||||
public boolean shouldConsume(){
|
||||
return linkValid(tile, world.tile(link)) && enabled;
|
||||
return hadValidLink && enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user