Compare commits

...
Author SHA1 Message Date
Anuken e453f3ccc7 Reverted the timestep revert 2026-06-25 02:34:36 -04:00
Anuken 2d1852470e Merge branch 'master' into fixed-timestep
# Conflicts:
#	core/src/mindustry/ui/dialogs/SettingsMenuDialog.java
2026-06-25 02:33:42 -04:00
Anuken 5ef7c8bce8 Reverted fixed timestep changes 2026-06-25 02:33:07 -04:00
Anuken 1afa757f3b default on fixed timestep 2026-06-25 02:27:49 -04:00
Anuken 692c4c65e4 cleanup 2026-06-25 02:18:24 -04:00
Anuken de5c858903 cleanup 2026-06-24 22:39:27 -04:00
Anuken 2effc25ad0 fixed timestep insanity 2026-06-24 19:45:10 -04:00
Anuken ca7f9662e2 Fixed some update bugs 2026-06-24 13:42:19 -04:00
Anuken b56d235233 Minor conveyor draw optimization 2026-06-24 13:02:38 -04:00
Anuken 60b4e9a0d7 Fixed duct updates/interpolation 2026-06-24 12:50:56 -04:00
Anuken 0e5d6d1252 Reverted buggy conveyor interpolation 2026-06-24 12:30:38 -04:00
Anuken 4da35f91d9 Moved ambient audio to new thread 2026-06-24 12:20:23 -04:00
Anuken e6b17adf3a wip 2026-06-24 11:01:29 -04:00
Anuken d22a2995a3 Merge remote-tracking branch 'origin/master' 2026-06-23 13:19:42 -04:00
Anuken 32dd187421 Fixed timestep interpolation for some blocks 2026-06-23 13:19:36 -04:00
Github Actions 2bdedfed25 Automatic bundle update 2026-06-22 21:57:37 +00:00
Anuken 9d967277cd Developer options + checkbox settings change + fixed building timestep option 2026-06-22 17:55:57 -04:00
Anuken d925a0a1b2 Moved entity updates into separate methods 2026-06-22 15:57:34 -04:00
Anuken b1135371ac arc 2026-06-22 12:26:29 -04:00
Anuken 40bf89df32 Merge remote-tracking branch 'origin/master' 2026-06-22 12:25:56 -04:00
Anuken 84d23af453 Fixed incorrect resource calculations 2026-06-22 12:25:49 -04:00
Cardillan 4e28dbbf09 Make read/write object fields wider (#12251) 2026-06-22 12:00:54 -04:00
Anuken 5ce1b5acb3 Fixed #12252 2026-06-22 11:52:19 -04:00
Anuken 0c31df6630 Fixed LOD for power nodes at max zoomout on mobile 2026-06-21 23:48:58 -04:00
Anuken f681ce9036 arc 2026-06-21 17:04:02 -04:00
Anuken 9147b69c3a Merge remote-tracking branch 'origin/master' 2026-06-21 13:02:27 -04:00
Anuken 2ecc7ff340 Raised minSdkVersion 14 -> 21 for Android due to NDK no longer supporting 14 2026-06-21 13:02:18 -04:00
Github Actions 991310be92 Automatic bundle update 2026-06-21 16:32:07 +00:00
Anuken 7359e05412 Misc bugfixes for data patches 2026-06-21 12:30:49 -04:00
Anuken f5133aa8e3 Support for autotiled destructible walls 2026-06-21 10:56:33 -04:00
Anuken 35306423b5 Fixed #12250 2026-06-21 10:07:52 -04:00
Anuken 69f95ee396 Stop trying to pack when env atlas is full 2026-06-21 09:52:10 -04:00
Anuken 559b64b3ac Fixed #12185 2026-06-20 21:53:38 -04:00
Anuken 4747ee35be Fixed #12209 2026-06-20 21:51:13 -04:00
Anuken ff84208703 Merge remote-tracking branch 'origin/master' 2026-06-20 21:43:56 -04:00
Anuken 1f1df02356 Fixed #12214 2026-06-20 21:43:51 -04:00
wan 143585bd39 Update bundle_ja.properties (#12246) 2026-06-20 21:29:50 -04:00
Anuken 59347a3de1 Fixed #12167 2026-06-20 21:29:10 -04:00
Anuken ac25174a95 Fixed #12198 2026-06-20 21:27:16 -04:00
Anuken b6b42bad9d Fixed #12148 2026-06-20 21:20:12 -04:00
Anuken ffffd5751d Fixed #12188 2026-06-20 21:10:37 -04:00
Anuken fc867d38e6 Fixed #12190 2026-06-20 21:05:04 -04:00
Anuken 9c98602f9a Fixed #12208 2026-06-20 21:00:46 -04:00
Anuken cc278a3a6e Fixed #12223 2026-06-20 20:53:41 -04:00
Anuken 2dd86456cf Fixed #12240 2026-06-20 20:48:09 -04:00
Anuken e43d2db0d6 Merge remote-tracking branch 'origin/master' 2026-06-20 20:29:29 -04:00
Anuken 33a8406bd3 Reverted #12243 2026-06-20 20:29:24 -04:00
EggleEgg 66be97ee47 Erekir nano-rebalance: small heat redirector buff (#12137)
* Erekir nano-rebalance: small heat redirector buff

* redirector original cost + 6 tung but acts like a node

* Just go for the easy option for now. 3 surge
2026-06-20 20:19:46 -04:00
buthed010203 45e44fd8bc Add dedicated steam server support (#12166)
* Add dedicated steam server support.

* Fixup

* Add cancel button
2026-06-20 20:18:27 -04:00
buthed010203 479b3854ba Refactor Call.label to use WorldLabel (#12164)
* Refactor Call.label to use WorldLabel

* Don't serialize duration
2026-06-20 20:17:28 -04:00
BalaM314 0293c2a3a8 Re-order tech tree to remove unnecessary prerequisites (#12179)
* Mass driver gated behind Tar Fields as intended, instead of Impact 0078
* Plastanium conveyor can be researched without thorium
2026-06-20 20:15:40 -04:00
Valera a10f4455f7 Made plans' animation framerate-independent (#12187)
A minor fix of InputHandler#drawOtherBuildPlans
2026-06-20 20:14:00 -04:00
Anuken a586a34f36 Merge remote-tracking branch 'origin/master' 2026-06-20 20:12:52 -04:00
Anuken fcf3f83737 Fixed unit assembler afterPatch 2026-06-20 20:12:46 -04:00
BalaM314 24adf22c53 Fix wiki builds failing (#12205) 2026-06-20 20:09:58 -04:00
StesNiash 0e4d0f6216 Update UnitAssembler.java (#12227)
Now units can payenter in assemblers.
2026-06-20 20:08:50 -04:00
Adham Hakki 3e4de7df52 Add mindustry:// URL scheme intent filter for Android (#12238) 2026-06-20 20:04:52 -04:00
NeilGreenFly ed130b1bac Let the logic display enable allowRectanglePlacement. (#12247) 2026-06-20 20:04:05 -04:00
Anuken 96e73c89d8 Merge branch 'master' of https://github.com/Anuken/Mindustry 2026-06-20 19:34:46 -04:00
Anuken b8fc1a70ed Reset public game visibility value to false because people keep making it public by accident 2026-06-20 19:34:44 -04:00
Github Actions 6175104b0e Automatic bundle update 2026-06-20 23:29:32 +00:00
Anuken d6400c573a Moved Steam hosting public checkbox to paused dialog + disabled global ban list in private lobbies 2026-06-20 19:28:09 -04:00
Anuken a96611a68c Merge remote-tracking branch 'origin/master' 2026-06-20 17:33:36 -04:00
Anuken aa82a26e1d Crash fix 2026-06-20 17:33:27 -04:00
Anuken dfcfabec66 Crash fix 2026-06-20 17:33:24 -04:00
ZenthXSinand488254306 04e74cba01 Fix NullPointerException in LogicBlock.updateLinks() when linksVar is null (#12241)
Co-authored-by: 488254306 <488254306@qq.com>
2026-06-20 16:35:56 -04:00
Wu Shuwen 7542587558 fix: skip unrecognized block IDs in client plan deserialization (#12244)
Prevent NullPointerException when a client sends a plan with a
block ID the server doesn't recognize (e.g. from a modded client).
Skip the plan entry instead of crashing.

Fixes #12243
2026-06-20 16:34:21 -04:00
Anuken 5a83175d96 Fixed NaN black screen after editor 2026-06-20 16:21:25 -04:00
Anuken 4f43020509 Removed accidental debug 2026-06-20 16:04:52 -04:00
Anuken 81841ad35a Merge remote-tracking branch 'origin/master' 2026-06-20 10:39:38 -04:00
Anuken 82d1df7445 Fixed quitting editor not resetting data patches 2026-06-20 10:39:32 -04:00
Github Actions b7b8c61d47 Automatic class mapping update 2026-06-19 01:21:56 +00:00
Anuken 0672e7f37e Removed unused/broken block classes 2026-06-18 21:19:40 -04:00
Anuken 7f67b1dbce Misc minor fixes 2026-06-18 21:16:32 -04:00
Anuken 368e787f89 Hide editor when joining a game 2026-06-18 09:59:50 -04:00
Anuken de2cba940d Fixed node unlink not updating power graph 2026-06-18 09:50:47 -04:00
Anuken 54e2c15ae4 Reverted building sleep changes 2026-06-17 11:46:48 -04:00
Anuken fad7afb97e Minor block optimizations 2026-06-16 17:13:17 -04:00
Anuken d5c78639f3 Minor turret optimization 2026-06-16 16:00:11 -04:00
Anuken b91d26c509 Better PerfCounter average display 2026-06-16 10:54:49 -04:00
120 changed files with 1220 additions and 877 deletions
+7
View File
@@ -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>
+1 -1
View File
@@ -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

+8 -3
View File
@@ -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[].
+6 -1
View File
@@ -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 = Мін. дыстанцыя камеры
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+67 -62
View File
@@ -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 = 表示ブロックの幅(ピクセル単位)
+6 -1
View File
@@ -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 = 최소 카메라 거리
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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 = Минимальная дистанция камеры
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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 = ระยะห่างกล้องต่ำสุด
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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 = Мінімальна відстань камери
+6 -1
View File
@@ -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
+6 -1
View File
@@ -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 = 最小视距
+6 -1
View File
@@ -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.
+5 -7
View File
@@ -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. */
+3 -2
View File
@@ -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();
}
+242 -76
View File
@@ -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
}
}
}
}
+3 -16
View File
@@ -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;
}};
+1
View File
@@ -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, () -> {
});
});
+29 -3
View File
@@ -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);
}
+1 -1
View File
@@ -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();
+4 -2
View File
@@ -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;
+8 -2
View File
@@ -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();
}
+11 -25
View File
@@ -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){
+3 -3
View File
@@ -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){
+3 -6
View File
@@ -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);
}
}
+3
View File
@@ -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;
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)){
+1 -1
View File
@@ -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);
});
});
+6 -1
View File
@@ -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);
+1
View File
@@ -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);
+1 -1
View File
@@ -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 -> {
+3 -3
View File
@@ -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 -> {
+6 -2
View File
@@ -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
-5
View File
@@ -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);
+11 -5
View File
@@ -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());
+7 -7
View File
@@ -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();
+2 -1
View File
@@ -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()));
}
+11 -1
View File
@@ -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();
}
+4
View File
@@ -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