Merge branch 'master' of https://github.com/Anuken/Mindustry into crux-floor

# Conflicts:
#	gradle.properties
This commit is contained in:
Anuken
2025-07-10 13:52:31 -04:00
96 changed files with 1256 additions and 501 deletions
+7 -3
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Show FPS & Ping setting.fps.name = Show FPS & Ping
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelate setting.pixelate.name = Pixelate
setting.minimap.name = Show Minimap setting.minimap.name = Show Minimap
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat Scroll
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Drop Unit keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom Minimap keybind.zoom_minimap.name = Zoom Minimap
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Description of modes mode.help.title = Description of modes
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play.
@@ -2455,8 +2459,8 @@ unit.evoke.description = Builds structures to defend the Bastion core. Repairs s
unit.incite.description = Builds structures to defend the Citadel core. Repairs structures with a beam. Capable of carrying 2x2 structures. unit.incite.description = Builds structures to defend the Citadel core. Repairs structures with a beam. Capable of carrying 2x2 structures.
unit.emanate.description = Builds structures to defend the Acropolis core. Repairs structures with beams. Capable of carrying 2x2 structures. unit.emanate.description = Builds structures to defend the Acropolis core. Repairs structures with beams. Capable of carrying 2x2 structures.
lst.read = Read a number from a linked memory cell. lst.read = Read a number from a linked memory cell.\nCan also read from variables in other processors.
lst.write = Write a number to a linked memory cell. lst.write = Write a number to a linked memory cell.\nCan also write to variables in other processors.
lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.print = Add text to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used.
lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used. lst.printchar = Add a UTF-16 character or content icon to the print buffer.\nDoes not display anything until [accent]Print Flush[] is used.
lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example" lst.format = Replace next placeholder in text buffer with a value.\nDoes not do anything if placeholder pattern is invalid.\nPlaceholder pattern: "{[accent]number 0-9[]}"\nExample:\n[accent]print "test {0}"\nformat "example"
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = For messages: Length of the contents.\nFor displays: Number of unprocessed graphics commands.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Каб ужыць змены можа п
setting.fps.name = Паказваць FPS і пінг setting.fps.name = Паказваць FPS і пінг
setting.console.name = Уключыць Тэрмінал setting.console.name = Уключыць Тэрмінал
setting.smoothcamera.name = Павольная Камера 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.
setting.vsync.name = Вертыкальная сінхранізацыя setting.vsync.name = Вертыкальная сінхранізацыя
setting.pixelate.name = Пікселізацыя setting.pixelate.name = Пікселізацыя
setting.minimap.name = Адлюстроўваць міні-карту setting.minimap.name = Адлюстроўваць міні-карту
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Прагортка чата
keybind.chat_mode.name = Змяніць Рэжым Чату keybind.chat_mode.name = Змяніць Рэжым Чату
keybind.drop_unit.name = Скінуць баёў. адз. keybind.drop_unit.name = Скінуць баёў. адз.
keybind.zoom_minimap.name = Маштабаваць міні-карту keybind.zoom_minimap.name = Маштабаваць міні-карту
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Апісанне рэжымаў mode.help.title = Апісанне рэжымаў
mode.survival.name = Выжыванне mode.survival.name = Выжыванне
mode.survival.description = Звычайны рэжым. Неабходна здабываць рэсурсы, а хвалі наступаюць аўтаматычна. \n[gray]Патрабуецца пункт з’яўлення ворагаў на карце для гульні. mode.survival.description = Звычайны рэжым. Неабходна здабываць рэсурсы, а хвалі наступаюць аўтаматычна. \n[gray]Патрабуецца пункт з’яўлення ворагаў на карце для гульні.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Може да е нужен рестар
setting.fps.name = Показвай FPS & пинг setting.fps.name = Показвай FPS & пинг
setting.console.name = Включване на конзолата setting.console.name = Включване на конзолата
setting.smoothcamera.name = Гладка камера 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.
setting.vsync.name = Вертикална синхронизация (VSync) setting.vsync.name = Вертикална синхронизация (VSync)
setting.pixelate.name = Пикселизация setting.pixelate.name = Пикселизация
setting.minimap.name = Показвай мини-карта setting.minimap.name = Показвай мини-карта
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Превъртане на чата
keybind.chat_mode.name = Смени режим на чат keybind.chat_mode.name = Смени режим на чат
keybind.drop_unit.name = Остави единица keybind.drop_unit.name = Остави единица
keybind.zoom_minimap.name = Увеличи мини-карта keybind.zoom_minimap.name = Увеличи мини-карта
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Описание на режими mode.help.title = Описание на режими
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = Нормалният режим на играта. Ограничени ресурси и автоматични вълни от нападатели.\n[gray]Картата трябва да съдържа начална точка за враговете. mode.survival.description = Нормалният режим на играта. Ограничени ресурси и автоматични вълни от нападатели.\n[gray]Картата трябва да съдържа начална точка за враговете.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID на единица/блок/предмет/течност.\nТази операция е обратната на търсенето. laccess.id = ID на единица/блок/предмет/течност.\nТази операция е обратната на търсенето.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Неизвестно lcategory.unknown = Неизвестно
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Potser caldrà reiniciar el joc per a apl
setting.fps.name = Mostra els FPS i el ping setting.fps.name = Mostra els FPS i el ping
setting.console.name = Activa la consola setting.console.name = Activa la consola
setting.smoothcamera.name = Moviment de càmera suau setting.smoothcamera.name = Moviment de càmera suau
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.
setting.vsync.name = Sincronització vertical (VSync) setting.vsync.name = Sincronització vertical (VSync)
setting.pixelate.name = Pixela setting.pixelate.name = Pixela
setting.minimap.name = Mostra el minimapa setting.minimap.name = Mostra el minimapa
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Historial del xat: Desplaça
keybind.chat_mode.name = Canvia el mode del xat keybind.chat_mode.name = Canvia el mode del xat
keybind.drop_unit.name = Deixa anar la unitat keybind.drop_unit.name = Deixa anar la unitat
keybind.zoom_minimap.name = Apropa/Allunya la vista del minimapa keybind.zoom_minimap.name = Apropa/Allunya la vista del minimapa
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Descripció dels modes mode.help.title = Descripció dels modes
mode.survival.name = Supervivència mode.survival.name = Supervivència
mode.survival.description = El mode normal. Hi ha recursos limitats i les onades són automàtiques.\n[gray]Cal que al mapa hi hagin llocs daparició denemics. mode.survival.description = El mode normal. Hi ha recursos limitats i les onades són automàtiques.\n[gray]Cal que al mapa hi hagin llocs daparició denemics.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = Identificador dunitat/bloc/element/líquid.\nÉs linvers de loperació lookup. laccess.id = Identificador dunitat/bloc/element/líquid.\nÉs linvers de loperació lookup.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Desconegut lcategory.unknown = Desconegut
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Pro aplikování změn, je potřeba resta
setting.fps.name = Ukázat FPS a ping setting.fps.name = Ukázat FPS a ping
setting.console.name = Povolit Konzoli setting.console.name = Povolit Konzoli
setting.smoothcamera.name = Plynulá kamera setting.smoothcamera.name = Plynulá 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.
setting.vsync.name = Vertikální synchronizace setting.vsync.name = Vertikální synchronizace
setting.pixelate.name = Rozpixlovat setting.pixelate.name = Rozpixlovat
setting.minimap.name = Ukázat Mini mapu setting.minimap.name = Ukázat Mini mapu
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Rolování kanálu zpráv
keybind.chat_mode.name = Změnit Chat režim keybind.chat_mode.name = Změnit Chat režim
keybind.drop_unit.name = Zahodit jednotku keybind.drop_unit.name = Zahodit jednotku
keybind.zoom_minimap.name = Přiblížit mapu keybind.zoom_minimap.name = Přiblížit mapu
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Popis režimů mode.help.title = Popis režimů
mode.survival.name = Hra o přežití mode.survival.name = Hra o přežití
mode.survival.description = Klasický režim. Zdroje jsou limitované a vlny nepřátel přicházejí automaticky.\n[gray]Vyžaduje, aby v mapě bylo místo pro líhnutí nepřátel.[] mode.survival.description = Klasický režim. Zdroje jsou limitované a vlny nepřátel přicházejí automaticky.\n[gray]Vyžaduje, aby v mapě bylo místo pro líhnutí nepřátel.[]
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Šířka displeje v pixelech. laccess.displaywidth = Šířka displeje v pixelech.
laccess.displayheight = Výška displeje v pixelech. laccess.displayheight = Výška displeje v pixelech.
laccess.bufferusage = Počet nezpracovaných příkazů ve vyrovnávací paměti displeje. laccess.buffersize = Počet nezpracovaných příkazů ve vyrovnávací paměti displeje.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Neznámé lcategory.unknown = Neznámé
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Vis FPS & Ping setting.fps.name = Vis FPS & Ping
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Blødt kamera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixeler setting.pixelate.name = Pixeler
setting.minimap.name = Vis minikort setting.minimap.name = Vis minikort
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat-scroll
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Smid enhed keybind.drop_unit.name = Smid enhed
keybind.zoom_minimap.name = Zoom Minikort keybind.zoom_minimap.name = Zoom Minikort
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Beskrivelse af tilstande mode.help.title = Beskrivelse af tilstande
mode.survival.name = Overlevelse mode.survival.name = Overlevelse
mode.survival.description = Den normale tilstand. Begrænsede resurser og automatisk igangsættelse af bølger.\n[gray]Kræver fjendtlig base for at spille. mode.survival.description = Den normale tilstand. Begrænsede resurser og automatisk igangsættelse af bølger.\n[gray]Kræver fjendtlig base for at spille.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Neustart vielleicht erforderlich.
setting.fps.name = FPS anzeigen setting.fps.name = FPS anzeigen
setting.console.name = Konsole freigeben setting.console.name = Konsole freigeben
setting.smoothcamera.name = Sanfte Kamerabewegungen 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Verpixeln [lightgray](Könnte die Leistung beeinträchtigen) setting.pixelate.name = Verpixeln [lightgray](Könnte die Leistung beeinträchtigen)
setting.minimap.name = Zeige die Minimap setting.minimap.name = Zeige die Minimap
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat scrollen
keybind.chat_mode.name = Chatmodus ändern keybind.chat_mode.name = Chatmodus ändern
keybind.drop_unit.name = Einheit absetzen keybind.drop_unit.name = Einheit absetzen
keybind.zoom_minimap.name = Minimap-Zoom keybind.zoom_minimap.name = Minimap-Zoom
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Beschreibung der Modi mode.help.title = Beschreibung der Modi
mode.survival.name = Überleben mode.survival.name = Überleben
mode.survival.description = Der normale Modus. Ressourcen sind limitiert und Wellen kommen automatisch.\n[gray]Gegnerische Spawns auf der Karte sind erforderlich. mode.survival.description = Der normale Modus. Ressourcen sind limitiert und Wellen kommen automatisch.\n[gray]Gegnerische Spawns auf der Karte sind erforderlich.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID einer Einheit/eines Blocks/eines Materials/einer Flüssigkeit\nThis is the inverse of the lookup operation. laccess.id = ID einer Einheit/eines Blocks/eines Materials/einer Flüssigkeit\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unbekannt lcategory.unknown = Unbekannt
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Aplicar los cambios podría requerir un r
setting.fps.name = Mostrar FPS y ping setting.fps.name = Mostrar FPS y ping
setting.console.name = Activar consola setting.console.name = Activar consola
setting.smoothcamera.name = Movimiento de cámara suave setting.smoothcamera.name = Movimiento de 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.
setting.vsync.name = Sincronización vertical setting.vsync.name = Sincronización vertical
setting.pixelate.name = Pixelar setting.pixelate.name = Pixelar
setting.minimap.name = Mostrar minimapa setting.minimap.name = Mostrar minimapa
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Historial de chat - Desplazar
keybind.chat_mode.name = Cambiar modo de chat keybind.chat_mode.name = Cambiar modo de chat
keybind.drop_unit.name = Soltar unidad keybind.drop_unit.name = Soltar unidad
keybind.zoom_minimap.name = Zoom del minimapa keybind.zoom_minimap.name = Zoom del minimapa
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Descripción mode.help.title = Descripción
mode.survival.name = Supervivencia mode.survival.name = Supervivencia
mode.survival.description = El modo normal. Recursos limitados y oleadas automáticas.\n[gray]Requiere puntos de aterrizaje enemigos en el mapa. mode.survival.description = El modo normal. Recursos limitados y oleadas automáticas.\n[gray]Requiere puntos de aterrizaje enemigos en el mapa.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Desconocido lcategory.unknown = Desconocido
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Näita kaadrite arvu sekundis setting.fps.name = Näita kaadrite arvu sekundis
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = Vertikaalne sünkroonimine setting.vsync.name = Vertikaalne sünkroonimine
setting.pixelate.name = Piksel-efekt[lightgray] (lülitab animatsioonid välja) setting.pixelate.name = Piksel-efekt[lightgray] (lülitab animatsioonid välja)
setting.minimap.name = Näita kaarti setting.minimap.name = Näita kaarti
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Vestlusaken: kerimine
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Heida väeüksus keybind.drop_unit.name = Heida väeüksus
keybind.zoom_minimap.name = Suumi kaarti keybind.zoom_minimap.name = Suumi kaarti
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Mänguviiside kirjeldused mode.help.title = Mänguviiside kirjeldused
mode.survival.name = Ellujäämine mode.survival.name = Ellujäämine
mode.survival.description = Tavaline mänguviis. Piiratud ressursid. Lahingulainetena lähenevad vaenlased. mode.survival.description = Tavaline mänguviis. Piiratud ressursid. Lahingulainetena lähenevad vaenlased.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Erakutsi FPS setting.fps.name = Erakutsi FPS
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu) setting.pixelate.name = Pixelatu[lightgray] (animazioak desgaitzen ditu)
setting.minimap.name = Erakutsi mapatxoa setting.minimap.name = Erakutsi mapatxoa
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Korritu txata
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Lurreratu unitatea keybind.drop_unit.name = Lurreratu unitatea
keybind.zoom_minimap.name = Mapatxoaren zooma keybind.zoom_minimap.name = Mapatxoaren zooma
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Moduen deskripzioa mode.help.title = Moduen deskripzioa
mode.survival.name = Biziraupena mode.survival.name = Biziraupena
mode.survival.description = Modu arrunta. Baliabide mugatuak eta bolada automatikoak.\n[gray]Jolasteko etsaien sortze puntuak behar dira mapan. mode.survival.description = Modu arrunta. Baliabide mugatuak eta bolada automatikoak.\n[gray]Jolasteko etsaien sortze puntuak behar dira mapan.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Uudelleenkäynnistys saatetaan vaatia muu
setting.fps.name = Näytä FPS setting.fps.name = Näytä FPS
setting.console.name = Salli konsoli setting.console.name = Salli konsoli
setting.smoothcamera.name = Pehmeä kamera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixeloi[lightgray] (poistaa animaation käytöstä) setting.pixelate.name = Pixeloi[lightgray] (poistaa animaation käytöstä)
setting.minimap.name = Näytä pienoiskartta setting.minimap.name = Näytä pienoiskartta
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Kelaa keskustelua
keybind.chat_mode.name = Vaihda keskustelutilaa keybind.chat_mode.name = Vaihda keskustelutilaa
keybind.drop_unit.name = Pudota yksikkö keybind.drop_unit.name = Pudota yksikkö
keybind.zoom_minimap.name = Zoomaa pienoiskarttaa keybind.zoom_minimap.name = Zoomaa pienoiskarttaa
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Pelitilojen kuvaus mode.help.title = Pelitilojen kuvaus
mode.survival.name = Selviytyminen mode.survival.name = Selviytyminen
mode.survival.description = Normaali tila. Rajoitettu määrä resursseja ja tasoilla on aika.\n[gray]Vaatii vihollisten syntymispisteen kartassa. mode.survival.description = Normaali tila. Rajoitettu määrä resursseja ja tasoilla on aika.\n[gray]Vaatii vihollisten syntymispisteen kartassa.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Tuntematon lcategory.unknown = Tuntematon
+63 -59
View File
@@ -261,8 +261,8 @@ servers.local.steam = Buksan ang Mga Laro at Lokal na Server
servers.remote = Remote Servers servers.remote = Remote Servers
servers.global = Server ng Komunidad servers.global = Server ng Komunidad
servers.disclaimer = Ang mga server ng komunidad ay [accent]hindi pagmamay-ari o kinokontrol[] ng developer.\n\nServers may contain user-generated content that is not appropriate for all ages. servers.disclaimer = Ang mga server ng komunidad ay [accent]hindi pagmamay-ari o kinokontrol[] ng developer.\n\nAng mga Server ay may merong content na user-generated hindi bagay sa lahat ng taon.
servers.showhidden = Show Hidden Servers servers.showhidden = Ipakita ang mga tinagong server
server.shown = Ipinapakita server.shown = Ipinapakita
server.hidden = Tinatago server.hidden = Tinatago
@@ -452,7 +452,7 @@ editor.brush = Brush
editor.openin = I-Open sa Editor editor.openin = I-Open sa Editor
editor.oregen = Ore Generation editor.oregen = Ore Generation
editor.oregen.info = Ore Generation: editor.oregen.info = Ore Generation:
editor.mapinfo = Map Info editor.mapinfo = Inpormasyon ng Mapa
editor.author = Author: editor.author = Author:
editor.description = Description: editor.description = Description:
editor.nodescription = Dapat meron paglalarawan ng hindi bababa sa 4 na character bago i-publish. editor.nodescription = Dapat meron paglalarawan ng hindi bababa sa 4 na character bago i-publish.
@@ -462,14 +462,14 @@ editor.generation = Pagbuo:
editor.objectives = Mga Gawain editor.objectives = Mga Gawain
editor.locales = Locale Bundles editor.locales = Locale Bundles
editor.worldprocessors = Proseso ng Map editor.worldprocessors = Proseso ng Map
editor.worldprocessors.editname = Edit Name editor.worldprocessors.editname = Iedit ang pangalan
editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below.
editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this?
editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. editor.worldprocessors.delete.confirm = Sigurado ka ba na gusto ng itanggalin ang itong world processor?\n\nPag ito ay na-surround ng mga wall, ito ay papalitan ng.
editor.ingame = Edit In-Game editor.ingame = Edit In-Game
editor.playtest = Playtest editor.playtest = Playtest
editor.publish.workshop = I-Publish Sa Workshop editor.publish.workshop = I-Publish Sa Workshop
editor.newmap = New Map editor.newmap = Bagong Mapa
editor.center = Center editor.center = Center
editor.search = Search maps... editor.search = Search maps...
editor.filters = I-filter ang Maps editor.filters = I-filter ang Maps
@@ -504,7 +504,7 @@ waves.load = I-Load mula sa Clipboard
waves.invalid = Invalid waves in clipboard. waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied. waves.copied = Waves copied.
waves.none = Walang tinukoy na mga kaaway.\nTandaan na ang mga walang laman na wave layout ay awtomatikong papalitan ng default na layout. waves.none = Walang tinukoy na mga kaaway.\nTandaan na ang mga walang laman na wave layout ay awtomatikong papalitan ng default na layout.
waves.sort = Sort By waves.sort = Iayusin sa
waves.sort.reverse = Pabaliktad na Sort waves.sort.reverse = Pabaliktad na Sort
waves.sort.begin = Simula waves.sort.begin = Simula
waves.sort.health = Health waves.sort.health = Health
@@ -521,14 +521,14 @@ wavemode.health = health
all = Lahat all = Lahat
editor.default = [lightgray]<Default> editor.default = [lightgray]<Default>
details = Details... details = Mga Detalya...
edit = Edit... edit = Edit...
variables = Vars variables = Vars
logic.clear.confirm = Are you sure you want to clear all code from this processor? logic.clear.confirm = Sigurado ka bang na gusto mo itangal ang lahat na code sa itong processor?
logic.restart = Restart logic.restart = Iulitin
logic.globals = Built-in Variables logic.globals = Built-in Variables
editor.name = Name: editor.name = Pangalan:
editor.spawn = Spawn Unit editor.spawn = Spawn Unit
editor.removeunit = Remove Unit editor.removeunit = Remove Unit
editor.teams = Teams editor.teams = Teams
@@ -613,7 +613,7 @@ filter.ore = Ore
filter.rivernoise = River Noise filter.rivernoise = River Noise
filter.mirror = Mirror filter.mirror = Mirror
filter.clear = Clear filter.clear = Clear
filter.option.ignore = Ignore filter.option.ignore = Ihayain
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.logic = Logic filter.logic = Logic
@@ -643,8 +643,8 @@ filter.option.percentile = Percentile
filter.option.code = Code filter.option.code = Code
filter.option.loop = Loop filter.option.loop = Loop
locales.info = Here, you can add locale bundles for specific languages to your map. In locale bundles, each property has a name and a value. These properties can be used by world processors and objectives using their names. They support text formatting (replacing placeholders with actual values).\n\n[cyan]Example property:\n[]name: [accent]timer[]\nvalue: [accent]Example timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable) locales.info = Dito, pwede ka maglagay ng locale bundles para sa specifikong wika sa inyong mapa. Sa locale bundles, lahat na property ay may pangalan at value. Itong properties ay pwede igamit ng mga world processor at objective sa gamit ng kanilang pangalan. Sila ay sinusuportahan ang text formatting (pinapalitan ng placeholders sa totoong alues).\n\n[cyan]Halimbawang property:\n[]name: [accent]timer[]\nvalue: [accent]Halimbawang timer, time left: {0}[]\n\n[cyan]Usage:\n[]Set it as objective's text: [accent]@timer\n\n[]Print it in a world processor:\n[accent]localeprint "timer"\nformat time\n[gray](where time is a separately calculated variable)
locales.deletelocale = Are you sure you want to delete this locale bundle? locales.deletelocale = Sigurado ka ba gusto mo tanggaling ang itong locale bundle?
locales.applytoall = Apply Changes To All Locales locales.applytoall = Apply Changes To All Locales
locales.addtoother = Add To Other Locales locales.addtoother = Add To Other Locales
locales.rollback = Rollback to last applied locales.rollback = Rollback to last applied
@@ -654,7 +654,7 @@ locales.searchvalue = Search value...
locales.searchlocale = Search locale... locales.searchlocale = Search locale...
locales.byname = By name locales.byname = By name
locales.byvalue = By value locales.byvalue = By value
locales.showcorrect = Show properties that are present in all locales and have unique values everywhere locales.showcorrect = Ipakitang mga property na kita sa lahat na locales at may merong unique na values kung saan
locales.showmissing = Show properties that are missing in some locales locales.showmissing = Show properties that are missing in some locales
locales.showsame = Show properties that have same values in different locales locales.showsame = Show properties that have same values in different locales
locales.viewproperty = View in all locales locales.viewproperty = View in all locales
@@ -675,7 +675,7 @@ memory = Mem: {0}mb
memory2 = Mem:\n {0}mb +\n {1}mb memory2 = Mem:\n {0}mb +\n {1}mb
language.restart = Mangyaring i-restart ang iyong laro para magkabisa ang mga setting ng wika. language.restart = Mangyaring i-restart ang iyong laro para magkabisa ang mga setting ng wika.
settings = Settings settings = Settings
tutorial = Tutorial tutorial = Tutoryal
tutorial.retake = Muling Kumuha ng Tutorial tutorial.retake = Muling Kumuha ng Tutorial
editor = Editor editor = Editor
mapeditor = Map Editor mapeditor = Map Editor
@@ -701,7 +701,7 @@ objective.produce.name = Obtain
objective.item.name = Obtain Item objective.item.name = Obtain Item
objective.coreitem.name = Core Item objective.coreitem.name = Core Item
objective.buildcount.name = Build Count objective.buildcount.name = Build Count
objective.unitcount.name = Unit Count objective.unitcount.name = Bilang ng Unit
objective.destroyunits.name = Destroy Units objective.destroyunits.name = Destroy Units
objective.timer.name = Timer objective.timer.name = Timer
objective.destroyblock.name = Destroy Block objective.destroyblock.name = Destroy Block
@@ -711,12 +711,12 @@ objective.commandmode.name = Command Mode
objective.flag.name = Flag objective.flag.name = Flag
marker.shapetext.name = Shape Text marker.shapetext.name = Shape Text
marker.point.name = Point marker.point.name = Tuldok
marker.shape.name = Shape marker.shape.name = Hugis
marker.text.name = Text marker.text.name = Teksto
marker.line.name = Line marker.line.name = Linya
marker.quad.name = Quad marker.quad.name = Quad
marker.texture.name = Texture marker.texture.name = Textura
marker.background = Background marker.background = Background
marker.outline = Outline marker.outline = Outline
@@ -749,7 +749,7 @@ bannedunits = Mga Pinagbabawalan na Units
unbannedunits = Unbanned Units unbannedunits = Unbanned Units
bannedunits.whitelist = Banned Units As Whitelist bannedunits.whitelist = Banned Units As Whitelist
bannedblocks.whitelist = Banned Blocks As Whitelist bannedblocks.whitelist = Banned Blocks As Whitelist
addall = Add All addall = Ilagay Lahat
launch.from = Launching From: [accent]{0} launch.from = Launching From: [accent]{0}
launch.capacity = Launching Item Capacity: [accent]{0} launch.capacity = Launching Item Capacity: [accent]{0}
launch.destination = Destination: {0} launch.destination = Destination: {0}
@@ -780,7 +780,7 @@ weather.fog.name = Fog
campaign.playtime = \uf129 [lightgray]Sector Playtime: {0} campaign.playtime = \uf129 [lightgray]Sector Playtime: {0}
campaign.complete = [accent]Congratulations.\n\nThe enemy on {0} has been defeated.\n[lightgray]The final sector has been conquered. campaign.complete = [accent]Congratulations.\n\nThe enemy on {0} has been defeated.\n[lightgray]The final sector has been conquered.
sectorlist = Mga Sector sectorlist = Mga Sektor
sectorlist.attacked = {0} ay inaatake sectorlist.attacked = {0} ay inaatake
sectors.unexplored = [lightgray]Unexplored sectors.unexplored = [lightgray]Unexplored
sectors.resources = Resources: sectors.resources = Resources:
@@ -824,12 +824,12 @@ threat.low = Mababa
threat.medium = Medium threat.medium = Medium
threat.high = Mataas threat.high = Mataas
threat.extreme = Sobra-sobra threat.extreme = Sobra-sobra
threat.eradication = Tiyak na talo sa hind handa threat.eradication = Tiyak na talo sa hindi handa
difficulty.casual = Casual difficulty.casual = Casual
difficulty.easy = Easy difficulty.easy = Madali
difficulty.normal = Normal difficulty.normal = Normal
difficulty.hard = Hard difficulty.hard = Mahirap
difficulty.eradication = Eradication difficulty.eradication = Eradication
difficulty.enemyHealthMultiplier = Enemy Health: {0} difficulty.enemyHealthMultiplier = Enemy Health: {0}
@@ -926,19 +926,19 @@ sector.karst.name = Karst
sector.origin.name = Pinaggalingan sector.origin.name = Pinaggalingan
sector.onset.description = Ang tutorial sector. Ang objective ay hindi pa nagawa. Maghintay para sa kinabukasang impormasyon. sector.onset.description = Ang tutorial sector. Ang objective ay hindi pa nagawa. Maghintay para sa kinabukasang impormasyon.
sector.aegis.description = This sector contains deposits of tungsten.\nResearch the [accent]Impact Drill[] to mine this resource, and destroy the enemy base in the area. sector.aegis.description = Itong sector ay may merong deposit ng mga tungsten.\nIresearch ang [accent]Impact Drill[] para makuha ang resource, at tanggalin ang enemy base sa lugar dito
sector.lake.description = This sector's slag lake greatly limits viable units. A hover unit is the only option.\nResearch the [accent]ship fabricator[] and produce an [accent]elude[] unit as soon as possible. sector.lake.description = Itong sektor na lawa na slag greatly limits viable na unit. Ang hover unit ay ang huling paraan.\nIresearch ang[accent]ship fabricator[] at gumawa ng mga [accent]elude[] unit as soon as possible.
sector.intersect.description = Scans suggest that this sector will be attacked from multiple sides soon after landing.\nSet up defenses quickly and expand as soon as possible.\n[accent]Mech[] units will be required for the area's rough terrain. sector.intersect.description = Scans suggest that this sector will be attacked from multiple sides soon after landing.\nSet up defenses quickly and expand as soon as possible.\n[accent]Mech[] units will be required for the area's rough terrain.
sector.atlas.description = This sector contains varied terrain and will require a variety of units to attack effectively.\nUpgraded units may also be necessary to get past some of the tougher enemy bases detected here.\nResearch the [accent]Electrolyzer[] and the [accent]Tank Refabricator[]. sector.atlas.description = This sector contains varied terrain and will require a variety of units to attack effectively.\nUpgraded units may also be necessary to get past some of the tougher enemy bases detected here.\nResearch the [accent]Electrolyzer[] and the [accent]Tank Refabricator[].
sector.split.description = The minimal enemy presence in this sector makes it perfect for testing new transport tech. sector.split.description = Ang konting presence ng kalaban sa sector na ito ay ginagawang perfect sa paggamit ng bagong teknolohiyang pangtransportasyon.
sector.basin.description = Large enemy presence detected in this sector.\nBuild units quickly and capture enemy cores to gain a foothold. sector.basin.description = Malaking presence ng kalaban nadetektuhan sa itong sektor.\nGumawa ng units na mabilis at icapture enemy cores to gain a foothold.
sector.marsh.description = This sector has an abundance of arkycite, but has limited vents.\nBuild [accent]Chemical Combustion Chambers[] to generate power. sector.marsh.description = Itong sector ay ma karamihan ng arkycite, pero may has konting vents.\nGumawa ng[accent]Chemical Combustion Chambers[] para makagawa ng koryente.
sector.peaks.description = The mountainous terrain in this sector make most units useless. Flying units will be required.\nBe aware of enemy anti-air installations. It may be possible to disable some of these installations by targeting their supporting buildings. sector.peaks.description = Ang Kabundukang terrain sa sector na ito ay ginagawa ang maraming unit useless. Lumilipad na unit ay kailangan.\nBe aware of enemy anti-air installations. It may be possible to disable some of these installations by targeting their supporting buildings.
sector.ravine.description = No enemy cores detected in the sector, although it's an important transportation route for the enemy. Expect variety of enemy forces.\nProduce [accent]surge alloy[]. Construct [accent]Afflict[] turrets. sector.ravine.description = Walang mga enemy core nadetektuhan sa sektor na ito, kahit it ay isang importanteng transportasyang routa ng kalaban. Ekspetuhan na maraming enemy forces.\nGumawa ng [accent]surge alloy[]. Construct [accent]Afflict[] turrets.
sector.caldera-erekir.description = The resources detected in this sector are scattered across several islands.\nResearch and deploy drone-based transportation. sector.caldera-erekir.description = Ang mga resource sa itong sektor ay nai-scatter sa maraming isla.\nIresearch at i-deploy drone-based transportation.
sector.stronghold.description = The large enemy encampment in this sector guards significant deposits of [accent]thorium[].\nUse it to develop higher tier units and turrets. sector.stronghold.description = Ang malaking encampment ng kalaban sa sektor na ito ay binabantayan ng maraming deposit ng [accent]thorium[].\nGamitin ito para ma-idevelop mataas na tier unit at mga turret.
sector.crevice.description = The enemy will send fierce attack forces to take out your base in this sector.\nDeveloping [accent]carbide[] and the [accent]Pyrolysis Generator[] may be imperative for survival. sector.crevice.description = Ang kalaban ay magsend ng fierce attack forces para makuha ang inyong base sa itong sektor.\nDeveloping [accent]carbide[] at ang [accent]Pyrolysis Generator[] baka magiging imperative for survival.
sector.siege.description = This sector features two parallel canyons that will force a two-pronged attack.\nResearch [accent]cyanogen[] to gain the capability to create even stronger tank units.\nCaution: enemy long-range missiles have been detected. The missiles may be shot down before impact. sector.siege.description = Itong sektor ay may merong dalawang parallel na canyon na mag-force ng two-pronged attack.\nResearch [accent]cyanogen[] to gain the capability to create even stronger tank units.\nCaution: enemy long-range missiles have been detected. The missiles may be shot down before impact.
sector.crossroads.description = The enemy bases in this sector have been established in varying terrain. Research different units to adapt.\nAdditionally, some bases are protected by shields. Figure out how they are powered. sector.crossroads.description = The enemy bases in this sector have been established in varying terrain. Research different units to adapt.\nAdditionally, some bases are protected by shields. Figure out how they are powered.
sector.karst.description = This sector is rich in resources, but will be attacked by the enemy once a new core lands.\nTake advantage of the resources and research [accent]phase fabric[]. sector.karst.description = This sector is rich in resources, but will be attacked by the enemy once a new core lands.\nTake advantage of the resources and research [accent]phase fabric[].
sector.origin.description = The final sector with a significant enemy presence.\nNo probable research opportunities remain - focus solely on destroying all enemy cores. sector.origin.description = The final sector with a significant enemy presence.\nNo probable research opportunities remain - focus solely on destroying all enemy cores.
@@ -1130,7 +1130,7 @@ bar.drillspeed = Bilis ng Drill: {0}/s
bar.pumpspeed = Bilis ng Pump: {0}/s bar.pumpspeed = Bilis ng Pump: {0}/s
bar.efficiency = Kahusayan: {0}% bar.efficiency = Kahusayan: {0}%
bar.boost = Palakas: +{0}% bar.boost = Palakas: +{0}%
bar.powerbuffer = Batteries: {0}/{1} bar.powerbuffer = Battery: {0}/{1}
bar.powerbalance = Kuryente: {0}/s bar.powerbalance = Kuryente: {0}/s
bar.powerstored = Nakaimbak: {0}/{1} bar.powerstored = Nakaimbak: {0}/{1}
bar.poweramount = Kuryente: {0} bar.poweramount = Kuryente: {0}
@@ -1253,16 +1253,18 @@ setting.fullscreen.name = Fullscreen
setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required)
setting.borderlesswindow.name.windows = Borderless Fullscreen setting.borderlesswindow.name.windows = Borderless Fullscreen
setting.borderlesswindow.description = Maaaring kailanganin ang pag-restart upang mailapat ang mga pagbabago. setting.borderlesswindow.description = Maaaring kailanganin ang pag-restart upang mailapat ang mga pagbabago.
setting.fps.name = Show FPS & Ping setting.fps.name = Ipakita ang FPS & Ping
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelate setting.pixelate.name = Pixelate
setting.minimap.name = Show Minimap setting.minimap.name = Ipakita ang Minimap
setting.coreitems.name = Display Core Items setting.coreitems.name = Display Core Items
setting.position.name = Show Player Position setting.position.name = Ipakita ang posisyon ng Player
setting.mouseposition.name = Show Mouse Position setting.mouseposition.name = Ipakita ang Mouse Position
setting.musicvol.name = Music Volume setting.musicvol.name = Volume ng Music
setting.atmosphere.name = Ipakita Planet Atmosphere setting.atmosphere.name = Ipakita Planet Atmosphere
setting.drawlight.name = Draw Darkness/Lighting setting.drawlight.name = Draw Darkness/Lighting
setting.ambientvol.name = Ambient Volume setting.ambientvol.name = Ambient Volume
@@ -1283,7 +1285,7 @@ setting.showweather.name = Show Weather Graphics
setting.hidedisplays.name = Hide Logic Displays setting.hidedisplays.name = Hide Logic Displays
setting.macnotch.name = Iangkop ang interface upang ipakita ang bingaw setting.macnotch.name = Iangkop ang interface upang ipakita ang bingaw
setting.macnotch.description = Kinakailangan ang pag-restart upang mailapat ang mga pagbabago setting.macnotch.description = Kinakailangan ang pag-restart upang mailapat ang mga pagbabago
steam.friendsonly = Friends Only 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. 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.maxmagnificationmultiplierpercent.name = Min Camera Distance
setting.minmagnificationmultiplierpercent.name = Max Camera Distance setting.minmagnificationmultiplierpercent.name = Max Camera Distance
@@ -1304,7 +1306,7 @@ keybind.respawn.name = Respawn
keybind.control.name = Control Unit keybind.control.name = Control Unit
keybind.clear_building.name = Clear Building keybind.clear_building.name = Clear Building
keybind.press = Press a key... keybind.press = Press a key...
keybind.press.axis = Press an axis or key... keybind.press.axis = Magpindot ng axis o key...
keybind.screenshot.name = Map Screenshot keybind.screenshot.name = Map Screenshot
keybind.toggle_power_lines.name = Toggle Power Lasers keybind.toggle_power_lines.name = Toggle Power Lasers
keybind.toggle_block_status.name = Toggle Block Statuses keybind.toggle_block_status.name = Toggle Block Statuses
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat Scroll
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Drop Unit keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom Minimap keybind.zoom_minimap.name = Zoom Minimap
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Description of modes mode.help.title = Description of modes
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = Ang normal na mode. Mga limitadong mapagkukunan at awtomatikong papasok na alon.\n[gray]Nangangailangan ng mga spawn ng kaaway sa mapa para maglaro. mode.survival.description = Ang normal na mode. Mga limitadong mapagkukunan at awtomatikong papasok na alon.\n[gray]Nangangailangan ng mga spawn ng kaaway sa mapa para maglaro.
@@ -1404,7 +1408,7 @@ mode.attack.description = Wasakin ang base ng kalaban. \n[gray]Nangangailangan n
mode.custom = Custom Rules mode.custom = Custom Rules
rules.invaliddata = Invalid clipboard data. rules.invaliddata = Invalid clipboard data.
rules.hidebannedblocks = Hide Banned Blocks rules.hidebannedblocks = Itago ang ibinabawal na blocks
rules.infiniteresources = Infinite Resources rules.infiniteresources = Infinite Resources
rules.fillitems = Fill Core With Items rules.fillitems = Fill Core With Items
rules.onlydepositcore = Only Allow Core Depositing rules.onlydepositcore = Only Allow Core Depositing
@@ -1428,9 +1432,9 @@ rules.buildai = Base Builder AI
rules.buildaitier = Builder AI Tier rules.buildaitier = Builder AI Tier
rules.rtsai = RTS AI rules.rtsai = RTS AI
rules.rtsai.campaign = RTS Attack AI rules.rtsai.campaign = RTS Attack AI
rules.rtsai.campaign.info = In attack maps, makes units group up and attack player bases in a more intelligent manner. rules.rtsai.campaign.info = Sa mapang attake, ginagawa gina grupo ang mga unit at inaatake ang player bases sa mas-maraming matalinong na manner.
rules.rtsminsquadsize = Min Squad Size rules.rtsminsquadsize = Pinakamaliit Squad Size
rules.rtsmaxsquadsize = Max Squad Size rules.rtsmaxsquadsize = Pinakaraming Squad Size
rules.rtsminattackweight = Min Attack Weight rules.rtsminattackweight = Min Attack Weight
rules.cleanupdeadteams = Clean Up Defeated Team Buildings (PvP) rules.cleanupdeadteams = Clean Up Defeated Team Buildings (PvP)
rules.corecapture = Capture Core On Destruction rules.corecapture = Capture Core On Destruction
@@ -1489,8 +1493,8 @@ rules.weather.always = Always
rules.weather.duration = Duration: rules.weather.duration = Duration:
rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators. rules.randomwaveai.info = Makes units spawned in waves target random structures instead of directly attacking the core or power generators.
rules.placerangecheck.info = Prevents players from placing anything near enemy buildings. When trying to place a turret, the range is increased, so the turret will not be able to reach the enemy. rules.placerangecheck.info = Ipinagbawalan ang mga player sa paglagay ng kahit ano malapit sa mga enemy buildings. Pag naitry naglagay ng turret, ang range ay nataas, para ang turret hindi makaabot ang kalaban.
rules.onlydepositcore.info = Prevents units from depositing items into any buildings except cores. rules.onlydepositcore.info = Ipinagbawalan ang mga units sa paglagay ng items sa kahit anong buildings except cores.
content.item.name = Aytems content.item.name = Aytems
content.liquid.name = Likido content.liquid.name = Likido
@@ -2046,8 +2050,8 @@ hint.coreIncinerate = After the core is filled to capacity with an item, any ext
hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there. hint.factoryControl = To set a unit factory's [accent]output destination[], click a factory block while in command mode, then right-click a location.\nUnits produced by it will automatically move there.
hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there. hint.factoryControl.mobile = To set a unit factory's [accent]output destination[], tap a factory block while in command mode, then tap a location.\nUnits produced by it will automatically move there.
gz.mine = Move near the :ore-copper: [accent]copper ore[] on the ground and click to begin mining. gz.mine = Pumunta malapit sa :ore-copper: [accent]copper ore[] sa ground at i-click ito para magsimula magmina.
gz.mine.mobile = Move near the :ore-copper: [accent]copper ore[] on the ground and tap it to begin mining. gz.mine.mobile = Pumunta malapit sa :ore-copper: [accent]copper ore[] sa ground at pindutin ito para magsimula magmina.
gz.research = Open the :tree: tech tree.\nResearch the :mechanical-drill: [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it. gz.research = Open the :tree: tech tree.\nResearch the :mechanical-drill: [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nClick on a copper patch to place it.
gz.research.mobile = Open the :tree: tech tree.\nResearch the :mechanical-drill: [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm. gz.research.mobile = Open the :tree: tech tree.\nResearch the :mechanical-drill: [accent]Mechanical Drill[], then select it from the menu in the bottom right.\nTap on a copper patch to place it.\n\nPress the \ue800 [accent]checkmark[] at the bottom right to confirm.
gz.conveyors = Research and place :conveyor: [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate. gz.conveyors = Research and place :conveyor: [accent]conveyors[] to move the mined resources\nfrom drills to the core.\n\nClick and drag to place multiple conveyors.\n[accent]Scroll[] to rotate.
@@ -2183,10 +2187,10 @@ block.phase-wall.description = Isang pader na pinahiran ng espesyal na phase-bas
block.phase-wall-large.description = Isang pader na pinahiran ng espesyal na phase-based na reflective compound. Pinapalihis ang karamihan sa mga bala kapag natamaan.\nGumagamit ng maraming tile. block.phase-wall-large.description = Isang pader na pinahiran ng espesyal na phase-based na reflective compound. Pinapalihis ang karamihan sa mga bala kapag natamaan.\nGumagamit ng maraming tile.
block.surge-wall.description = Isang napakatibay na defensive block.\nNagpapalaki ng singil sa bullet contact, na ilalabas ito nang random. block.surge-wall.description = Isang napakatibay na defensive block.\nNagpapalaki ng singil sa bullet contact, na ilalabas ito nang random.
block.surge-wall-large.description = Isang napakatibay na defensive block.\nBumubuo ng singil sa bullet contact, ilalabas ito nang random.\nGumagamit ng maraming tile. block.surge-wall-large.description = Isang napakatibay na defensive block.\nBumubuo ng singil sa bullet contact, ilalabas ito nang random.\nGumagamit ng maraming tile.
block.scrap-wall.description = Protects structures from enemy projectiles. block.scrap-wall.description = Ipinaprotektahan ang structures sa projectiles ng kalaban.
block.scrap-wall-large.description = Protects structures from enemy projectiles. block.scrap-wall-large.description = Ipinaprotektahan ang structures sa projectiles ng kalaban.
block.scrap-wall-huge.description = Protects structures from enemy projectiles. block.scrap-wall-huge.description = Ipinaprotektahan ang structures sa projectiles ng kalaban.
block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.scrap-wall-gigantic.description = Ipinaprotektahan ang structures sa projectiles ng kalaban.
block.door.description = Isang maliit na pinto. Maaaring buksan o isara sa pamamagitan ng pag-tap. block.door.description = Isang maliit na pinto. Maaaring buksan o isara sa pamamagitan ng pag-tap.
block.door-large.description = Isang malaking pinto. Maaaring buksan at isara sa pamamagitan ng pag-tap.\nSpans maramihang mga tile. block.door-large.description = Isang malaking pinto. Maaaring buksan at isara sa pamamagitan ng pag-tap.\nSpans maramihang mga tile.
block.mender.description = Pana-panahong nag-aayos ng mga blocks sa paligid nito. Pinapanatiling maayos ang mga depensa sa pagitan ng mga alon.\nOpsyonal na gumagamit ng silicon upang palakasin ang saklaw at kahusayan. block.mender.description = Pana-panahong nag-aayos ng mga blocks sa paligid nito. Pinapanatiling maayos ang mga depensa sa pagitan ng mga alon.\nOpsyonal na gumagamit ng silicon upang palakasin ang saklaw at kahusayan.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+53 -49
View File
@@ -185,14 +185,14 @@ mod.folder.missing = Seuls les mods sous forme de dossiers peuvent être publié
mod.scripts.disable = Votre appareil ne prend pas en charge les mods avec des scripts. Vous devez désactiver ces mods pour pouvoir jouer. mod.scripts.disable = Votre appareil ne prend pas en charge les mods avec des scripts. Vous devez désactiver ces mods pour pouvoir jouer.
mod.dependencies.error = [scarlet]Mods are missing dependencies mod.dependencies.error = [scarlet]Mods are missing dependencies
mod.dependencies.soft = (optional) mod.dependencies.soft = (optionnel)
mod.dependencies.download = Import mod.dependencies.download = Import
mod.dependencies.downloadreq = Import Required mod.dependencies.downloadreq = Importer les requis
mod.dependencies.downloadall = Import All mod.dependencies.downloadall = Importer les tous
mod.dependencies.status = Import Results mod.dependencies.status = Résultat de l'import
mod.dependencies.success = Successfully downloaded: mod.dependencies.success = Téléchargement réussi:
mod.dependencies.failure = Failed to download: mod.dependencies.failure = Téléchargement en échec:
mod.dependencies.imported = This mod requires dependencies. Download? mod.dependencies.imported = Ce mod requiert des dépendances. Voulez-vous les télécharger?
about.button = À propos about.button = À propos
name = Nom : name = Nom :
@@ -208,7 +208,7 @@ campaign.select = Sélectionnez la Campagne de Départ
campaign.none = [lightgray]Sélectionnez votre planète de départ.\nCela peut être changé à tout moment. campaign.none = [lightgray]Sélectionnez votre planète de départ.\nCela peut être changé à tout moment.
campaign.erekir = Contenu récent et mieux travaillé. Une progression dans la campagne assez linéaire.\n\nPlus difficile. Des cartes et une expérience de qualité. campaign.erekir = Contenu récent et mieux travaillé. Une progression dans la campagne assez linéaire.\n\nPlus difficile. Des cartes et une expérience de qualité.
campaign.serpulo = Contenu ancien, l'expérience classique de Mindustry. Avec plus de contenu et de possibilités.\n\nCartes et mécaniques de campagnes possiblement moins équilibrées. Moins travaillé. campaign.serpulo = Contenu ancien, l'expérience classique de Mindustry. Avec plus de contenu et de possibilités.\n\nCartes et mécaniques de campagnes possiblement moins équilibrées. Moins travaillé.
campaign.difficulty = Difficulty campaign.difficulty = Difficulté
completed = [accent]Complété completed = [accent]Complété
techtree = Arbre technologique techtree = Arbre technologique
techtree.select = Sélection de l'Arbre technologique techtree.select = Sélection de l'Arbre technologique
@@ -271,7 +271,7 @@ trace = Suivre le joueur
trace.playername = Nom du joueur : [accent]{0} trace.playername = Nom du joueur : [accent]{0}
trace.ip = IP : [accent]{0} trace.ip = IP : [accent]{0}
trace.id = ID : [accent]{0} trace.id = ID : [accent]{0}
trace.language = Language: [accent]{0} trace.language = Langue: [accent]{0}
trace.mobile = Client Mobile : [accent]{0} trace.mobile = Client Mobile : [accent]{0}
trace.modclient = Client personnalisé : [accent]{0} trace.modclient = Client personnalisé : [accent]{0}
trace.times.joined = Nombre de connexions : [accent]{0} trace.times.joined = Nombre de connexions : [accent]{0}
@@ -318,7 +318,7 @@ reconnecting = [accent]Reconnexion...
connecting.data = [accent]Chargement des données du monde... connecting.data = [accent]Chargement des données du monde...
server.port = Port : server.port = Port :
server.invalidport = Numéro de port invalide ! server.invalidport = Numéro de port invalide !
server.error.addressinuse = [scarlet]Failed to open server on port 6567.[]\n\nMake sure no other Mindustry servers are running on your device or network! server.error.addressinuse = [scarlet]Echec d'ouverture du port 6567.[]\n\nVérifier qu'aucun autre logiciel ne fonctionne sur ce port!
server.error = [scarlet]Erreur lors de l'hébergement du serveur. server.error = [scarlet]Erreur lors de l'hébergement du serveur.
save.new = Nouvelle sauvegarde save.new = Nouvelle sauvegarde
save.overwrite = Êtes-vous sûr de vouloir\nécraser cette sauvegarde ? save.overwrite = Êtes-vous sûr de vouloir\nécraser cette sauvegarde ?
@@ -462,7 +462,7 @@ editor.generation = Génération
editor.objectives = Objectifs editor.objectives = Objectifs
editor.locales = Locale Bundles editor.locales = Locale Bundles
editor.worldprocessors = World Processors editor.worldprocessors = World Processors
editor.worldprocessors.editname = Edit Name editor.worldprocessors.editname = Editer le nom
editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below. editor.worldprocessors.none = [lightgray]No world processor blocks found!\nAdd one in the map editor, or use the \ue813 Add button below.
editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this? editor.worldprocessors.nospace = No free space to place a world processor!\nDid you fill the map with structures? Why would you do this?
editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall. editor.worldprocessors.delete.confirm = Are you sure you want to delete this world processor?\n\nIf it is surrounded by walls, it will be replaced by an environmental wall.
@@ -524,9 +524,9 @@ editor.default = [lightgray]<par défaut>
details = Détails... details = Détails...
edit = Modifier... edit = Modifier...
variables = Variables variables = Variables
logic.clear.confirm = Are you sure you want to clear all code from this processor? logic.clear.confirm = Êtes-vous sûr de vouloir supprimer tout le code de ce processeur?
logic.restart = Restart logic.restart = Restart
logic.globals = Built-in Variables logic.globals = Variables prédéfinies
editor.name = Nom : editor.name = Nom :
editor.spawn = Ajouter une unité editor.spawn = Ajouter une unité
@@ -551,7 +551,7 @@ editor.sectorgenerate = Générer un Secteur
editor.resize = Redimensionner editor.resize = Redimensionner
editor.loadmap = Charger la carte editor.loadmap = Charger la carte
editor.savemap = Sauvegarder la carte editor.savemap = Sauvegarder la carte
editor.savechanges = [scarlet]You have unsaved changes!\n\n[]Do you want to save them? editor.savechanges = [scarlet]Vous avez des changements non suvegardés!\n\n[]Voulez-vous les sauvegarder?
editor.saved = Sauvegardé ! editor.saved = Sauvegardé !
editor.save.noname = Votre carte n'a pas de nom !\nAjoutez un nom dans le menu 'Infos de la Carte'. editor.save.noname = Votre carte n'a pas de nom !\nAjoutez un nom dans le menu 'Infos de la Carte'.
editor.save.overwrite = Votre carte écrase une carte de base du jeu !\nChoisissez un nom différent dans le menu 'Infos de la Carte'. editor.save.overwrite = Votre carte écrase une carte de base du jeu !\nChoisissez un nom différent dans le menu 'Infos de la Carte'.
@@ -570,7 +570,7 @@ editor.exportimage = Exporter l'image du terrain
editor.exportimage.description = Exporter une image de la carte avec du terrain seulement editor.exportimage.description = Exporter une image de la carte avec du terrain seulement
editor.loadimage = Importer un terrain editor.loadimage = Importer un terrain
editor.saveimage = Exporter le terrain editor.saveimage = Exporter le terrain
editor.unsaved = [scarlet]Vous n'avez pas sauvegardé vos modifications![] Voulez-vous vraiment quitter ? editor.unsaved = [scarlet]Vous n'avez pas sauvegardé vos modifications![] Voulez-vous vraiment quitter?
editor.resizemap = Redimensionner\nla carte editor.resizemap = Redimensionner\nla carte
editor.mapname = Nom de la carte : editor.mapname = Nom de la carte :
editor.overwrite = [accent]Attention !\nCeci écrase une carte existante. editor.overwrite = [accent]Attention !\nCeci écrase une carte existante.
@@ -659,7 +659,7 @@ locales.showmissing = Show properties that are missing in some locales
locales.showsame = Show properties that have same values in different locales locales.showsame = Show properties that have same values in different locales
locales.viewproperty = View in all locales locales.viewproperty = View in all locales
locales.viewing = Viewing property "{0}" locales.viewing = Viewing property "{0}"
locales.addicon = Add Icon locales.addicon = Ajouter une icône
width = Largeur : width = Largeur :
height = Hauteur : height = Hauteur :
@@ -812,8 +812,8 @@ sector.curlost = Secteur perdu
sector.missingresources = [scarlet]Ressources du Noyau insuffisantes ! sector.missingresources = [scarlet]Ressources du Noyau insuffisantes !
sector.attacked = Secteur [accent]{0}[white] attaqué ! sector.attacked = Secteur [accent]{0}[white] attaqué !
sector.lost = Secteur [accent]{0}[white] perdu ! sector.lost = Secteur [accent]{0}[white] perdu !
sector.capture = Sector [accent]{0}[white]Captured! sector.capture = Secteur [accent]{0}[white]Capturé !
sector.capture.current = Sector Captured! sector.capture.current = Secteur Capturé !
sector.changeicon = Changer l'Icône sector.changeicon = Changer l'Icône
sector.noswitch.title = Impossible de changer de Secteur sector.noswitch.title = Impossible de changer de Secteur
sector.noswitch = Vous ne pouvez pas changer de secteur pendant quun autre est attaqué.\n\nSecteur: [accent]{0}[] sur [accent]{1}[] sector.noswitch = Vous ne pouvez pas changer de secteur pendant quun autre est attaqué.\n\nSecteur: [accent]{0}[] sur [accent]{1}[]
@@ -826,16 +826,16 @@ threat.high = Grande
threat.extreme = Extrême threat.extreme = Extrême
threat.eradication = Éradication threat.eradication = Éradication
difficulty.casual = Casual difficulty.casual = Paisible
difficulty.easy = Easy difficulty.easy = Facile
difficulty.normal = Normal difficulty.normal = Normal
difficulty.hard = Hard difficulty.hard = Difficile
difficulty.eradication = Eradication difficulty.eradication = Éradication
difficulty.enemyHealthMultiplier = Enemy Health: {0} difficulty.enemyHealthMultiplier = Vie des ennemis: {0}
difficulty.enemySpawnMultiplier = Enemy Amount: {0} difficulty.enemySpawnMultiplier = Nombre d'ennemis: {0}
difficulty.waveTimeMultiplier = Wave Timer: {0} difficulty.waveTimeMultiplier = Espacement des Vagues: {0}
difficulty.nomodifiers = [lightgray](No modifiers) difficulty.nomodifiers = [lightgray](Sans modification)
planets = Planètes planets = Planètes
@@ -1072,16 +1072,16 @@ stat.buildspeedmultiplier = Multiplicateur de vitesse de construction
stat.reactive = Réactions stat.reactive = Réactions
stat.immunities = Immunités stat.immunities = Immunités
stat.healing = Guérison stat.healing = Guérison
stat.efficiency = [stat]{0}% Efficiency stat.efficiency = [stat]{0}% Efficacité
ability.forcefield = Champ de Force ability.forcefield = Champ de Force
ability.forcefield.description = Projects a force shield that absorbs bullets ability.forcefield.description = Projects a force shield that absorbs bullets
ability.repairfield = Champ de Réparation ability.repairfield = Champ de Réparation
ability.repairfield.description = Repairs nearby units ability.repairfield.description = Répare les unités proches
ability.statusfield = Champ d'Amélioration ability.statusfield = Champ d'Amélioration
ability.statusfield.description = Applies a status effect to nearby units ability.statusfield.description = Applies a status effect to nearby units
ability.unitspawn = Usine ability.unitspawn = Usine
ability.unitspawn.description = Constructs units ability.unitspawn.description = Construit des unités
ability.shieldregenfield = Champ de régénération de bouclier ability.shieldregenfield = Champ de régénération de bouclier
ability.shieldregenfield.description = Regenerates shields of nearby units ability.shieldregenfield.description = Regenerates shields of nearby units
ability.movelightning = Déplacement éclair ability.movelightning = Déplacement éclair
@@ -1200,7 +1200,7 @@ unit.items = objets
unit.thousands = k unit.thousands = k
unit.millions = M unit.millions = M
unit.billions = Md unit.billions = Md
unit.shots = shots unit.shots = tirs
unit.pershot = /tirs unit.pershot = /tirs
category.purpose = Description category.purpose = Description
category.general = Caractéristiques category.general = Caractéristiques
@@ -1210,8 +1210,8 @@ category.items = Objets
category.crafting = Fabrication category.crafting = Fabrication
category.function = Fonction category.function = Fonction
category.optional = Améliorations facultatives category.optional = Améliorations facultatives
setting.alwaysmusic.name = Always Play Music setting.alwaysmusic.name = Musique en continu
setting.alwaysmusic.description = When enabled, music will always play on loop in-game.\nWhen disabled, it only plays at random intervals. setting.alwaysmusic.description = Quand activé, la musique est jouée en continu.\nSinon, la musique est jouée en intervalles aléatoires.
setting.skipcoreanimation.name = Ignorer l'animation du lancement du noyau et de l'atterrissage setting.skipcoreanimation.name = Ignorer l'animation du lancement du noyau et de l'atterrissage
setting.landscape.name = Verrouiller la rotation en mode paysage setting.landscape.name = Verrouiller la rotation en mode paysage
setting.shadows.name = Ombres setting.shadows.name = Ombres
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Un redémarrage peut être nécessaire po
setting.fps.name = Afficher les FPS et le Ping setting.fps.name = Afficher les FPS et le Ping
setting.console.name = Activer la Console setting.console.name = Activer la Console
setting.smoothcamera.name = Lissage de la Caméra setting.smoothcamera.name = Lissage de la Caméra
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.
setting.vsync.name = Synchronisation Verticale setting.vsync.name = Synchronisation Verticale
setting.pixelate.name = Pixeliser setting.pixelate.name = Pixeliser
setting.minimap.name = Afficher la Mini-carte setting.minimap.name = Afficher la Mini-carte
@@ -1285,9 +1287,9 @@ setting.macnotch.name = Adapter l'interface pour afficher l'encoche
setting.macnotch.description = Redémarrage du jeu nécessaire pour appliquer les changements setting.macnotch.description = Redémarrage du jeu nécessaire pour appliquer les changements
steam.friendsonly = Amis seulement 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. 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 = Min Camera Distance setting.maxmagnificationmultiplierpercent.name = Distance min de la caméra
setting.minmagnificationmultiplierpercent.name = Max Camera Distance setting.minmagnificationmultiplierpercent.name = Distance max de la caméra
setting.minmagnificationmultiplierpercent.description = High values may cause performance issues. setting.minmagnificationmultiplierpercent.description = Une valeur trop haute peut causer des problèmes de performance.
public.beta = Notez que les versions bêta du jeu ne peuvent pas créer de salons publics. public.beta = Notez que les versions bêta du jeu ne peuvent pas créer de salons publics.
uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement des anciens paramètres et fermeture du jeu dans [accent] {0}[] secondes... uiscale.reset = L'échelle de l'interface a été modifiée.\nAppuyez sur "OK" pour confirmer.\n[scarlet]Rétablissement des anciens paramètres et fermeture du jeu dans [accent] {0}[] secondes...
uiscale.cancel = Annuler & Quitter uiscale.cancel = Annuler & Quitter
@@ -1373,7 +1375,7 @@ keybind.shoot.name = Tirer
keybind.zoom.name = Zoomer keybind.zoom.name = Zoomer
keybind.menu.name = Menu keybind.menu.name = Menu
keybind.pause.name = Pause keybind.pause.name = Pause
keybind.skip_wave.name = Skip Wave keybind.skip_wave.name = Passer à la vague suivante
keybind.pause_building.name = Pauser/Reprendre la Construction keybind.pause_building.name = Pauser/Reprendre la Construction
keybind.minimap.name = Mini-carte keybind.minimap.name = Mini-carte
keybind.planet_map.name = Carte de la Planète keybind.planet_map.name = Carte de la Planète
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Défilement du Tchat
keybind.chat_mode.name = Changer le mode du Tchat keybind.chat_mode.name = Changer le mode du Tchat
keybind.drop_unit.name = Larguer une Unité keybind.drop_unit.name = Larguer une Unité
keybind.zoom_minimap.name = Zoomer la Mini-carte keybind.zoom_minimap.name = Zoomer la Mini-carte
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Description des modes de jeux mode.help.title = Description des modes de jeux
mode.survival.name = Survie mode.survival.name = Survie
mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Requiert des points d'apparition ennemis pour pouvoir jouer à ce mode. mode.survival.description = Le mode normal. Ressources limitées et vagues automatiques.\n[gray]Requiert des points d'apparition ennemis pour pouvoir jouer à ce mode.
@@ -1473,7 +1477,7 @@ rules.title.teams = Équipes
rules.title.planet = Planète rules.title.planet = Planète
rules.lighting = Éclairage rules.lighting = Éclairage
rules.fog = Brouillard de Guerre rules.fog = Brouillard de Guerre
rules.invasions = Enemy Sector Invasions rules.invasions = L'ennemi peut attaquer vos secteurs
rules.legacylaunchpads = Legacy Launch Pad Mechanics rules.legacylaunchpads = Legacy Launch Pad Mechanics
rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0. rules.legacylaunchpads.info = Allows using launch pads without landing pads, as in 7.0.
landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled)
@@ -1633,7 +1637,7 @@ block.graphite-press.name = Presse à Graphite
block.multi-press.name = Multi-Presse block.multi-press.name = Multi-Presse
block.constructing = {0} [lightgray](En Construction) block.constructing = {0} [lightgray](En Construction)
block.spawn.name = Point d'Apparition Ennemi block.spawn.name = Point d'Apparition Ennemi
block.remove-wall.name = Remove Wall block.remove-wall.name = Supprimer le mur
block.remove-ore.name = Remove Ore block.remove-ore.name = Remove Ore
block.core-shard.name = Noyau: Fragment block.core-shard.name = Noyau: Fragment
block.core-foundation.name = Noyau: Fondation block.core-foundation.name = Noyau: Fondation
@@ -2027,7 +2031,7 @@ hint.unitSelectControl.mobile = Pour contrôler les unités, entrez en mode [acc
hint.launch = Une fois que vous avez collecté assez de ressources, vous pouvez [accent]Lancer[] votre Noyau en sélectionnant un secteur depuis la :map: [accent]Carte[] en bas à droite. hint.launch = Une fois que vous avez collecté assez de ressources, vous pouvez [accent]Lancer[] votre Noyau en sélectionnant un secteur depuis la :map: [accent]Carte[] en bas à droite.
hint.launch.mobile = Une fois que vous avez collecté assez de ressources, vous pouvez [accent]Lancer[] votre Noyau en sélectionnant un secteur depuis la :map: [accent]Carte[] dans le :menu: [accent]Menu[]. hint.launch.mobile = Une fois que vous avez collecté assez de ressources, vous pouvez [accent]Lancer[] votre Noyau en sélectionnant un secteur depuis la :map: [accent]Carte[] dans le :menu: [accent]Menu[].
hint.schematicSelect = Retenez [accent][[F][] pour sélectionner des blocs dans une zone afin de les copier et les coller.\n\n[accent][[Clic molette][] pour copier un seul type de bloc. hint.schematicSelect = Retenez [accent][[F][] pour sélectionner des blocs dans une zone afin de les copier et les coller.\n\n[accent][[Clic molette][] pour copier un seul type de bloc.
hint.rebuildSelect = Retenez [accent][[B][] et faites glissez pour selectionner les plans des blocs détruits.\nCela va automatiquement les reconstruire. hint.rebuildSelect = Retenez [accent][[B][] et faites glisser pour selectionner les plans des blocs détruits.\nCela va automatiquement les reconstruire.
hint.rebuildSelect.mobile = Selectionnez le :copy: bouton de copie, ensuite tapez le :wrench: bouton de reconstruction et faites glisser pour sélectionner les plans des blocs détruits.\nCela va les reconstruire automatiquement. hint.rebuildSelect.mobile = Selectionnez le :copy: bouton de copie, ensuite tapez le :wrench: bouton de reconstruction et faites glisser pour sélectionner les plans des blocs détruits.\nCela va les reconstruire automatiquement.
hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement. hint.conveyorPathfind = Retenez [accent][[Ctrl-gauche][] pendant que vous placez des convoyeurs, afin de générer un chemin automatiquement.
hint.conveyorPathfind.mobile = Activez le mode :diagonal: [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement. hint.conveyorPathfind.mobile = Activez le mode :diagonal: [accent]Diagonale[] et déplacez des convoyeurs, afin de générer un chemin automatiquement.
@@ -2085,7 +2089,7 @@ onset.turrets = Les unités sont efficaces, mais les [accent]tourelles[] ont de
onset.turretammo = Approvisionnez les tourelles avec du [accent]béryllium[]. onset.turretammo = Approvisionnez les tourelles avec du [accent]béryllium[].
onset.walls = Les [accent]murs[] peuvent encaisser les dégâts des attaques ennemies avant qu'elles atteignent vos constructions.\nPlacez quelques :beryllium-wall: [accent]murs de béryllium[] autour de la tourelle. onset.walls = Les [accent]murs[] peuvent encaisser les dégâts des attaques ennemies avant qu'elles atteignent vos constructions.\nPlacez quelques :beryllium-wall: [accent]murs de béryllium[] autour de la tourelle.
onset.enemies = Ennemis en approche, préparez-vous à défendre. onset.enemies = Ennemis en approche, préparez-vous à défendre.
onset.defenses = [accent]Set up defenses:[lightgray] {0} onset.defenses = [accent]Préparez vos défenses:[lightgray] {0}
onset.attack = L'ennemi est vulnérable. Contre-attaquez ! onset.attack = L'ennemi est vulnérable. Contre-attaquez !
onset.cores = Les noyaux peuvent être placés sur des [accent]tuiles de noyau[].\nCes nouveaux noyaux servent à faire avancer votre base et partager vos ressources avec d'autres noyaux.\nPlacez un noyau :core-bastion:. onset.cores = Les noyaux peuvent être placés sur des [accent]tuiles de noyau[].\nCes nouveaux noyaux servent à faire avancer votre base et partager vos ressources avec d'autres noyaux.\nPlacez un noyau :core-bastion:.
onset.detect = L'ennemi sera capable de vous détecter dans 2 minutes.\nAméliorez vos défenses, vos exploitations minières ainsi que votre production. onset.detect = L'ennemi sera capable de vous détecter dans 2 minutes.\nAméliorez vos défenses, vos exploitations minières ainsi que votre production.
@@ -2183,10 +2187,10 @@ block.phase-wall.description = Ce mur est moins puissant qu'un mur en thorium, m
block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes. block.phase-wall-large.description = Ce mur est moins puissant qu'un mur en thorium, mais il peut dévier les balles, sauf si elles sont trop puissantes.
block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis. block.surge-wall.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis. block.surge-wall-large.description = Le plus puissant bloc défensif.\nA une faible chance d'envoyer des éclairs vers les ennemis.
block.scrap-wall.description = Protects structures from enemy projectiles. block.scrap-wall.description = Protège les structures des projectiles ennemis.
block.scrap-wall-large.description = Protects structures from enemy projectiles. block.scrap-wall-large.description = Protège les structures des projectiles ennemis.
block.scrap-wall-huge.description = Protects structures from enemy projectiles. block.scrap-wall-huge.description = Protège les structures des projectiles ennemis.
block.scrap-wall-gigantic.description = Protects structures from enemy projectiles. block.scrap-wall-gigantic.description = Protège les structures des projectiles ennemis.
block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door.description = Une petite porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers. block.door-large.description = Une grande porte pouvant être ouverte et fermée en appuyant dessus.\nSi elle est ouverte, les ennemis peuvent passer à travers.
block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité. block.mender.description = Soigne périodiquement les bâtiments autour de lui, ce qui permet de remettre les défenses en bon état entre les vagues ennemies.\nPeut utiliser du silicium pour booster la portée et l'efficacité.
@@ -2484,7 +2488,7 @@ lst.spawnunit = Fait apparaître une unité à un emplacement.
lst.applystatus = Ajoute ou enlève un effet de statut d'une unité. lst.applystatus = Ajoute ou enlève un effet de statut d'une unité.
lst.weathersense = Check if a type of weather is active. lst.weathersense = Check if a type of weather is active.
lst.weatherset = Set the current state of a type of weather. lst.weatherset = Set the current state of a type of weather.
lst.spawnwave = Simule un déclenchement de vague à n'importe quel emplacement.\nCela n'incrémente pas le compteur de vaugues. lst.spawnwave = Simule un déclenchement de vague à n'importe quel emplacement.\nCela n'incrémente pas le compteur de vagues.
lst.explosion = Crée une explosion à un emplacement. lst.explosion = Crée une explosion à un emplacement.
lst.setrate = Définit la vitesse d'exécution d'un processeur en instructions/tick. lst.setrate = Définit la vitesse d'exécution d'un processeur en instructions/tick.
lst.fetch = Cherche les unités, noyaux, joueurs ou constructions par index. Commence à 0 et termine par le nombre retourné. lst.fetch = Cherche les unités, noyaux, joueurs ou constructions par index. Commence à 0 et termine par le nombre retourné.
@@ -2506,8 +2510,8 @@ lst.localeprint = Add map locale property value to the text buffer.\nTo set map
lglobal.false = 0 lglobal.false = 0
lglobal.true = 1 lglobal.true = 1
lglobal.null = null lglobal.null = null
lglobal.@pi = The mathematical constant pi (3.141...) lglobal.@pi = La constante mathématique pi (3.141...)
lglobal.@e = The mathematical constant e (2.718...) lglobal.@e = La constante mathématique e (2.718...)
lglobal.@degToRad = Multiply by this number to convert degrees to radians lglobal.@degToRad = Multiply by this number to convert degrees to radians
lglobal.@radToDeg = Multiply by this number to convert radians to degrees lglobal.@radToDeg = Multiply by this number to convert radians to degrees
@@ -2544,7 +2548,7 @@ lglobal.@clientLocale = Locale of the client running the code. For example: en_U
lglobal.@clientUnit = Unit of client running the code lglobal.@clientUnit = Unit of client running the code
lglobal.@clientName = Player name of client running the code lglobal.@clientName = Player name of client running the code
lglobal.@clientTeam = Team ID of client running the code lglobal.@clientTeam = Team ID of client running the code
lglobal.@clientMobile = True is the client running the code is on mobile, false otherwise lglobal.@clientMobile = True if the client running the code is on mobile, false otherwise
logic.nounitbuild = [red]Les unités contrôlées par des processeurs ne peuvent pas construire ici. logic.nounitbuild = [red]Les unités contrôlées par des processeurs ne peuvent pas construire ici.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = L'ID d'une unité/bloc/ressource/liquide.\nCeci est l'inverse de l'instruction de recherche. laccess.id = L'ID d'une unité/bloc/ressource/liquide.\nCeci est l'inverse de l'instruction de recherche.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Inconnu lcategory.unknown = Inconnu
+44 -40
View File
@@ -405,7 +405,7 @@ pausebuilding = [accent][[{0}][] az építkezés megállításához
resumebuilding = [scarlet][[{0}][] az építkezés folytatásához resumebuilding = [scarlet][[{0}][] az építkezés folytatásához
enablebuilding = [scarlet][[{0}][] az építkezés jóváhagyásához enablebuilding = [scarlet][[{0}][] az építkezés jóváhagyásához
showui = A kezelőfelület elrejtve.\nNyomd meg a(z) [accent][[{0}][] gombot a kezelőfelület megjelenítéséhez. showui = A kezelőfelület elrejtve.\nNyomd meg a(z) [accent][[{0}][] gombot a kezelőfelület megjelenítéséhez.
commandmode.name = [accent]Parancs mód commandmode.name = [accent]Parancsmód
commandmode.nounits = [nincs egység] commandmode.nounits = [nincs egység]
wave = [accent]{0}. hullám wave = [accent]{0}. hullám
wave.cap = [accent]{0}./{1} hullám wave.cap = [accent]{0}./{1} hullám
@@ -707,7 +707,7 @@ objective.timer.name = Időzítő
objective.destroyblock.name = Blokk megsemmisítése objective.destroyblock.name = Blokk megsemmisítése
objective.destroyblocks.name = Blokkok megsemmisítése objective.destroyblocks.name = Blokkok megsemmisítése
objective.destroycore.name = Támaszpont megsemmisítése objective.destroycore.name = Támaszpont megsemmisítése
objective.commandmode.name = Parancs mód objective.commandmode.name = Parancsmód
objective.flag.name = Jelölő objective.flag.name = Jelölő
marker.shapetext.name = Szövegforma marker.shapetext.name = Szövegforma
@@ -793,7 +793,7 @@ sectors.wave = Hullám:
sectors.stored = Tárolt nyersanyagok: sectors.stored = Tárolt nyersanyagok:
sectors.resume = Folytatás sectors.resume = Folytatás
sectors.launch = Kilövés sectors.launch = Kilövés
sectors.viewsubmission = \ue80d View Submissions sectors.viewsubmission = \ue80d Alküldetések megtekintése
sectors.select = Kiválasztás sectors.select = Kiválasztás
sectors.launchselect = Célállomás kiválasztása sectors.launchselect = Célállomás kiválasztása
sectors.nonelaunch = [lightgray]semmi (nap) sectors.nonelaunch = [lightgray]semmi (nap)
@@ -818,7 +818,7 @@ sector.changeicon = Ikon módosítása
sector.noswitch.title = A szektorváltás nem lehetséges sector.noswitch.title = A szektorváltás nem lehetséges
sector.noswitch = Nem válthatsz szektort, amíg egy meglévő szektor támadás alatt áll.\n\nSzektor: [accent]{0}[] a(z) [accent]{1}[] bolygón sector.noswitch = Nem válthatsz szektort, amíg egy meglévő szektor támadás alatt áll.\n\nSzektor: [accent]{0}[] a(z) [accent]{1}[] bolygón
sector.view = A szektor megtekintése sector.view = A szektor megtekintése
sector.foundationrequired = [lightgray] Core: Foundation Required sector.foundationrequired = [lightgray] Alapítvány támaszpont szükséges
threat.low = Alacsony threat.low = Alacsony
threat.medium = Közepes threat.medium = Közepes
@@ -855,7 +855,7 @@ sector.overgrowth.name = Túlburjánzás
sector.tarFields.name = Kátránymezők sector.tarFields.name = Kátránymezők
sector.saltFlats.name = Sós síkságok sector.saltFlats.name = Sós síkságok
sector.fungalPass.name = Gombahágó sector.fungalPass.name = Gombahágó
sector.biomassFacility.name = Biomassza-szintetizáló-létesítmény sector.biomassFacility.name = Biomasszaszintetizáló-létesítmény
sector.windsweptIslands.name = Szélfútta szigetek sector.windsweptIslands.name = Szélfútta szigetek
sector.extractionOutpost.name = Kivonási helyőrség sector.extractionOutpost.name = Kivonási helyőrség
sector.facility32m.name = 32M-es létesítmény sector.facility32m.name = 32M-es létesítmény
@@ -953,7 +953,7 @@ status.electrified.name = Elektromos
status.spore-slowed.name = Spórával lassított status.spore-slowed.name = Spórával lassított
status.tarred.name = Kátrányozott status.tarred.name = Kátrányozott
status.overdrive.name = Túlhajtás status.overdrive.name = Túlhajtás
status.overclock.name = Túlhúzás status.overclock.name = Túl
status.shocked.name = Sokkolt status.shocked.name = Sokkolt
status.blasted.name = Felrobbant status.blasted.name = Felrobbant
status.unmoving.name = Mozdulatlan status.unmoving.name = Mozdulatlan
@@ -1222,7 +1222,7 @@ setting.logichints.name = Logikai tanácsok
setting.backgroundpause.name = Szüneteltetés a háttérben setting.backgroundpause.name = Szüneteltetés a háttérben
setting.buildautopause.name = Automatikus szünet építéskor setting.buildautopause.name = Automatikus szünet építéskor
setting.doubletapmine.name = Bányászás dupla kattintással/koppintással setting.doubletapmine.name = Bányászás dupla kattintással/koppintással
setting.commandmodehold.name = Lenyomva tartás a parancs módhoz setting.commandmodehold.name = Lenyomva tartás a parancsmódhoz
setting.distinctcontrolgroups.name = Egységenként legfeljebb egy vezérlőcsoport setting.distinctcontrolgroups.name = Egységenként legfeljebb egy vezérlőcsoport
setting.modcrashdisable.name = Modok letiltása indításkori összeomláskor setting.modcrashdisable.name = Modok letiltása indításkori összeomláskor
setting.animatedwater.name = Animált felületek setting.animatedwater.name = Animált felületek
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = A változtatások érvénybe lépéséhez
setting.fps.name = FPS, memóriahasználat és ping megjelenítése setting.fps.name = FPS, memóriahasználat és ping megjelenítése
setting.console.name = Konzol engedélyezése setting.console.name = Konzol engedélyezése
setting.smoothcamera.name = Egyenletes kamera setting.smoothcamera.name = Egyenletes 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelesítés setting.pixelate.name = Pixelesítés
setting.minimap.name = Minitérkép megjelenítése setting.minimap.name = Minitérkép megjelenítése
@@ -1313,7 +1315,7 @@ keybind.move_y.name = Mozgás függőlegesen
keybind.mouse_move.name = Egér követése keybind.mouse_move.name = Egér követése
keybind.pan.name = Felderítés keybind.pan.name = Felderítés
keybind.boost.name = Erősítés keybind.boost.name = Erősítés
keybind.command_mode.name = Parancs mód keybind.command_mode.name = Parancsmód
keybind.command_queue.name = Egységparancsok sorba állítása keybind.command_queue.name = Egységparancsok sorba állítása
keybind.create_control_group.name = Vezérlőcsoport készítése keybind.create_control_group.name = Vezérlőcsoport készítése
keybind.cancel_orders.name = Parancsok visszavonása keybind.cancel_orders.name = Parancsok visszavonása
@@ -1364,8 +1366,8 @@ keybind.pick.name = Blokk kiválasztása
keybind.break_block.name = Blokk törlése keybind.break_block.name = Blokk törlése
keybind.select_all_units.name = Összes egység kijelölése keybind.select_all_units.name = Összes egység kijelölése
keybind.select_all_unit_factories.name = Összes egységgyár kijelölése keybind.select_all_unit_factories.name = Összes egységgyár kijelölése
keybind.select_all_unit_transport.name = Select All Unit Transports keybind.select_all_unit_transport.name = Összes egységszállító kijelölése
keybind.select_across_screen.name = Select Across Screen (Hold) keybind.select_across_screen.name = Teljes képernyős kijelölés (tartsd lenyomva)
keybind.deselect.name = Blokk-kijelölés törlése keybind.deselect.name = Blokk-kijelölés törlése
keybind.pickupCargo.name = Rakomány felvétele keybind.pickupCargo.name = Rakomány felvétele
keybind.dropCargo.name = Rakomány lerakása keybind.dropCargo.name = Rakomány lerakása
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Csevegés görgetése
keybind.chat_mode.name = Csevegési mód megváltoztatása keybind.chat_mode.name = Csevegési mód megváltoztatása
keybind.drop_unit.name = Egység eldobása keybind.drop_unit.name = Egység eldobása
keybind.zoom_minimap.name = Nagyítás a minitérképen keybind.zoom_minimap.name = Nagyítás a minitérképen
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Játékmódok leírása mode.help.title = Játékmódok leírása
mode.survival.name = Túlélés mode.survival.name = Túlélés
mode.survival.description = A normál mód. Korlátozott nyersanyagok, és automatikusan érkező hullámok.\n[gray]Ellenséges kezdőpont szükséges hozzá a pályán. mode.survival.description = A normál mód. Korlátozott nyersanyagok, és automatikusan érkező hullámok.\n[gray]Ellenséges kezdőpont szükséges hozzá a pályán.
@@ -1406,7 +1410,7 @@ mode.custom = Egyéni szabályok
rules.invaliddata = Érvénytelen adatok vannak a vágólapon. rules.invaliddata = Érvénytelen adatok vannak a vágólapon.
rules.hidebannedblocks = Tiltott épületek elrejtése rules.hidebannedblocks = Tiltott épületek elrejtése
rules.infiniteresources = Végtelen nyersanyagforrás rules.infiniteresources = Végtelen nyersanyagforrás
rules.fillitems = Fill Core With Items rules.fillitems = Támaszpont feltöltése nyersanyagokkal
rules.onlydepositcore = Csak a támaszpontokba engedélyezett a nyersanyagok elhelyezése rules.onlydepositcore = Csak a támaszpontokba engedélyezett a nyersanyagok elhelyezése
rules.derelictrepair = Az elhagyatott épületek javításának engedélyezése rules.derelictrepair = Az elhagyatott épületek javításának engedélyezése
rules.reactorexplosions = Reaktorrobbanások rules.reactorexplosions = Reaktorrobbanások
@@ -1421,14 +1425,14 @@ rules.alloweditworldprocessors = Világprocesszorok szerkesztésének engedélye
rules.alloweditworldprocessors.info = Amikor engedélyezve van, a világlogikai blokkok a szerkesztőn kívül is elhelyezhetők és szerkeszthetők. rules.alloweditworldprocessors.info = Amikor engedélyezve van, a világlogikai blokkok a szerkesztőn kívül is elhelyezhetők és szerkeszthetők.
rules.waves = Hullámok rules.waves = Hullámok
rules.airUseSpawns = A légi egységek használjanak kezdőpontokat rules.airUseSpawns = A légi egységek használjanak kezdőpontokat
rules.wavespawnatcores = Waves Spawn At Cores rules.wavespawnatcores = Hullámok indítása a támaszpontok közeléből
rules.wavespawnatcores.info = When enabled in attack mode, waves spawn near all enemy cores. rules.wavespawnatcores.info = Ha engedélyezve van a támadómódú pályákon, akkor a hullámok az ellenséges támaszpontok közeléből indulnak.
rules.attack = Támadási mód rules.attack = Támadómód
rules.buildai = Bázisépítő MI rules.buildai = Bázisépítő MI
rules.buildaitier = Építő MI szintje rules.buildaitier = Építő MI szintje
rules.rtsai = RTS MI [red](WIP) rules.rtsai = RTS MI
rules.rtsai.campaign = RTS támadó MI rules.rtsai.campaign = RTS támadó-MI
rules.rtsai.campaign.info = A „támadó” pályákon (ahol az ellenség is rendelkezik támaszponttal) az MI által irányított\negységek csoportosulnak, és intelligensebb módon támadják a játékosok bázisait. rules.rtsai.campaign.info = A „támadómódú” pályákon (ahol az ellenség is rendelkezik támaszponttal) az MI által irányított\negységek csoportosulnak, és intelligensebb módon támadják a játékosok bázisait.
rules.rtsminsquadsize = Minimális osztagméret rules.rtsminsquadsize = Minimális osztagméret
rules.rtsmaxsquadsize = Maximális osztagméret rules.rtsmaxsquadsize = Maximális osztagméret
rules.rtsminattackweight = Minimális támadási súly rules.rtsminattackweight = Minimális támadási súly
@@ -1783,13 +1787,13 @@ block.impulse-pump.name = Impulzusszivattyú
block.thermal-generator.name = Hőerőmű block.thermal-generator.name = Hőerőmű
block.surge-smelter.name = Elektrometál-olvasztó block.surge-smelter.name = Elektrometál-olvasztó
block.mender.name = Foltozó block.mender.name = Foltozó
block.mend-projector.name = Foltozó-kivetítő block.mend-projector.name = Foltozókivetítő
block.surge-wall.name = Elektrometálfal block.surge-wall.name = Elektrometálfal
block.surge-wall-large.name = Nagy elektrometálfal block.surge-wall-large.name = Nagy elektrometálfal
block.cyclone.name = Cyclone block.cyclone.name = Cyclone
block.fuse.name = Fuse block.fuse.name = Fuse
block.shock-mine.name = Sokkoló taposóakna block.shock-mine.name = Sokkoló taposóakna
block.overdrive-projector.name = Túlhajtó kivetítő block.overdrive-projector.name = Túlhajtókivetítő
block.force-projector.name = Erőpajzs-kivetítő block.force-projector.name = Erőpajzs-kivetítő
block.arc.name = Arc block.arc.name = Arc
block.rtg-generator.name = R. T. Generátor block.rtg-generator.name = R. T. Generátor
@@ -1905,7 +1909,7 @@ block.slag-incinerator.name = Salakos égetőkamra
block.carbide-crucible.name = Karbidolvasztó block.carbide-crucible.name = Karbidolvasztó
block.slag-centrifuge.name = Salakcentrifuga block.slag-centrifuge.name = Salakcentrifuga
block.surge-crucible.name = Elektrometál-olvasztó block.surge-crucible.name = Elektrometál-olvasztó
block.cyanogen-synthesizer.name = Diciánszintetizáló block.cyanogen-synthesizer.name = Dicián
block.phase-synthesizer.name = Tóritkvarc-szintetizáló block.phase-synthesizer.name = Tóritkvarc-szintetizáló
block.heat-reactor.name = Hőerőmű block.heat-reactor.name = Hőerőmű
block.beryllium-wall.name = Berilliumfal block.beryllium-wall.name = Berilliumfal
@@ -1920,7 +1924,7 @@ block.reinforced-surge-wall-large.name = Nagy megerősített elektrometálfal
block.shielded-wall.name = Pajzzsal védett fal block.shielded-wall.name = Pajzzsal védett fal
block.radar.name = Radar block.radar.name = Radar
block.build-tower.name = Építőtorony block.build-tower.name = Építőtorony
block.regen-projector.name = Regeneráló kivetítő block.regen-projector.name = Regenerálókivetítő
block.shockwave-tower.name = Sokkhullámtorony block.shockwave-tower.name = Sokkhullámtorony
block.shield-projector.name = Erőpajzs-kivetítő block.shield-projector.name = Erőpajzs-kivetítő
block.large-shield-projector.name = Nagy erőpajzs-kivetítő block.large-shield-projector.name = Nagy erőpajzs-kivetítő
@@ -2022,8 +2026,8 @@ hint.research = Használd a :tree: [accent]technológiafa[] gombot, hogy új tec
hint.research.mobile = Használd a :tree: [accent]technológiafa[] gombot a :menu: [accent]menüben[], hogy új technológiákat fedezz fel. hint.research.mobile = Használd a :tree: [accent]technológiafa[] gombot a :menu: [accent]menüben[], hogy új technológiákat fedezz fel.
hint.unitControl = Nyomd le a [accent][[bal Ctrl][] gombot, és kattints [accent]jobb egérgombbal[] a baráti egység vagy lövegtorony irányításához. hint.unitControl = Nyomd le a [accent][[bal Ctrl][] gombot, és kattints [accent]jobb egérgombbal[] a baráti egység vagy lövegtorony irányításához.
hint.unitControl.mobile = [accent][[Dupla koppintással][] a szövetséges egységek vagy lövegtornyok kézileg irányíthatók. hint.unitControl.mobile = [accent][[Dupla koppintással][] a szövetséges egységek vagy lövegtornyok kézileg irányíthatók.
hint.unitSelectControl = Az egységek irányításához lépj be [accent]parancs módba[] a [accent]bal Shift[] lenyomva tartásával.\nParancs módban az egységek kijelöléséhez kattints, és húzd az egeret. A [accent]jobb egérgombbal[] küldd az egységeket a helyszínre vagy a célponthoz. hint.unitSelectControl = Az egységek irányításához lépj be [accent]parancsmódba[] a [accent]bal Shift[] lenyomva tartásával.\nParancsmódban az egységek kijelöléséhez kattints, és húzd az egeret. A [accent]jobb egérgombbal[] küldd az egységeket a helyszínre vagy a célponthoz.
hint.unitSelectControl.mobile = Az egységek irányításához lépj be [accent]parancs módba[] a bal alsó sarokban lévő [accent]parancs[] gombbal.\nParancs módban az egységek kiválasztásához érintsd meg a kijelzőt és húzással jelöld ki az egységeket. Koppintással küldd az egységeket a helyszínre vagy a célponthoz. hint.unitSelectControl.mobile = Az egységek irányításához lépj be [accent]parancsmódba[] a bal alsó sarokban lévő [accent]parancs[] gombbal.\nParancsmódban az egységek kiválasztásához érintsd meg a kijelzőt és húzással jelöld ki az egységeket. Koppintással küldd az egységeket a helyszínre vagy a célponthoz.
hint.launch = Ha elegendő nyersanyagot gyűjtöttél össze, akkor [accent]lődd ki[] a támaszpontot a következő szektorba, úgy, hogy megnyitod a \ue827 [accent]bolygótérképet[] a jobb alsó sarokban, és átforgatod az új helyszínre. hint.launch = Ha elegendő nyersanyagot gyűjtöttél össze, akkor [accent]lődd ki[] a támaszpontot a következő szektorba, úgy, hogy megnyitod a \ue827 [accent]bolygótérképet[] a jobb alsó sarokban, és átforgatod az új helyszínre.
hint.launch.mobile = Ha elegendő nyersanyagot gyűjtöttél össze, akkor [accent]lődd ki[] a támaszpontot egy közeli szektorba, úgy, hogy kiválasztasz egy szektort a :menu: [accent]menüben[] a \ue827 [accent]bolygótérképről[]. hint.launch.mobile = Ha elegendő nyersanyagot gyűjtöttél össze, akkor [accent]lődd ki[] a támaszpontot egy közeli szektorba, úgy, hogy kiválasztasz egy szektort a :menu: [accent]menüben[] a \ue827 [accent]bolygótérképről[].
hint.schematicSelect = Tartsd lenyomva az [accent][[F][] gombot több épület kijelöléséhez és másolásához.\n\n[accent][[Középső kattintással][] egy adott blokktípus másolható. hint.schematicSelect = Tartsd lenyomva az [accent][[F][] gombot több épület kijelöléséhez és másolásához.\n\n[accent][[Középső kattintással][] egy adott blokktípus másolható.
@@ -2043,8 +2047,8 @@ hint.coreUpgrade = A támaszpont úgy fejleszthető, hogy [accent]magasabb szint
hint.presetLaunch = A szürke [accent]landolási zónát tartalmazó szektorokba[], amilyen például a [accent]Fagyott erdő[], bárhonnan kilőhetsz. Nem szükséges hozzá szomszédos területet elfoglalnod.\n\nA [accent]számozott szektorokat[], mint ez is, a játékmenet szempontjából [accent]nem fontos[] elfoglalni. hint.presetLaunch = A szürke [accent]landolási zónát tartalmazó szektorokba[], amilyen például a [accent]Fagyott erdő[], bárhonnan kilőhetsz. Nem szükséges hozzá szomszédos területet elfoglalnod.\n\nA [accent]számozott szektorokat[], mint ez is, a játékmenet szempontjából [accent]nem fontos[] elfoglalni.
hint.presetDifficulty = Ebben a szektorban [scarlet]magas az ellenséges fenyegetettségi szint[].\nAz ilyen szektorokba való indulás [accent]nem ajánlott[] megfelelő technológia és felkészülés nélkül. hint.presetDifficulty = Ebben a szektorban [scarlet]magas az ellenséges fenyegetettségi szint[].\nAz ilyen szektorokba való indulás [accent]nem ajánlott[] megfelelő technológia és felkészülés nélkül.
hint.coreIncinerate = Ha a támaszpont egy nyersanyagból elérte a maximumot, a beérkező további nyersanyagok azonnal [accent]megsemmisítésre kerülnek[]. hint.coreIncinerate = Ha a támaszpont egy nyersanyagból elérte a maximumot, a beérkező további nyersanyagok azonnal [accent]megsemmisítésre kerülnek[].
hint.factoryControl = Egy egységgyár [accent]kimeneti célpontjának[] beállításához kattints parancs módban egy gyárépületre, majd kattints jobb egérgombbal egy helyre.\nAz előállított egységek automatikusan odamennek. hint.factoryControl = Egy egységgyár [accent]kimeneti célpontjának[] beállításához kattints parancsmódban egy gyárépületre, majd kattints jobb egérgombbal egy helyre.\nAz előállított egységek automatikusan odamennek.
hint.factoryControl.mobile = Egy egységgyár [accent]kimeneti célpontjának[] beállításához koppints parancs módban egy gyárépületre, majd koppints egy helyre.\nAz előállított egységek automatikusan odamennek. hint.factoryControl.mobile = Egy egységgyár [accent]kimeneti célpontjának[] beállításához koppints parancsmódban egy gyárépületre, majd koppints egy helyre.\nAz előállított egységek automatikusan odamennek.
gz.mine = Menj a földön lévő :ore-copper: [accent]rézérc[] közelébe, és kattints a bányászat megkezdéséhez. gz.mine = Menj a földön lévő :ore-copper: [accent]rézérc[] közelébe, és kattints a bányászat megkezdéséhez.
gz.mine.mobile = Menj a földön lévő :ore-copper: [accent]rézérc[] közelébe, és koppints a bányászat megkezdéséhez. gz.mine.mobile = Menj a földön lévő :ore-copper: [accent]rézérc[] közelébe, és koppints a bányászat megkezdéséhez.
@@ -2089,8 +2093,8 @@ onset.defenses = [accent]Állíts fel védelmet:[lightgray] {0}
onset.attack = Az ellenség most sebezhető. Indíts ellentámadást. onset.attack = Az ellenség most sebezhető. Indíts ellentámadást.
onset.cores = Új támaszpont csak a [accent]támaszpontmezőre[] helyezhető.\nAz új támaszpontok előretolt bázisként működnek, és megosztják a nyersanyagkészletüket más támaszpontokkal.\nHelyezz el egy :core-bastion: bástya támaszpontot. onset.cores = Új támaszpont csak a [accent]támaszpontmezőre[] helyezhető.\nAz új támaszpontok előretolt bázisként működnek, és megosztják a nyersanyagkészletüket más támaszpontokkal.\nHelyezz el egy :core-bastion: bástya támaszpontot.
onset.detect = Az ellenség 2 percen belül észrevesz téged.\nÁllíts fel védelmet, bányászatot és termelést. onset.detect = Az ellenség 2 percen belül észrevesz téged.\nÁllíts fel védelmet, bányászatot és termelést.
onset.commandmode = Tartsd lenyomva a [accent]bal Shift[] gombot, hogy [accent]parancs módba[] lépj.\n[accent]Bal egérgombbal és húzással[] lehet egységeket kijelölni.\n[accent]Jobb egérgombbal[] az egységek mozgásra vagy támadásra utasíthatók. onset.commandmode = Tartsd lenyomva a [accent]bal Shift[] gombot, hogy [accent]parancsmódba[] lépj.\n[accent]Bal egérgombbal és húzással[] lehet egységeket kijelölni.\n[accent]Jobb egérgombbal[] az egységek mozgásra vagy támadásra utasíthatók.
onset.commandmode.mobile = Nyomd meg a [accent]parancs gombot[], hogy [accent]parancs módba[] lépj.\nTartsd lenyomva az ujjad, majd [accent]húzd[] az egységek kiválasztásához.\n[accent]Koppintással[] az egységek mozgásra vagy támadásra utasíthatók. onset.commandmode.mobile = Nyomd meg a [accent]parancs gombot[], hogy [accent]parancsmódba[] lépj.\nTartsd lenyomva az ujjad, majd [accent]húzd[] az egységek kiválasztásához.\n[accent]Koppintással[] az egységek mozgásra vagy támadásra utasíthatók.
aegis.tungsten = Volfrámot [accent]ütvefúróval[] lehet bányászni.\nEnnek az épületnek [accent]vízre[] és [accent]áramra[] van szüksége. aegis.tungsten = Volfrámot [accent]ütvefúróval[] lehet bányászni.\nEnnek az épületnek [accent]vízre[] és [accent]áramra[] van szüksége.
split.pickup = Egyes blokkok a támaszpont drónjával is felvehetők.\nVedd fel ezt a [accent]konténert[] és helyezd egy [accent]rakománycsomagolóba[].\n(A felvétel és lerakás alapértelmezett gombjai: [[ és ].) split.pickup = Egyes blokkok a támaszpont drónjával is felvehetők.\nVedd fel ezt a [accent]konténert[] és helyezd egy [accent]rakománycsomagolóba[].\n(A felvétel és lerakás alapértelmezett gombjai: [[ és ].)
@@ -2272,8 +2276,8 @@ block.spectre.description = Nagy lövedékekkel tüzel légi és földi célpont
block.meltdown.description = Feltöltődés után folyamatos lézersugarat lő a közeli ellenségekre. A működéséhez hűtőfolyadékot igényel. block.meltdown.description = Feltöltődés után folyamatos lézersugarat lő a közeli ellenségekre. A működéséhez hűtőfolyadékot igényel.
block.foreshadow.description = Egy nagy villámot lő ki egy nagy távolságra lévő célpontra. A magasabb maximális életerővel rendelkező ellenségeket részesíti előnyben. block.foreshadow.description = Egy nagy villámot lő ki egy nagy távolságra lévő célpontra. A magasabb maximális életerővel rendelkező ellenségeket részesíti előnyben.
block.repair-point.description = Folyamatosan javítja a hatósugarában lévő legközelebbi sérült egységet. block.repair-point.description = Folyamatosan javítja a hatósugarában lévő legközelebbi sérült egységet.
block.segment.description = Megsemmisíti a beérkező lövedékeket. A lézerrel szemben hatástalan. block.segment.description = Megsemmisíti a beérkező lövedékeket, de a lézerrel szemben hatástalan.
block.parallax.description = Vonónyalábot bocsát ki, amivel magához vonzza, és közben sebzi a légi egységeket. block.parallax.description = Vonósugarat bocsát ki, amivel magához vonzza, és közben sebzi a légi egységeket.
block.tsunami.description = Erős folyadékhullámot lő az ellenségre. Eloltja a tüzeket, ha vízzel van ellátva. block.tsunami.description = Erős folyadékhullámot lő az ellenségre. Eloltja a tüzeket, ha vízzel van ellátva.
block.silicon-crucible.description = Szilíciumot finomít homokból és szénből, piratitot igényel kiegészítő hőforrásként. Forró környezetben még hatékonyabb. block.silicon-crucible.description = Szilíciumot finomít homokból és szénből, piratitot igényel kiegészítő hőforrásként. Forró környezetben még hatékonyabb.
block.disassembler.description = Ritka ásványi összetevőire bontja le a salakot, alacsony hatásfokkal. Képes tóriumot kinyerni. block.disassembler.description = Ritka ásványi összetevőire bontja le a salakot, alacsony hatásfokkal. Képes tóriumot kinyerni.
@@ -2449,14 +2453,14 @@ unit.collaris.description = Nagy hatótávolságú repeszágyúval lövi az elle
unit.elude.description = Célkövető golyópárokat lő ki az ellenséges célpontokra. Lebeg a folyadékfelületeket felett. unit.elude.description = Célkövető golyópárokat lő ki az ellenséges célpontokra. Lebeg a folyadékfelületeket felett.
unit.avert.description = Forgó lövedékpárokat lő ki az ellenséges célpontokra. unit.avert.description = Forgó lövedékpárokat lő ki az ellenséges célpontokra.
unit.obviate.description = Forgó, páros villámgömböket lő ki az ellenséges célpontokra. unit.obviate.description = Forgó, páros villámgömböket lő ki az ellenséges célpontokra.
unit.quell.description = Nagy hatótávolságú célkövető rakétát lő ki az ellenséges célpontokra. Elnyomja az ellenséges szerkezetjavító épületeket. Csak földi célpontokat támad. unit.quell.description = Instabil plazmapajzzsal felszerelt nagy hatótávolságú célkövető rakétákat lő ki az ellenséges célpontokra. Elnyomja az ellenséges szerkezetjavító épületeket. Csak földi célpontokat támad.
unit.disrupt.description = Nagy hatótávolságú célkövető elnyomó rakétát lő ki az ellenséges célpontokra. Elnyomja az ellenséges szerkezetjavító épületeket. Csak földi célpontokat támad. unit.disrupt.description = Nagy hatótávolságú célkövető elnyomó rakétát lő ki az ellenséges célpontokra. Elnyomja az ellenséges szerkezetjavító épületeket. Csak földi célpontokat támad.
unit.evoke.description = A bástya védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. unit.evoke.description = A bástya védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas.
unit.incite.description = A citadella védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. unit.incite.description = A citadella védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas.
unit.emanate.description = Az akropolisz védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas. unit.emanate.description = Az akropolisz védelmére szolgáló építményeket épít. Sugárral javítja az építményeket. 2×2-es épületek szállítására is alkalmas.
lst.read = Szám kiolvasása egy összekapcsolt memóriacellából. lst.read = Szám kiolvasása egy összekapcsolt memóriacellából.\nMás processzorokban lévő változókból is képes olvasni.
lst.write = Szám beírása egy összekapcsolt memóriacellába. lst.write = Szám beírása egy összekapcsolt memóriacellába.Más processzorokban lévő változókba is képes írni
lst.print = Szöveg hozzáadása a kiírási pufferhez.\nA [accent]Print Flush[] használatáig nem jelenít meg semmit. lst.print = Szöveg hozzáadása a kiírási pufferhez.\nA [accent]Print Flush[] használatáig nem jelenít meg semmit.
lst.printchar = Egy UTF-16 karakter vagy tartalmi ikon hozzáadása a nyomtatási pufferhez.\nNem jelenít meg semmit, amíg a [accent]Print Flush[] használatban van. lst.printchar = Egy UTF-16 karakter vagy tartalmi ikon hozzáadása a nyomtatási pufferhez.\nNem jelenít meg semmit, amíg a [accent]Print Flush[] használatban van.
lst.format = A szövegpufferben lévő következő helyőrző cseréje egy értékre.\nNem csinál semmit, ha a helyőrzőminta érvénytelen.\nHelyőrzőminta: „{[accent]number 0-9[]}”\nPélda:\n[accent]print „test {0}”\nformat „example” lst.format = A szövegpufferben lévő következő helyőrző cseréje egy értékre.\nNem csinál semmit, ha a helyőrzőminta érvénytelen.\nHelyőrzőminta: „{[accent]number 0-9[]}”\nPélda:\n[accent]print „test {0}”\nformat „example”
@@ -2489,7 +2493,7 @@ lst.explosion = Robbanás létrehozása az adott helyen.
lst.setrate = A processzor végrehajtási sebességének beállítása utasítás/órajelciklusban. lst.setrate = A processzor végrehajtási sebességének beállítása utasítás/órajelciklusban.
lst.fetch = Egységek, támaszpontok, játékosok, vagy épületek lekérdezése index szerint.\nAz indexek 0-tól indulnak és a visszaadott számuknál végződnek. lst.fetch = Egységek, támaszpontok, játékosok, vagy épületek lekérdezése index szerint.\nAz indexek 0-tól indulnak és a visszaadott számuknál végződnek.
lst.packcolor = Egyetlen számba tömöríti a [0, 1] RGBA komponenseket a rajzoláshoz vagy szabálymeghatározáshoz. lst.packcolor = Egyetlen számba tömöríti a [0, 1] RGBA komponenseket a rajzoláshoz vagy szabálymeghatározáshoz.
lst.unpackcolor = Unpack RGBA components from a color that was packed using Pack Color. lst.unpackcolor = RGBA komponensek kicsomagolása egy színből, amely a „Pack Color” segítségével lett becsomagolva.
lst.setrule = Játékszabály beállítása. lst.setrule = Játékszabály beállítása.
lst.flushmessage = Üzenet megjelenítése a képernyőn a szövegpufferből. Ha a sikeres válasz változója [accent]@wait[],\nakkor, megvárja, amíg az előző üzenet befejeződik.\nMáskülönben a kimenet független attól, hogy az üzenet megjelenítése sikeres volt-e. lst.flushmessage = Üzenet megjelenítése a képernyőn a szövegpufferből. Ha a sikeres válasz változója [accent]@wait[],\nakkor, megvárja, amíg az előző üzenet befejeződik.\nMáskülönben a kimenet független attól, hogy az üzenet megjelenítése sikeres volt-e.
lst.cutscene = A játékos kamerájának mozgatása. lst.cutscene = A játékos kamerájának mozgatása.
@@ -2566,8 +2570,8 @@ laccess.size = Egy egység vagy épület mérete, vagy egy karakterlánc hossza.
laccess.id = Egy egység/blokk/nyersanyag/folyadék azonosítója.\nEz a keresési művelet fordítottja. laccess.id = Egy egység/blokk/nyersanyag/folyadék azonosítója.\nEz a keresési művelet fordítottja.
laccess.displaywidth = Egy kijelzőblokk szélessége pixelben. laccess.displaywidth = Egy kijelzőblokk szélessége pixelben.
laccess.displayheight = Egy kijelzőblokk magassága pixelben. laccess.displayheight = Egy kijelzőblokk magassága pixelben.
laccess.bufferusage = A kijelző grafikus pufferében lévő feldolgozatlan parancsok száma. laccess.buffersize = A kijelző grafikus pufferében lévő feldolgozatlan parancsok száma.\nEgy üzenet tartalmának hossza.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = A blokkon végrehajtott műveletek száma.\nKijelzők esetén a drawflush-műveletek számát adja vissza.
lcategory.unknown = Ismeretlen lcategory.unknown = Ismeretlen
lcategory.unknown.description = Nem kategorizált utasítások. lcategory.unknown.description = Nem kategorizált utasítások.
@@ -2601,13 +2605,13 @@ lenum.always = Mindig igaz.
lenum.idiv = Egész osztás. lenum.idiv = Egész osztás.
lenum.div = Osztás.\nNullával való osztáskor a visszatérési érték [accent]null[]. lenum.div = Osztás.\nNullával való osztáskor a visszatérési érték [accent]null[].
lenum.mod = Modulo. lenum.mod = Modulo.
lenum.emod = True modulo, result is always positive. lenum.emod = Euklideszi modulo, az eredmény mindig pozitív.
lenum.equal = Egyenlő. Kényszeríti a típusokat.\nA nem null értékű objektumok értéke 1 lesz, egyébként 0. lenum.equal = Egyenlő. Kényszeríti a típusokat.\nA nem null értékű objektumok értéke 1 lesz, egyébként 0.
lenum.notequal = Nem egyenlő. Kényszeríti a típusokat. lenum.notequal = Nem egyenlő. Kényszeríti a típusokat.
lenum.strictequal = Szigorúan egyenlőség. Nem kényszeríti a típusokat.\nA [accent]null[] ellenőrzésére is használható. lenum.strictequal = Szigorúan egyenlőség. Nem kényszeríti a típusokat.\nA [accent]null[] ellenőrzésére is használható.
lenum.shl = Biteltolás balra. lenum.shl = Biteltolás balra.
lenum.shr = Biteltolás jobbra. lenum.shr = Biteltolás jobbra.
lenum.ushr = Unsigned bit-shift right. lenum.ushr = Előjel nélküli biteltolás jobbra.
lenum.or = Bitenkénti VAGY. lenum.or = Bitenkénti VAGY.
lenum.land = Logikai ÉS. lenum.land = Logikai ÉS.
lenum.and = Bitenkénti ÉS. lenum.and = Bitenkénti ÉS.
@@ -2722,7 +2726,7 @@ lenum.wave = Jelenlegi hullámszám. Bármi lehet a nem-hullámalapú játékmó
lenum.currentwavetime = Hullám-visszaszámlálás tickben. lenum.currentwavetime = Hullám-visszaszámlálás tickben.
lenum.waves = Független attól, hogy a hullámok egyáltalán elindíthatók-e. lenum.waves = Független attól, hogy a hullámok egyáltalán elindíthatók-e.
lenum.wavesending = Független attól, hogy a hullámok kézzel elindíthatók-e a lejátszásgombbal. lenum.wavesending = Független attól, hogy a hullámok kézzel elindíthatók-e a lejátszásgombbal.
lenum.attackmode = Meghatározza, hogy a játékmód támadó módban van-e. lenum.attackmode = Meghatározza, hogy a játékmód támadómódban van-e.
lenum.wavespacing = A hullámok közötti idő tickben. lenum.wavespacing = A hullámok közötti idő tickben.
lenum.enemycorebuildradius = Építési tilalmi zóna az ellenséges támaszpont körül. lenum.enemycorebuildradius = Építési tilalmi zóna az ellenséges támaszpont körül.
lenum.dropzoneradius = Az ellenséges hullámok ledobási zónájának sugara. lenum.dropzoneradius = Az ellenséges hullámok ledobási zónájának sugara.
@@ -2736,10 +2740,10 @@ lenum.unitdamage = Mennyi sebzést okoznak az egységek.
lenum.blockhealth = Mennyi életponttal indulnak az épületek. lenum.blockhealth = Mennyi életponttal indulnak az épületek.
lenum.blockdamage = Mennyi sebzést okoznak az épületek (lövegtornyok). lenum.blockdamage = Mennyi sebzést okoznak az épületek (lövegtornyok).
lenum.rtsminweight = Minimális „támadási súly” szükséges ahhoz, hogy egy osztag támadjon. Minél magasabb az érték, annál megfontoltabbak az egységek. lenum.rtsminweight = Minimális „támadási súly” szükséges ahhoz, hogy egy osztag támadjon. Minél magasabb az érték, annál megfontoltabbak az egységek.
lenum.rtsminsquad = A támadó osztagok minimális mérete. lenum.rtsminsquad = A támadóosztagok minimális mérete.
lenum.maparea = A játszható területe a pályának. Minden, ami a területen kívülre esik, nem lesz elérhető. lenum.maparea = A játszható területe a pályának. Minden, ami a területen kívülre esik, nem lesz elérhető.
lenum.ambientlight = Környezeti világítás színe. Akkor használható, amikor a világítás engedélyezve van. lenum.ambientlight = Környezeti világítás színe. Akkor használható, amikor a világítás engedélyezve van.
lenum.solarmultiplier = Megsokszorozza a napelemek teljesítményét. lenum.solarmultiplier = Megsokszorozza a napelemek teljesítményét.
lenum.dragmultiplier = Környezet-húzási szorzó. lenum.dragmultiplier = Környezethúzási szorzó.
lenum.ban = Épületek vagy egységek, amelyek nem építhetők meg vagy helyezhetők el a pályán. lenum.ban = Épületek vagy egységek, amelyek nem építhetők meg vagy helyezhetők el a pályán.
lenum.unban = Egy egység vagy épület újraengedélyezése. lenum.unban = Egy egység vagy épület újraengedélyezése.
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Mulai ulang mungkin diperlukan untuk mene
setting.fps.name = Tunjukkan FPS & Ping setting.fps.name = Tunjukkan FPS & Ping
setting.console.name = Hidupkan Konsol setting.console.name = Hidupkan Konsol
setting.smoothcamera.name = Kamera Halus setting.smoothcamera.name = Kamera Halus
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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Mode Pixel setting.pixelate.name = Mode Pixel
setting.minimap.name = Tunjukkan Peta Kecil setting.minimap.name = Tunjukkan Peta Kecil
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Gulir Pesan
keybind.chat_mode.name = Ubah Mode Pesan keybind.chat_mode.name = Ubah Mode Pesan
keybind.drop_unit.name = Turunkan Unit keybind.drop_unit.name = Turunkan Unit
keybind.zoom_minimap.name = Perbesar Peta Kecil keybind.zoom_minimap.name = Perbesar Peta Kecil
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Deskripsi mode permainan mode.help.title = Deskripsi mode permainan
mode.survival.name = Bertahan Hidup mode.survival.name = Bertahan Hidup
mode.survival.description = Mode normal. Sumber daya terbatas dan gelombang otomatis.\n[gray]Membutuhkan zona pendaratan musuh di dalam peta untuk bermain. mode.survival.description = Mode normal. Sumber daya terbatas dan gelombang otomatis.\n[gray]Membutuhkan zona pendaratan musuh di dalam peta untuk bermain.
@@ -2566,7 +2570,7 @@ laccess.size = Ukuran dari sebuah unit/bangunan atau panjang dari sebuah string.
laccess.id = ID suatu unit/blok/bahan/cairan.\nIni adalah kebalikan dari operasi pencarian. laccess.id = ID suatu unit/blok/bahan/cairan.\nIni adalah kebalikan dari operasi pencarian.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Tak Diketahui lcategory.unknown = Tak Diketahui
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Potrebbe essere necessario il riavvio.
setting.fps.name = Mostra FPS e Ping setting.fps.name = Mostra FPS e Ping
setting.console.name = Attiva Console setting.console.name = Attiva Console
setting.smoothcamera.name = Visuale fluida 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixellato setting.pixelate.name = Pixellato
setting.minimap.name = Mostra Minimappa setting.minimap.name = Mostra Minimappa
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Scorri Chat
keybind.chat_mode.name = Cambia modalità chat keybind.chat_mode.name = Cambia modalità chat
keybind.drop_unit.name = Lascia Materiali keybind.drop_unit.name = Lascia Materiali
keybind.zoom_minimap.name = Esegui Zoom Minimappa keybind.zoom_minimap.name = Esegui Zoom Minimappa
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Descrizione delle Modalità mode.help.title = Descrizione delle Modalità
mode.survival.name = Sopravvivenza mode.survival.name = Sopravvivenza
mode.survival.description = Modalità normale. Risorse limitate ed ondate in entrata automatiche. mode.survival.description = Modalità normale. Risorse limitate ed ondate in entrata automatiche.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = 再起動が必要になる場合があ
setting.fps.name = FPSを表示 setting.fps.name = FPSを表示
setting.console.name = コンソールを有効にする setting.console.name = コンソールを有効にする
setting.smoothcamera.name = スムーズなカメラ 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.
setting.vsync.name = 垂直同期 setting.vsync.name = 垂直同期
setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます) setting.pixelate.name = ピクセル化[lightgray] (アニメーションが無効化されます)
setting.minimap.name = ミニマップを表示 setting.minimap.name = ミニマップを表示
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = チャットスクロール
keybind.chat_mode.name = チャットモードの変更 keybind.chat_mode.name = チャットモードの変更
keybind.drop_unit.name = ユニット投下 keybind.drop_unit.name = ユニット投下
keybind.zoom_minimap.name = ミニマップのズーム keybind.zoom_minimap.name = ミニマップのズーム
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = モード説明 mode.help.title = モード説明
mode.survival.name = サバイバル mode.survival.name = サバイバル
mode.survival.description = 通常のモードです。資源も限られる中、自動的にウェーブが進行していきます。\n[gray]マップに敵の出現設定が必要です。 mode.survival.description = 通常のモードです。資源も限られる中、自動的にウェーブが進行していきます。\n[gray]マップに敵の出現設定が必要です。
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = 不明 lcategory.unknown = 不明
+37 -33
View File
@@ -378,8 +378,8 @@ stance.holdfire = 명령: 사격 중지
stance.pursuetarget = 명령: 타겟 추격 stance.pursuetarget = 명령: 타겟 추격
stance.patrol = 명령: 정찰 stance.patrol = 명령: 정찰
stance.ram = 명령 : 돌격\n[lightgray] 유닛이 장애물 여부를 확인하지 않고 일직선으로 이동합니다. stance.ram = 명령 : 돌격\n[lightgray] 유닛이 장애물 여부를 확인하지 않고 일직선으로 이동합니다.
stance.mineauto = Automatic Mining stance.mineauto = 자동 채굴
stance.mine = Mine Item: {0} stance.mine = 채굴 자원: {0}
openlink = 링크 열기 openlink = 링크 열기
copylink = 링크 복사 copylink = 링크 복사
back = 뒤로가기 back = 뒤로가기
@@ -525,7 +525,7 @@ details = 설명...
edit = 편집... edit = 편집...
variables = 변수 variables = 변수
logic.clear.confirm = 이 프로세서의 모든 코드를 삭제하시겠습니까? logic.clear.confirm = 이 프로세서의 모든 코드를 삭제하시겠습니까?
logic.restart = Restart logic.restart = 재시작
logic.globals = 내장 변수 logic.globals = 내장 변수
editor.name = 이름: editor.name = 이름:
@@ -793,7 +793,7 @@ sectors.wave = 단계:
sectors.stored = 저장량: sectors.stored = 저장량:
sectors.resume = 재개 sectors.resume = 재개
sectors.launch = 출격 sectors.launch = 출격
sectors.viewsubmission = \ue80d View Submissions sectors.viewsubmission = \ue80d 제출물 보기
sectors.select = 선택 sectors.select = 선택
sectors.launchselect = 발사 대상 선택 sectors.launchselect = 발사 대상 선택
sectors.nonelaunch = [lightgray]없음 (태양)[] sectors.nonelaunch = [lightgray]없음 (태양)[]
@@ -818,7 +818,7 @@ sector.changeicon = 아이콘 바꾸기
sector.noswitch.title = 지역 전환 불가능 sector.noswitch.title = 지역 전환 불가능
sector.noswitch = 기존 지역이 공격받는 동안은 지역을 전환할 수 없습니다.\n\n지역: [accent]{0}[] 중 [accent]{1}[] sector.noswitch = 기존 지역이 공격받는 동안은 지역을 전환할 수 없습니다.\n\n지역: [accent]{0}[] 중 [accent]{1}[]
sector.view = 지역 보기 sector.view = 지역 보기
sector.foundationrequired = [lightgray] Core: Foundation Required sector.foundationrequired = [lightgray] 코어: 기반 필요
threat.low = 낮음 threat.low = 낮음
threat.medium = 보통 threat.medium = 보통
@@ -869,10 +869,10 @@ sector.atolls.name = 환초섬
sector.testingGrounds.name = 시험장 sector.testingGrounds.name = 시험장
sector.seaPort.name = 바다 항구 sector.seaPort.name = 바다 항구
sector.weatheredChannels.name = 풍화된 수로 sector.weatheredChannels.name = 풍화된 수로
sector.mycelialBastion.name = 균사 요새 sector.mycelialBastion.name = 균사 성채
sector.frontier.name = 국경 지방 sector.frontier.name = 국경 지방
sector.cruxscape.name = 크럭스케이프 sector.cruxscape.name = 크럭스케이프
sector.geothermalStronghold.name = 지열 근거지 sector.geothermalStronghold.name = 지열 요새
sector.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지녔습니다. 적은 위협적이지 않지만, 자원도 풍부하진 않습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n이제 출격할 시간입니다. sector.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지녔습니다. 적은 위협적이지 않지만, 자원도 풍부하진 않습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n이제 출격할 시간입니다.
sector.frozenForest.description = 산과 가까운 이곳에도, 포자가 퍼졌습니다. 혹한의 추위조차 포자가 퍼지는 것을 억누를 수 없었습니다.\n화력 발전기를 건설하고, 멘더를 사용하는 방법을 배우세요. sector.frozenForest.description = 산과 가까운 이곳에도, 포자가 퍼졌습니다. 혹한의 추위조차 포자가 퍼지는 것을 억누를 수 없었습니다.\n화력 발전기를 건설하고, 멘더를 사용하는 방법을 배우세요.
@@ -1009,7 +1009,7 @@ stat.itemsmoved = 이동 속도
stat.launchtime = 출격 간격 stat.launchtime = 출격 간격
stat.shootrange = 사거리 stat.shootrange = 사거리
stat.size = 크기 stat.size = 크기
stat.displaysize = 화면 크기 stat.displaysize = 최대 화면 크기
stat.liquidcapacity = 액체 용량 stat.liquidcapacity = 액체 용량
stat.powerrange = 전선 길이 stat.powerrange = 전선 길이
stat.linkrange = 연결 길이 stat.linkrange = 연결 길이
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = 적용하려면 재시작이 필요할
setting.fps.name = FPS와 핑 표시 setting.fps.name = FPS와 핑 표시
setting.console.name = 콘솔 활성화 setting.console.name = 콘솔 활성화
setting.smoothcamera.name = 부드러운 시점 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.
setting.vsync.name = 수직 동기화 setting.vsync.name = 수직 동기화
setting.pixelate.name = 픽셀화 setting.pixelate.name = 픽셀화
setting.minimap.name = 미니맵 표시 setting.minimap.name = 미니맵 표시
@@ -1364,8 +1366,8 @@ keybind.pick.name = 블록 선택
keybind.break_block.name = 블록 파괴 keybind.break_block.name = 블록 파괴
keybind.select_all_units.name = 전체 유닛 선택 keybind.select_all_units.name = 전체 유닛 선택
keybind.select_all_unit_factories.name = 전체 유닛 공장 선택 keybind.select_all_unit_factories.name = 전체 유닛 공장 선택
keybind.select_all_unit_transport.name = Select All Unit Transports keybind.select_all_unit_transport.name = 전체 유닛 수송 선택
keybind.select_across_screen.name = Select Across Screen (Hold) keybind.select_across_screen.name = 화면 전체 선택 (홀드)
keybind.deselect.name = 선택 해제 keybind.deselect.name = 선택 해제
keybind.pickupCargo.name = 화물 집기 keybind.pickupCargo.name = 화물 집기
keybind.dropCargo.name = 화물 내려놓기 keybind.dropCargo.name = 화물 내려놓기
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = 채팅 스크롤
keybind.chat_mode.name = 채팅 모드 변경 keybind.chat_mode.name = 채팅 모드 변경
keybind.drop_unit.name = 유닛 내려놓기 keybind.drop_unit.name = 유닛 내려놓기
keybind.zoom_minimap.name = 미니맵 확대 keybind.zoom_minimap.name = 미니맵 확대
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = 모드 설명 mode.help.title = 모드 설명
mode.survival.name = 생존 mode.survival.name = 생존
mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적 스폰지점이 필요합니다. mode.survival.description = 기본 모드. 제한된 자원이 있으며, 단계가 자동으로 시작합니다.\n[gray]플레이하려면 맵에 적 스폰지점이 필요합니다.
@@ -1406,7 +1410,7 @@ mode.custom = 사용자 정의 규칙
rules.invaliddata = 잘못된 클립보드 데이터 입니다. rules.invaliddata = 잘못된 클립보드 데이터 입니다.
rules.hidebannedblocks = 금지된 블록 숨기기 rules.hidebannedblocks = 금지된 블록 숨기기
rules.infiniteresources = 무한 자원 rules.infiniteresources = 무한 자원
rules.fillitems = Fill Core With Items rules.fillitems = 코어를 자원으로 채움
rules.onlydepositcore = 오직 코어에만 투입 가능 rules.onlydepositcore = 오직 코어에만 투입 가능
rules.derelictrepair = 잔해 블록 수리 허용 rules.derelictrepair = 잔해 블록 수리 허용
rules.reactorexplosions = 원자로 폭발 허용 rules.reactorexplosions = 원자로 폭발 허용
@@ -1421,8 +1425,8 @@ rules.alloweditworldprocessors = 월드 프로세서 편집 허용
rules.alloweditworldprocessors.info = 이 기능을 활성화하면 편집기 외부에서도 월드 로직 블록을 배치하고 편집할 수 있습니다. rules.alloweditworldprocessors.info = 이 기능을 활성화하면 편집기 외부에서도 월드 로직 블록을 배치하고 편집할 수 있습니다.
rules.waves = 단계 rules.waves = 단계
rules.airUseSpawns = 공중 유닛 스폰 지점 사용 rules.airUseSpawns = 공중 유닛 스폰 지점 사용
rules.wavespawnatcores = Waves Spawn At Cores rules.wavespawnatcores = 적 코어 근처에 스폰
rules.wavespawnatcores.info = When enabled in attack mode, waves spawn near all enemy cores. rules.wavespawnatcores.info = 공격 모드에서 활성화되면 모든 적 코어 근처에서 적이 스폰됩니다.
rules.attack = 공격 모드 rules.attack = 공격 모드
rules.buildai = 기지 건설 AI rules.buildai = 기지 건설 AI
rules.buildaitier = 건설 AI 등급 rules.buildaitier = 건설 AI 등급
@@ -2024,19 +2028,19 @@ hint.unitControl = 아군 유닛과 포탑을 조종하려면 [accent][[왼쪽 c
hint.unitControl.mobile = 아군 유닛과 포탑을 조종하려면 해당 개체를 [accent]빠르게 두 번 누르십시오[]. hint.unitControl.mobile = 아군 유닛과 포탑을 조종하려면 해당 개체를 [accent]빠르게 두 번 누르십시오[].
hint.unitSelectControl = 유닛을 조종하려면, [accent]왼쪽 shift[]를 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 누르거나 끌어서 유닛을 선택합니다. [accent]우클릭[]으로 유닛에게 이동과 공격을 명령할 수 있습니다. hint.unitSelectControl = 유닛을 조종하려면, [accent]왼쪽 shift[]를 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 누르거나 끌어서 유닛을 선택합니다. [accent]우클릭[]으로 유닛에게 이동과 공격을 명령할 수 있습니다.
hint.unitSelectControl.mobile = 유닛을 조종하려면, 왼쪽 아래에 있는 [accent]명령[]을 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 길게 누르거나 끌어서 유닛을 선택합니다. 눌러서 유닛에게 이동과 공격을 명령할 수 있습니다. hint.unitSelectControl.mobile = 유닛을 조종하려면, 왼쪽 아래에 있는 [accent]명령[]을 눌러 [accent]명령 모드[]를 활성화하시오.\n명령 모드가 활성화되어 있을 때 길게 누르거나 끌어서 유닛을 선택합니다. 눌러서 유닛에게 이동과 공격을 명령할 수 있습니다.
hint.launch = 충분한 자원을 모았으면, 오른쪽 아래의 \ue827 [accent]지도[]에서 주변 지역을 선택해서 [accent]출격[]할 수 있습니다. hint.launch = 충분한 자원을 모았으면, 오른쪽 하단에 \ue827 [accent]지도[]에서 주변 지역을 선택해서 [accent]출격[]할 수 있습니다.
hint.launch.mobile = 충분한 자원을 모았으면, 오른쪽 아래의 \ue88c [accent]메뉴[]에 있는 \ue827 [accent]지도[]에서 주변 지역을 선택해서 [accent]출격[]할 수 있습니다. hint.launch.mobile = 충분한 자원을 모았으면, 왼쪽 상단에 \ue88c [accent]메뉴[]에 있는 \ue827 [accent]지도[]에서 주변 지역을 선택해서 [accent]출격[]할 수 있습니다.
hint.schematicSelect = [accent][[F][]를 누른 채로 끌어서 복사하고 붙여넣을 블록을 선택하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다. hint.schematicSelect = [accent][[F][]를 누른 채로 끌어서 복사하고 붙여넣을 블록을 선택하십시오. \n\n [accent][[마우스 휠][]을 누르면 한 개의 블록만 복사할 수 있습니다.
hint.rebuildSelect = [accent][[B][]를 누르고 끌어서 파괴된 블록 흔적을 선택하세요.\n선택된 블록은 자동으로 복구됩니다. hint.rebuildSelect = [accent][[B][]를 누르고 끌어서 파괴된 블록 흔적을 선택하세요.\n선택된 블록은 자동으로 복구됩니다.
hint.rebuildSelect.mobile = 복사버튼 \ue874 을 선택하시고, 재건축 버튼 \ue80f 을 탭 하신 뒤, 드래그 하여 블록 흔적을 선택하세요. 선택된 블록은 자동으로 복구됩니다. hint.rebuildSelect.mobile = 복사 버튼 \ue874 을 선택하시고, 재건축 버튼 \ue80f 을 탭 하신 뒤, 드래그 하여 블록 흔적을 선택하세요. 선택된 블록은 자동으로 복구됩니다.
hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다. hint.conveyorPathfind = [accent][[왼쪽 Ctrl][]을 누른 채로 컨베이어를 대각선으로 끌면 길을 자동으로 만들어줍니다.
hint.conveyorPathfind.mobile = \ue844 [accent]대각 모드[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다. hint.conveyorPathfind.mobile = \ue844 [accent]대각 모드[]를 활성화하고 컨베이어를 대각선으로 끌면 길을 자동으로 찾아줍니다.
hint.boost = [accent][[왼쪽 Shift][]를 눌러 탑승한 유닛으로 장애물을 넘을 수 있습니다. \n\n 일부 지상 유닛만 이륙할 수 있습니다. hint.boost = [accent][[왼쪽 Shift][]를 눌러 탑승한 유닛으로 장애물을 넘을 수 있습니다. \n\n 일부 지상 유닛만 이륙할 수 있습니다.
hint.payloadPickup = 작은 블록이나 유닛을 집으려면 [accent][[[]를 누르십시오. hint.payloadPickup = 작은 블록이나 유닛을 집으려면 해당 블록/유닛 위에 있는 상태에서 [accent][[]를 누르십시오.
hint.payloadPickup.mobile = 작은 블록이나 유닛을 집으려면 [accent]잠깐 누르십시오[]. hint.payloadPickup.mobile = 작은 블록이나 유닛을 집으려면 해당 블록/유닛을 [accent]잠깐 누르십시오[].
hint.payloadDrop = 다시 내려놓으려면 [accent]][]를 누르십시오. hint.payloadDrop = 다시 내려놓으려면 빈 공간에서 [accent]][]를 누르십시오.
hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 [accent]화면을 잠깐 누르십시오[]. hint.payloadDrop.mobile = 다시 내려놓으려면 빈 공간에서 두고 싶은 곳을 [accent]잠깐 누르십시오[].
hint.waveFire = [accent]파도[] 포탑에 물을 공급하면 주변에 발생한 화재를 자동으로 진압합니다. hint.waveFire = [accent]웨이브[] 포탑에 물을 공급하면 주변에 발생한 화재를 자동으로 진압합니다.
hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]전력 노드[]를 활용하십시오. hint.generator = \uf879 [accent]화력 발전기[]는 석탄을 태워서 주변 블록에 전력을 전달합니다.\n\n \uf87f 더 넓은 범위의 블록에 전력을 전달하려면 [accent]전력 노드[]를 활용하십시오.
hint.guardian = [accent]수호자[] 유닛은 높은 체력과 방어력을 가졌습니다. [accent]구리[]와 [accent]납[]처럼 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n수호자를 제거하려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오. hint.guardian = [accent]수호자[] 유닛은 높은 체력과 방어력을 가졌습니다. [accent]구리[]와 [accent]납[]처럼 약한 탄약으로는 [scarlet]아무런 효과도 없습니다[].\n\n수호자를 제거하려면 높은 단계의 포탑 또는 \uf835 [accent]흑연[]을 탄약으로 넣은 \uf861듀오/\uf859살보를 사용하십시오.
hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치[]하여 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지 확인하십시오. hint.coreUpgrade = 코어는 [accent]상위 코어를 위에 설치[]하여 업그레이드할 수 있습니다.\n\n [accent]기반[] 코어를 [accent]조각[] 코어 위에 설치하십시오. 주변에 장애물이 없는지 확인하십시오.
@@ -2048,8 +2052,8 @@ hint.factoryControl.mobile = 유닛 공장의 [accent]출력 목적지[]를 설
gz.mine = 주변 땅에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 클릭해서 채굴을 시작하세요. gz.mine = 주변 땅에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 클릭해서 채굴을 시작하세요.
gz.mine.mobile = 주변 땅에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요. gz.mine.mobile = 주변 땅에 있는 \uf8c4 [accent]구리 광석[]으로 이동하고, 광석을 눌러서 채굴을 시작하세요.
gz.research = 오른쪽 하단에 \ue875 연구 기록을 클릭하거나 [J]키를 눌러 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 연구 기록을 닫아서 오른쪽 아래에 있는 메뉴에서 해당 드릴을 선택하세요.\n구리 광석 위에 클릭해서 배치합니다.\n(만약 바로 건설되는게 불편하다면, 설정에서 건설 자동 일시정지를 킬 수 있습니다.)[] gz.research = 오른쪽 하단에 \ue875 연구 기록을 클릭하거나 'J'키를 눌러 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 연구 기록을 닫은 후, 오른쪽 아래에 있는 블록 메뉴에서 [accent]드릴 아이콘의 카테고리[]를 클릭하고, 해당 드릴을 선택하세요.\n구리 광석 위에 클릭해서 배치합니다.\n(만약 바로 건설되는게 불편하다면, 설정에서 건설 자동 일시정지를 킬 수 있습니다.)[]
gz.research.mobile = 왼쪽 상단에 \ue875 연구 기록을 눌러 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 연구 메뉴를 닫아서 오른쪽 아래에 있는 블록 메뉴에 해당 드릴을 선택하세요.\n구리 광석 위에 눌러서 배치합니다.\n\n오른쪽 아래 \ue800 [accent]체크마크[]를 눌러 확정지으세요. gz.research.mobile = 왼쪽 상단에 \ue875 연구 기록을 눌러 여세요.\n\uf870 [accent]기계식 드릴[]을 연구하고, 그 후 연구 메뉴를 닫아서 오른쪽 아래에 있는 블록 메뉴에 [accent]드릴 아이콘의 카테고리[]를 누르고, 해당 드릴을 선택하세요.\n구리 광석 위에 눌러서 배치합니다.\n\n오른쪽 아래 \ue800 [accent]체크마크[]를 눌러 확정지으세요.
gz.conveyors = \uf896 이제 연구 기록을 다시 열어 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n컨베이어를 선택하고, 클릭하고 드래그해서 컨베이어를 길게 배치하세요.\n[accent]스크롤[]로 방향을 회전할 수 있습니다.\n자원이 부족하면 연구나 건설이 불가능해지니 참고해주세요. gz.conveyors = \uf896 이제 연구 기록을 다시 열어 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n컨베이어를 선택하고, 클릭하고 드래그해서 컨베이어를 길게 배치하세요.\n[accent]스크롤[]로 방향을 회전할 수 있습니다.\n자원이 부족하면 연구나 건설이 불가능해지니 참고해주세요.
gz.conveyors.mobile = \uf896 이제 연구 기록을 다시 열어 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n손가락을 길게 누르고 끌어서 컨베이어를 길게 배치하세요.\n자원이 부족하면 연구나 건설이 불가능해지니 참고해주세요. gz.conveyors.mobile = \uf896 이제 연구 기록을 다시 열어 [accent]컨베이어[]를 연구하고 배치하여 채굴된 자원을 운반하세요.\n드릴에서 코어로 말이죠.\n\n손가락을 길게 누르고 끌어서 컨베이어를 길게 배치하세요.\n자원이 부족하면 연구나 건설이 불가능해지니 참고해주세요.
gz.drills = 채굴 작업을 확장하세요.\n기계식 드릴을 더 배치하세요.\n[accent]새 목표:[] 드릴로 구리를 채굴하고 컨베이어를 이용해 [accent]구리 100개[]를 코어로 운반하기. gz.drills = 채굴 작업을 확장하세요.\n기계식 드릴을 더 배치하세요.\n[accent]새 목표:[] 드릴로 구리를 채굴하고 컨베이어를 이용해 [accent]구리 100개[]를 코어로 운반하기.
@@ -2065,11 +2069,11 @@ gz.supplyturret = [accent]보급 포탑
gz.zone1 = 이건 적의 착륙 지점입니다. gz.zone1 = 이건 적의 착륙 지점입니다.
gz.zone2 = 반경에 세워진 모든 것은 단계가 시작되면 파괴됩니다. gz.zone2 = 반경에 세워진 모든 것은 단계가 시작되면 파괴됩니다.
gz.zone3 = 단계가 지금 시작됩니다.\n준비하세요. gz.zone3 = 단계가 지금 시작됩니다.\n준비하세요.
gz.finish = 포탑을 더 건설하고, 자원을 더 채굴하고,\n그리고 모든 단계를 막아내어 [accent]지역을 점령[]하세요. 이것으로 튜토리얼을 마칩니다. 행운을 빕니다. gz.finish = 포탑을 더 건설하고, 자원을 더 채굴하고,\n그리고 모든 단계를 막아내어 [accent]지역을 점령[]하세요. 이것으로 튜토리얼을 마칩니다. 행운을 빕니다.
onset.mine = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 클릭하여 채굴하세요.\n\n[accent][WASD]로 움직이세요. onset.mine = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 클릭하여 채굴하세요.\n\n[accent][WASD]로 움직이세요.
onset.mine.mobile = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 눌러서 채굴하세요. onset.mine.mobile = 벽에 붙어있는 \uf748 [accent]베릴륨[]을 눌러서 채굴하세요.
onset.research = \ue875 연구 기록을 여세요.\n \uf73e [accent]터빈 응결기[]를 연구하고, 연구 기록을 다시 닫은 다음, 구덩이 위에 배치하세요.\n[accent]전력[]을 생산합니다. onset.research = \ue875 연구 기록을 여세요.\n \uf73e [accent]터빈 응결기[]를 연구하고, 연구 기록을 다시 닫은 다음, 구덩이 위에 배치하세요.\n터빈 응결기는 [accent]전력[]을 생산합니다.
onset.bore = 다시 연구 기록을 열어 \uf741 [accent]플라즈마 채광기[]를 연구하고 배치하세요.\n벽으로부터 자동으로 자원을 채굴합니다. onset.bore = 다시 연구 기록을 열어 \uf741 [accent]플라즈마 채광기[]를 연구하고 배치하세요.\n벽으로부터 자동으로 자원을 채굴합니다.
onset.power = [accent]전력[]을 플라즈마 채광기로 전달하기 위해선, \uf73d [accent]빔 노드[]를 연구하고 배치하세요.\n터빈 응결기와 플라즈마 채광기를 연결하세요. onset.power = [accent]전력[]을 플라즈마 채광기로 전달하기 위해선, \uf73d [accent]빔 노드[]를 연구하고 배치하세요.\n터빈 응결기와 플라즈마 채광기를 연결하세요.
onset.ducts = \uf799 [accent]도관[]을 연구하고 배치하여 플라즈마 채광기에서 채굴한 자원을 코어로 운반하세요.\n클릭하고 끌어서 도관을 길게 연결하세요.\n[accent]스크롤해서[]해서 방향을 회전할 수 있습니다. onset.ducts = \uf799 [accent]도관[]을 연구하고 배치하여 플라즈마 채광기에서 채굴한 자원을 코어로 운반하세요.\n클릭하고 끌어서 도관을 길게 연결하세요.\n[accent]스크롤해서[]해서 방향을 회전할 수 있습니다.
@@ -2088,16 +2092,16 @@ onset.enemies = 적이 다가옵니다, 방어 태세를 갖추세요.
onset.defenses = [accent]방어 태세 갖추기:[lightgray] {0} onset.defenses = [accent]방어 태세 갖추기:[lightgray] {0}
onset.attack = 적은 취약한 상태입니다. 반격하세요. onset.attack = 적은 취약한 상태입니다. 반격하세요.
onset.cores = 새로운 코어는 [accent]코어 타일[]위에 배치할 수 있습니다.\n새로운 코어는 전진기지 역할을 하며 다른 코어와 저장된 자원을 공유합니다.\n \uf725 코어를 배치하세요. onset.cores = 새로운 코어는 [accent]코어 타일[]위에 배치할 수 있습니다.\n새로운 코어는 전진기지 역할을 하며 다른 코어와 저장된 자원을 공유합니다.\n \uf725 코어를 배치하세요.
onset.detect = 적은 2분 이내에 당신을 지할 것입니다.\n생산, 채굴, 방어시설을 구성하세요. onset.detect = 적은 2분 이내에 당신을 지할 것입니다.\n생산, 채굴, 방어시설을 구성하세요.
onset.commandmode = [accent]shift[]를 눌러 [accent]명령 모드[]를 활성화하세요.\n[accent]좌클릭과 드래그[]로 유닛을 선택하세요.\n[accent]우클릭[]으로 선택된 유닛들에게 이동 또는 공격 명령을 내리세요. onset.commandmode = [accent]shift[]를 눌러 [accent]명령 모드[]를 활성화하세요.\n[accent]좌클릭과 드래그[]로 유닛을 선택하세요.\n[accent]우클릭[]으로 선택된 유닛들에게 이동 또는 공격 명령을 내리세요.
onset.commandmode.mobile = [accent]명령 버튼[]을 눌러 [accent]명령 모드[]를 활성화하세요.\n손가락을 꾹 누르고, [accent]드래그[]해서 유닛을 선택하세요.\n[accent]눌러서[] 선택된 유닛들에게 이동 또는 공격 명령을 내리세요. 이것으로 에르키아의 튜토리얼을 마칩니다. 행운을 빕니다. onset.commandmode.mobile = [accent]명령 버튼[]을 눌러 [accent]명령 모드[]를 활성화하세요.\n손가락을 꾹 누르고, [accent]드래그[]해서 유닛을 선택하세요.\n[accent]눌러서[] 선택된 유닛들에게 이동 또는 공격 명령을 내리세요.
aegis.tungsten = 텅스텐을 채굴하려면 [accent]충격 드릴[]이 필요합니다.\n 충격 드릴은[accent]물[]과 [accent]전력[]을 필요로 합니다. aegis.tungsten = 텅스텐을 채굴하려면 [accent]충격 드릴[]이 필요합니다.\n 충격 드릴은[accent]물[]과 [accent]전력[]을 필요로 합니다.
split.pickup = 일부 블록은 코어 유닛으로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(화물을 집어올리거나 내리는 기본 키는 [ 그리고 ]입니다.) split.pickup = 일부 블록은 코어 유닛으로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(화물을 집어올리거나 내리는 기본 키는 '[', 그리고 ']' 입니다.)
split.pickup.mobile = 일부 블록은 코어 유닛으로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(무언가를 집어올리거나 내려놓으려면, 길게 누르세요.) split.pickup.mobile = 일부 블록은 코어 유닛으로 집어올릴 수 있습니다.\n이 [accent]컨테이너[]를 집어올리고 [accent]화물 로더[] 속에 내려놓으세요.\n(무언가를 집어올리거나 내려놓으려면, 해당 블록을 길게 누르세요.)
split.acquire = 유닛을 생산하려면 텅스텐을 채굴해야 합니다. split.acquire = 유닛을 생산하려면 텅스텐을 채굴해야 합니다.
split.build = 유닛을 벽의 반대편으로 운반해야 합니다.\n두 개의 [accent]화물 매스 드라이버[]를 각 벽면에 하나씩 배치하세요.\n둘 중 하나를 누른 다음 다른 하나를 선택하여 연결을 설정합니다. split.build = 유닛을 벽의 반대편으로 운반해야 합니다.\n두 개의 [accent]화물 매스 드라이버[]를 각 벽면에 하나씩 배치하세요.\n둘 중 하나를 누른 다음 다른 하나를 선택하여 연결을 설정합니다.
split.container = 컨테이너와 마찬가지로, 유닛도 [accent]화물 매스 드라이버[]를 사용하여 운송할 수 있습니다.\n유닛 조립대를 매스 드라이버 근처에 배치하여 유닛을 적재한 후, 벽을 가로질러 보내 적 기지를 공격하게 만듭니다. split.container = 컨테이너와 마찬가지로, 유닛도 [accent]화물 매스 드라이버[]를 사용하여 운송할 수 있습니다.\n유닛 조립대를 매스 드라이버 근처에 배치하여 유닛을 적재한 후, 벽을 가로질러 보내 적 기지를 공격하게 만드세요.
item.copper.description = 모든 종류의 구조물 및 탄약으로 사용하는 기본 자원입니다. item.copper.description = 모든 종류의 구조물 및 탄약으로 사용하는 기본 자원입니다.
item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포되어 있습니다. 기본적으로 보강하지 않는 한 구조적으로 약합니다. item.copper.details = 평범한 구리. 세르플로에 비정상적으로 많이 분포되어 있습니다. 기본적으로 보강하지 않는 한 구조적으로 약합니다.
@@ -2489,7 +2493,7 @@ lst.explosion = 특정 위치에 폭발을 생성합니다.
lst.setrate = 프로세서 실행 속도를 틱당 연산량으로 설정합니다. lst.setrate = 프로세서 실행 속도를 틱당 연산량으로 설정합니다.
lst.fetch = 유닛, 코어, 플레이어 또는 건물을 엔티티 번호로 조회합니다.\n번호는 0에서 시작하여 엔티티 번호-1에서 끝납니다. lst.fetch = 유닛, 코어, 플레이어 또는 건물을 엔티티 번호로 조회합니다.\n번호는 0에서 시작하여 엔티티 번호-1에서 끝납니다.
lst.packcolor = 그리기 혹은 규칙 설정을 위해 [0, 1] RGBA 단일 요소로 묶습니다. lst.packcolor = 그리기 혹은 규칙 설정을 위해 [0, 1] RGBA 단일 요소로 묶습니다.
lst.unpackcolor = Unpack RGBA components from a color that was packed using Pack Color. lst.unpackcolor = Pack Color를 사용하여 패킹된 색상에서 RGBA 구성 요소를 압축 해제합니다.
lst.setrule = 게임 규칙을 설정합니다. lst.setrule = 게임 규칙을 설정합니다.
lst.flushmessage = 텍스트 버퍼로부터 화면에 메세지를 표시합니다.\n이전 메세지가 완료될 때까지 기다립니다. lst.flushmessage = 텍스트 버퍼로부터 화면에 메세지를 표시합니다.\n이전 메세지가 완료될 때까지 기다립니다.
lst.cutscene = 플레이어 카메라를 조작합니다. lst.cutscene = 플레이어 카메라를 조작합니다.
@@ -2566,8 +2570,8 @@ laccess.size = 유닛/건물의 크기 또는 줄의 길이.
laccess.id = 유닛/블록/아이템/액체의 ID.\n이것은 조회 작업의 역순입니다. laccess.id = 유닛/블록/아이템/액체의 ID.\n이것은 조회 작업의 역순입니다.
laccess.displaywidth = 디스플레이 블록의 픽셀 단위 너비. laccess.displaywidth = 디스플레이 블록의 픽셀 단위 너비.
laccess.displayheight = 디스플레이 블록의 픽셀 단위 높이. laccess.displayheight = 디스플레이 블록의 픽셀 단위 높이.
laccess.bufferusage = 디스플레이의 그래픽 버퍼에 있는 처리되지 않은 명령의 수. laccess.buffersize = 디스플레이의 그래픽 버퍼에 있는 처리되지 않은 명령의 수.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = 블록에서 수행된 작업 수입니다.\n디스플레이의 경우, drawflush 작업 수를 반환합니다.
lcategory.unknown = 알 수 없음 lcategory.unknown = 알 수 없음
lcategory.unknown.description = 분류되지 않은 설명 lcategory.unknown.description = 분류되지 않은 설명
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Rodyti FPS ir Ping setting.fps.name = Rodyti FPS ir Ping
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pikseliavimas setting.pixelate.name = Pikseliavimas
setting.minimap.name = Rodyti Mini Žemėlapį setting.minimap.name = Rodyti Mini Žemėlapį
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Pokalbių Slinktis
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Išmesti Vienetą keybind.drop_unit.name = Išmesti Vienetą
keybind.zoom_minimap.name = Keisti Mini Žemėlapio Mastelį keybind.zoom_minimap.name = Keisti Mini Žemėlapio Mastelį
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Modifikacijų Aprašymai mode.help.title = Modifikacijų Aprašymai
mode.survival.name = Išgyvenimas mode.survival.name = Išgyvenimas
mode.survival.description = Normalus režimas. Riboti resursai ir automatinės priešų bangos.\n[gray]Privalomos priešų atsiradimo zonos žemėlapyje. mode.survival.description = Normalus režimas. Riboti resursai ir automatinės priešų bangos.\n[gray]Privalomos priešų atsiradimo zonos žemėlapyje.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Een herstart kan vereist zijn om de wijzi
setting.fps.name = Toon FPS setting.fps.name = Toon FPS
setting.console.name = Console Inschakelen setting.console.name = Console Inschakelen
setting.smoothcamera.name = Vloeiende Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Verpixel Spel [lightgray](mogelijk verminderde performance) setting.pixelate.name = Verpixel Spel [lightgray](mogelijk verminderde performance)
setting.minimap.name = Toon Minimap setting.minimap.name = Toon Minimap
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat Scroll
keybind.chat_mode.name = Verander Chatmodus keybind.chat_mode.name = Verander Chatmodus
keybind.drop_unit.name = Laat Eenheid Vallen keybind.drop_unit.name = Laat Eenheid Vallen
keybind.zoom_minimap.name = Zoom Minimap keybind.zoom_minimap.name = Zoom Minimap
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Beschrijving van Modi mode.help.title = Beschrijving van Modi
mode.survival.name = Overleving mode.survival.name = Overleving
mode.survival.description = De normale modus. Standaard grondstoffen en automatisch inkomende golven van vijanden. mode.survival.description = De normale modus. Standaard grondstoffen en automatisch inkomende golven van vijanden.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Show FPS setting.fps.name = Show FPS
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelate [lightgray](may decrease performance, disables animations) setting.pixelate.name = Pixelate [lightgray](may decrease performance, disables animations)
setting.minimap.name = Show Minimap setting.minimap.name = Show Minimap
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat scroll
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Drop Unit keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom minimap keybind.zoom_minimap.name = Zoom minimap
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Description of modes mode.help.title = Description of modes
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.survival.description = The normal mode. Limited resources and automatic incoming waves.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart może być wymagany, aby zastowas
setting.fps.name = Pokazuj FPS oraz ping setting.fps.name = Pokazuj FPS oraz ping
setting.console.name = Włącz konsolę setting.console.name = Włącz konsolę
setting.smoothcamera.name = Płynna kamera setting.smoothcamera.name = Płynna 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.
setting.vsync.name = Synchronizacja pionowa setting.vsync.name = Synchronizacja pionowa
setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje) setting.pixelate.name = Pikselacja [lightgray](wyłącza animacje)
setting.minimap.name = Pokaż minimapę setting.minimap.name = Pokaż minimapę
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Przewijaj Wiadomości
keybind.chat_mode.name = Zmień tryb czatu keybind.chat_mode.name = Zmień tryb czatu
keybind.drop_unit.name = Wyrzucanie przedmiot keybind.drop_unit.name = Wyrzucanie przedmiot
keybind.zoom_minimap.name = Powiększenie mapy keybind.zoom_minimap.name = Powiększenie mapy
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Opis trybów mode.help.title = Opis trybów
mode.survival.name = Przeżycie mode.survival.name = Przeżycie
mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników.\n[gray]Wymaga punktów spawnu wroga na mapie, aby móc grać w tym trybie. mode.survival.description = Zwykły tryb. Limitowane surowce i fale przeciwników.\n[gray]Wymaga punktów spawnu wroga na mapie, aby móc grać w tym trybie.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID jednostki/bloku/przedmiotu/płynu.\nOdwrotnośc operacji wyszukiwania. laccess.id = ID jednostki/bloku/przedmiotu/płynu.\nOdwrotnośc operacji wyszukiwania.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Inne lcategory.unknown = Inne
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Pode ser necessário reiniciar para aplic
setting.fps.name = Mostrar FPS e Ping setting.fps.name = Mostrar FPS e Ping
setting.console.name = Ativar console setting.console.name = Ativar console
setting.smoothcamera.name = Suavizar movimentos da câmera setting.smoothcamera.name = Suavizar movimentos da câmera
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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelizado [lightgray](Pode diminuir a performace) setting.pixelate.name = Pixelizado [lightgray](Pode diminuir a performace)
setting.minimap.name = Mostrar minimapa setting.minimap.name = Mostrar minimapa
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Rolar chat
keybind.chat_mode.name = Mudar modo do chat keybind.chat_mode.name = Mudar modo do chat
keybind.drop_unit.name = Soltar unidade keybind.drop_unit.name = Soltar unidade
keybind.zoom_minimap.name = Ampliar minimapa keybind.zoom_minimap.name = Ampliar minimapa
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Descrição dos modos mode.help.title = Descrição dos modos
mode.survival.name = Sobrevivência mode.survival.name = Sobrevivência
mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. mode.survival.description = O modo normal. Recursos limitados e hordas automáticas.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Desconhecido lcategory.unknown = Desconhecido
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Pode ser necessário reiniciar para aplic
setting.fps.name = Mostrar FPS e Ping setting.fps.name = Mostrar FPS e Ping
setting.console.name = Ativar Consola setting.console.name = Ativar Consola
setting.smoothcamera.name = Câmara Suave 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.
setting.vsync.name = Sincronização Vertical (VSync) setting.vsync.name = Sincronização Vertical (VSync)
setting.pixelate.name = Pixelização setting.pixelate.name = Pixelização
setting.minimap.name = Mostrar Minimapa setting.minimap.name = Mostrar Minimapa
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Percorrer Chat
keybind.chat_mode.name = Mudar Modo de Chat keybind.chat_mode.name = Mudar Modo de Chat
keybind.drop_unit.name = Largar Unidade keybind.drop_unit.name = Largar Unidade
keybind.zoom_minimap.name = Zoom do Minimapa keybind.zoom_minimap.name = Zoom do Minimapa
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Descrição dos mods mode.help.title = Descrição dos mods
mode.survival.name = Sobrevivência mode.survival.name = Sobrevivência
mode.survival.description = O modo padrão. Recursos limitados e hordas automáticas. mode.survival.description = O modo padrão. Recursos limitados e hordas automáticas.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Desconhecido lcategory.unknown = Desconhecido
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Repornirea poate fi necesară pt a aplica
setting.fps.name = Vezi FPS & Ping setting.fps.name = Vezi FPS & Ping
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Cameră Graduală 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelează setting.pixelate.name = Pixelează
setting.minimap.name = Vezi Miniharta setting.minimap.name = Vezi Miniharta
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Scroll Chat
keybind.chat_mode.name = Schimbă Modul Chatului keybind.chat_mode.name = Schimbă Modul Chatului
keybind.drop_unit.name = Lasă Unitatea keybind.drop_unit.name = Lasă Unitatea
keybind.zoom_minimap.name = Zoom Minihartă keybind.zoom_minimap.name = Zoom Minihartă
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Descrierea modurilor mode.help.title = Descrierea modurilor
mode.survival.name = Supraviețuire mode.survival.name = Supraviețuire
mode.survival.description = Modul normal. Resurse limitate și valuri automate.\n[gray]E nevoie de locuri de lansare a inamicilor pt a juca. mode.survival.description = Modul normal. Resurse limitate și valuri automate.\n[gray]E nevoie de locuri de lansare a inamicilor pt a juca.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Для вступления измене
setting.fps.name = Показывать FPS и пинг setting.fps.name = Показывать FPS и пинг
setting.console.name = Включить консоль setting.console.name = Включить консоль
setting.smoothcamera.name = Плавная камера 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.
setting.vsync.name = Вертикальная синхронизация setting.vsync.name = Вертикальная синхронизация
setting.pixelate.name = Пикселизация setting.pixelate.name = Пикселизация
setting.minimap.name = Отображать мини-карту setting.minimap.name = Отображать мини-карту
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Прокрутка чата
keybind.chat_mode.name = Изменить режим чата keybind.chat_mode.name = Изменить режим чата
keybind.drop_unit.name = Сбросить боев. ед. keybind.drop_unit.name = Сбросить боев. ед.
keybind.zoom_minimap.name = Масштабировать мини-карту keybind.zoom_minimap.name = Масштабировать мини-карту
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Описание режимов mode.help.title = Описание режимов
mode.survival.name = Выживание mode.survival.name = Выживание
mode.survival.description = Обычный режим. Необходимо добывать ресурсы, а волны наступают автоматически.\n[gray]Требуются точки появления врагов на карте для игры. mode.survival.description = Обычный режим. Необходимо добывать ресурсы, а волны наступают автоматически.\n[gray]Требуются точки появления врагов на карте для игры.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = Идентификатор единицы/блока/предмета/жидкости.\nЭто обратная операция поиска. laccess.id = Идентификатор единицы/блока/предмета/жидкости.\nЭто обратная операция поиска.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Неизвестно lcategory.unknown = Неизвестно
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restartovanje je zahtevano da bi se učit
setting.fps.name = Prikazuj FPS i Ping setting.fps.name = Prikazuj FPS i Ping
setting.console.name = Osposobi Konzolu setting.console.name = Osposobi Konzolu
setting.smoothcamera.name = Glatka Kamera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pikselizuj setting.pixelate.name = Pikselizuj
setting.minimap.name = Prikaži Minimapu setting.minimap.name = Prikaži Minimapu
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat Scroll
keybind.chat_mode.name = Menjaj Tip Četa keybind.chat_mode.name = Menjaj Tip Četa
keybind.drop_unit.name = Spusti Jedinicu keybind.drop_unit.name = Spusti Jedinicu
keybind.zoom_minimap.name = Zumiraj Minimapu keybind.zoom_minimap.name = Zumiraj Minimapu
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Opis Modova mode.help.title = Opis Modova
mode.survival.name = Preživljavanje mode.survival.name = Preživljavanje
mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Nepoznato lcategory.unknown = Nepoznato
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = Show FPS setting.fps.name = Show FPS
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixellera[lightgray] (disables animations) setting.pixelate.name = Pixellera[lightgray] (disables animations)
setting.minimap.name = Visa Minikarta setting.minimap.name = Visa Minikarta
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Chat scroll
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Drop Unit keybind.drop_unit.name = Drop Unit
keybind.zoom_minimap.name = Zoom minimap keybind.zoom_minimap.name = Zoom minimap
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Description of modes mode.help.title = Description of modes
mode.survival.name = Överlevnad mode.survival.name = Överlevnad
mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play. mode.survival.description = The normal mode. Limited resources and automatic incoming waves.\n[gray]Requires enemy spawns in the map to play.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = อาจจะต้องรีสต
setting.fps.name = แสดง FPS และ Ping setting.fps.name = แสดง FPS และ Ping
setting.console.name = เปิดใช้งานคอนโซล setting.console.name = เปิดใช้งานคอนโซล
setting.smoothcamera.name = กล้องแบบลื่นไหล 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = ภาพกราฟิกแบบพิกเซล setting.pixelate.name = ภาพกราฟิกแบบพิกเซล
setting.minimap.name = แสดงมินิแมพ setting.minimap.name = แสดงมินิแมพ
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = เลื่อนแชท
keybind.chat_mode.name = เปลี่ยนโหมดแชท keybind.chat_mode.name = เปลี่ยนโหมดแชท
keybind.drop_unit.name = วางยูนิต keybind.drop_unit.name = วางยูนิต
keybind.zoom_minimap.name = ซูมมินิแมพ keybind.zoom_minimap.name = ซูมมินิแมพ
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = คำอธิบายโหมด mode.help.title = คำอธิบายโหมด
mode.survival.name = เอาชีวิตรอด mode.survival.name = เอาชีวิตรอด
mode.survival.description = โหมดปกติ ทรัพยากรมีจำกัดและคลื่นมาโดยอัตโนมัติ\n[gray]ต้องมีจุดเกิดของศัตรูเพื่อที่จะเล่น mode.survival.description = โหมดปกติ ทรัพยากรมีจำกัดและคลื่นมาโดยอัตโนมัติ\n[gray]ต้องมีจุดเกิดของศัตรูเพื่อที่จะเล่น
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID ของยูนิต/บล็อก/ไอเท็ม/ของเหลว\nคำสั่งนี้จะตรงกันข้ามกับคำสั่ง lookup laccess.id = ID ของยูนิต/บล็อก/ไอเท็ม/ของเหลว\nคำสั่งนี้จะตรงกันข้ามกับคำสั่ง lookup
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = ไม่ทราบ lcategory.unknown = ไม่ทราบ
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Restart may be required to apply changes.
setting.fps.name = FPS'i goster setting.fps.name = FPS'i goster
setting.console.name = Enable Console setting.console.name = Enable Console
setting.smoothcamera.name = Smooth Camera 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pixelate [lightgray](may decrease performance) setting.pixelate.name = Pixelate [lightgray](may decrease performance)
setting.minimap.name = Haritayi goster setting.minimap.name = Haritayi goster
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Konusma kaydir
keybind.chat_mode.name = Change Chat Mode keybind.chat_mode.name = Change Chat Mode
keybind.drop_unit.name = Unit birak keybind.drop_unit.name = Unit birak
keybind.zoom_minimap.name = Haritayi yaklastir keybind.zoom_minimap.name = Haritayi yaklastir
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Modlarin aciklamalari mode.help.title = Modlarin aciklamalari
mode.survival.name = Survival mode.survival.name = Survival
mode.survival.description = The normal mode. Limited resources and automatic incoming waves. mode.survival.description = The normal mode. Limited resources and automatic incoming waves.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Unknown lcategory.unknown = Unknown
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Oyunu baştan açman gerekebilir.
setting.fps.name = FPS Göster setting.fps.name = FPS Göster
setting.console.name = Konsolu Aktifleştir setting.console.name = Konsolu Aktifleştir
setting.smoothcamera.name = Yumuşak Geçişli Kamera setting.smoothcamera.name = Yumuşak Geçişli 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.
setting.vsync.name = VSync setting.vsync.name = VSync
setting.pixelate.name = Pikselleştir [lightgray](animasyonları kapatır) setting.pixelate.name = Pikselleştir [lightgray](animasyonları kapatır)
setting.minimap.name = Haritayı Göster setting.minimap.name = Haritayı Göster
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Sohbet Kaydırma
keybind.chat_mode.name = Konuşma Modunu Değiştir keybind.chat_mode.name = Konuşma Modunu Değiştir
keybind.drop_unit.name = Birlik Düşürme keybind.drop_unit.name = Birlik Düşürme
keybind.zoom_minimap.name = Haritada Yakınlaştırma/Uzaklaştırma keybind.zoom_minimap.name = Haritada Yakınlaştırma/Uzaklaştırma
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Oyun Modlarının açıklamaları mode.help.title = Oyun Modlarının açıklamaları
mode.survival.name = Hayatta Kalma mode.survival.name = Hayatta Kalma
mode.survival.description = Normal oyun oyun modu. Kaynak sınırlı ve dalgalar otomatik olarak gönderilir.\n[gray]Oynamak için haritada düşman doğma noktaları olması gerekir. mode.survival.description = Normal oyun oyun modu. Kaynak sınırlı ve dalgalar otomatik olarak gönderilir.\n[gray]Oynamak için haritada düşman doğma noktaları olması gerekir.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = Bir birim/blok/eşya/sıvı kimliği. \nBu arama operasyonun zıttıdır. laccess.id = Bir birim/blok/eşya/sıvı kimliği. \nBu arama operasyonun zıttıdır.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = ??? lcategory.unknown = ???
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Можливо, потрібен пере
setting.fps.name = Показувати FPS і затримку до сервера setting.fps.name = Показувати FPS і затримку до сервера
setting.console.name = Увімкнути консоль setting.console.name = Увімкнути консоль
setting.smoothcamera.name = Гладка камера 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.
setting.vsync.name = Вертикальна синхронізація setting.vsync.name = Вертикальна синхронізація
setting.pixelate.name = Пікселізація setting.pixelate.name = Пікселізація
setting.minimap.name = Показувати мінімапу setting.minimap.name = Показувати мінімапу
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Прокрутка чату
keybind.chat_mode.name = Змінити режим чату keybind.chat_mode.name = Змінити режим чату
keybind.drop_unit.name = Скинути бойову одиницю keybind.drop_unit.name = Скинути бойову одиницю
keybind.zoom_minimap.name = Збільшити мінімапу keybind.zoom_minimap.name = Збільшити мінімапу
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Опис режимів гри mode.help.title = Опис режимів гри
mode.survival.name = Виживання mode.survival.name = Виживання
mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри.
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = Ідентифікатор одиниці/блоку/предмету/рідини.\nЦе зворотна операція до операції пошуку. laccess.id = Ідентифікатор одиниці/блоку/предмету/рідини.\nЦе зворотна операція до операції пошуку.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Невідома категорія lcategory.unknown = Невідома категорія
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = Có thể cần khởi động lại đ
setting.fps.name = Hiện FPS & Ping setting.fps.name = Hiện FPS & Ping
setting.console.name = Bật Bảng điều khiển setting.console.name = Bật Bảng điều khiển
setting.smoothcamera.name = Khung quay mượt mà setting.smoothcamera.name = Khung quay mượt mà
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.
setting.vsync.name = Đồng bộ dọc (VSync) setting.vsync.name = Đồng bộ dọc (VSync)
setting.pixelate.name = Đồ họa pixel setting.pixelate.name = Đồ họa pixel
setting.minimap.name = Hiện bản đồ nhỏ setting.minimap.name = Hiện bản đồ nhỏ
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = Cuộn trò chuyện
keybind.chat_mode.name = Thay đổi chế độ trò chuyện keybind.chat_mode.name = Thay đổi chế độ trò chuyện
keybind.drop_unit.name = Thả đơn vị keybind.drop_unit.name = Thả đơn vị
keybind.zoom_minimap.name = Thu phóng bản đồ nhỏ keybind.zoom_minimap.name = Thu phóng bản đồ nhỏ
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = Mô tả chế độ mode.help.title = Mô tả chế độ
mode.survival.name = Sinh tồn mode.survival.name = Sinh tồn
mode.survival.description = Chế độ bình thường. Tài nguyên hạn chế và các đợt đến tự động.\n[gray]Yêu cầu nơi xuất hiện kẻ địch trong bản đồ để chơi. mode.survival.description = Chế độ bình thường. Tài nguyên hạn chế và các đợt đến tự động.\n[gray]Yêu cầu nơi xuất hiện kẻ địch trong bản đồ để chơi.
@@ -2566,7 +2570,7 @@ laccess.size = Kích thước của đơn vị/công trình hoặc độ dài c
laccess.id = Định danh của một đơn vị/khối/vật phẩm/chất lỏng.\nViệc này làm ngược lại với thao tác tra cứu. laccess.id = Định danh của một đơn vị/khối/vật phẩm/chất lỏng.\nViệc này làm ngược lại với thao tác tra cứu.
laccess.displaywidth = Độ rộng của một khối hiển thị tính bằng pixel. laccess.displaywidth = Độ rộng của một khối hiển thị tính bằng pixel.
laccess.displayheight = Độ cao của một khối hiển thị tính bằng pixel. laccess.displayheight = Độ cao của một khối hiển thị tính bằng pixel.
laccess.bufferusage = Số lệnh chưa xử lý trong bộ đệm đồ họa của một hiển thị. laccess.buffersize = Số lệnh chưa xử lý trong bộ đệm đồ họa của một hiển thị.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = Không xác định lcategory.unknown = Không xác định
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = 可能需要重启
setting.fps.name = 显示帧数和网络延迟 setting.fps.name = 显示帧数和网络延迟
setting.console.name = 启用控制台 setting.console.name = 启用控制台
setting.smoothcamera.name = 平滑镜头 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.
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
setting.pixelate.name = 像素画面 setting.pixelate.name = 像素画面
setting.minimap.name = 显示小地图 setting.minimap.name = 显示小地图
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = 聊天记录滚动
keybind.chat_mode.name = 切换聊天模式 keybind.chat_mode.name = 切换聊天模式
keybind.drop_unit.name = 释放单位 keybind.drop_unit.name = 释放单位
keybind.zoom_minimap.name = 小地图缩放 keybind.zoom_minimap.name = 小地图缩放
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = 游戏模式说明 mode.help.title = 游戏模式说明
mode.survival.name = 生存 mode.survival.name = 生存
mode.survival.description = 通常的游戏模式,资源有限,自动生成敌人波次。\n[gray]需要地图中有敌方出生点和己方核心。 mode.survival.description = 通常的游戏模式,资源有限,自动生成敌人波次。\n[gray]需要地图中有敌方出生点和己方核心。
@@ -2566,7 +2570,7 @@ laccess.size = 单位/建筑的大小或字符串的长度
laccess.id = 单位/块/物品/液体的 ID。\n这是 Lookup 的反向操作。 laccess.id = 单位/块/物品/液体的 ID。\n这是 Lookup 的反向操作。
laccess.displaywidth = 显示屏的宽度(以像素为单位)。 laccess.displaywidth = 显示屏的宽度(以像素为单位)。
laccess.displayheight = 显示屏的高度(以像素为单位)。 laccess.displayheight = 显示屏的高度(以像素为单位)。
laccess.bufferusage = 显示器图形缓冲区中未处理的命令数。 laccess.buffersize = 显示器图形缓冲区中未处理的命令数。
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = 未知 lcategory.unknown = 未知
+5 -1
View File
@@ -1256,6 +1256,8 @@ setting.borderlesswindow.description = 可能需重新啟動遊戲以變更
setting.fps.name = 顯示FPS與延遲 setting.fps.name = 顯示FPS與延遲
setting.console.name = 啟用搖桿 setting.console.name = 啟用搖桿
setting.smoothcamera.name = 平滑攝影機 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.
setting.vsync.name = 垂直同步 setting.vsync.name = 垂直同步
setting.pixelate.name = 像素化 setting.pixelate.name = 像素化
setting.minimap.name = 顯示小地圖 setting.minimap.name = 顯示小地圖
@@ -1391,6 +1393,8 @@ keybind.chat_scroll.name = 聊天記錄捲動
keybind.chat_mode.name = 變更聊天模式 keybind.chat_mode.name = 變更聊天模式
keybind.drop_unit.name = 放下單位 keybind.drop_unit.name = 放下單位
keybind.zoom_minimap.name = 縮放小地圖 keybind.zoom_minimap.name = 縮放小地圖
keybind.detach_camera.name = Toggle Free Camera
keybind.debug_hitboxes.name = Toggle Debug Hitboxes
mode.help.title = 模式說明 mode.help.title = 模式說明
mode.survival.name = 生存 mode.survival.name = 生存
mode.survival.description = 一般模式。有限的資源與自動來襲的波次。\n[gray]地圖中需要敵人生成點。 mode.survival.description = 一般模式。有限的資源與自動來襲的波次。\n[gray]地圖中需要敵人生成點。
@@ -2566,7 +2570,7 @@ laccess.size = Size of a unit/building or the length of a string.
laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation. laccess.id = ID of a unit/block/item/liquid.\nThis is the inverse of the lookup operation.
laccess.displaywidth = Width of a display block in pixels. laccess.displaywidth = Width of a display block in pixels.
laccess.displayheight = Height of a display block in pixels. laccess.displayheight = Height of a display block in pixels.
laccess.bufferusage = Number of unprocessed commands in the graphics buffer of a display. laccess.buffersize = Number of unprocessed commands in the graphics buffer of a display.
laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations. laccess.operations = Number of operations performed on the block.\nFor displays, returns the number of drawflush operations.
lcategory.unknown = 未知 lcategory.unknown = 未知
+1
View File
@@ -183,3 +183,4 @@ RushieWashie
ITY ITY
Iniquit Iniquit
DSFdsfWxp DSFdsfWxp
Someone's Shadow
+5
View File
@@ -202,6 +202,10 @@ public class Vars implements Loadable{
/** Whether to draw shadows of blocks at map edges and static blocks. /** Whether to draw shadows of blocks at map edges and static blocks.
* Do not change unless you know exactly what you are doing.*/ * Do not change unless you know exactly what you are doing.*/
public static boolean enableDarkness = true; 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;
/** application data directory, equivalent to {@link Settings#getDataDirectory()} */ /** application data directory, equivalent to {@link Settings#getDataDirectory()} */
public static Fi dataDirectory; public static Fi dataDirectory;
/** data subdirectory used for screenshots */ /** data subdirectory used for screenshots */
@@ -255,6 +259,7 @@ public class Vars implements Loadable{
public static BaseRegistry bases; public static BaseRegistry bases;
public static GlobalVars logicVars; public static GlobalVars logicVars;
public static MapEditor editor; public static MapEditor editor;
public static AvoidanceProcess avoidance;
public static GameService service = new GameService(); public static GameService service = new GameService();
public static Universe universe; public static Universe universe;
+10 -1
View File
@@ -8,17 +8,26 @@ import mindustry.type.*;
public class ItemUnitStance extends UnitStance{ public class ItemUnitStance extends UnitStance{
private static ObjectMap<Item, ItemUnitStance> itemToStance = new ObjectMap<>(); private static ObjectMap<Item, ItemUnitStance> itemToStance = new ObjectMap<>();
private static Seq<ItemUnitStance> all = new Seq<>();
public final Item item; public final Item item;
public ItemUnitStance(Item item){ public ItemUnitStance(Item item){
super("item-" + item.name, "item-" + item.name, null); super("item-" + item.name, "item-" + item.name, null);
this.item = item; this.item = item;
incompatibleStances.add(UnitStance.mineAuto).addAll(UnitStance.mineAuto.incompatibleStances);
itemToStance.put(item, this); itemToStance.put(item, this);
all.add(this);
} }
public static @Nullable ItemUnitStance getByItem(Item item){ public static @Nullable ItemUnitStance getByItem(Item item){
return itemToStance.get(item); return item == null ? null : itemToStance.get(item);
}
public static Seq<ItemUnitStance> all(){
return all;
} }
@Override @Override
+16 -4
View File
@@ -121,7 +121,6 @@ public class Pathfinder implements Runnable{
mainList = new Seq<>(); mainList = new Seq<>();
clearCache(); clearCache();
for(int i = 0; i < tiles.length; i++){ for(int i = 0; i < tiles.length; i++){
Tile tile = world.tiles.geti(i); Tile tile = world.tiles.geti(i);
tiles[i] = packTile(tile); tiles[i] = packTile(tile);
@@ -253,7 +252,7 @@ public class Pathfinder implements Runnable{
nearSolid, nearSolid,
nearLegSolid, nearLegSolid,
tile.floor().isDeep(), tile.floor().isDeep(),
tile.floor().damageTaken > 0.00001f, tile.floor().damages(),
allDeep, allDeep,
nearDeep, nearDeep,
tile.block().teamPassable tile.block().teamPassable
@@ -359,6 +358,11 @@ public class Pathfinder implements Runnable{
/** Gets next tile to travel to. Main thread only. */ /** Gets next tile to travel to. Main thread only. */
public @Nullable Tile getTargetTile(Tile tile, Flowfield path, boolean diagonals){ public @Nullable Tile getTargetTile(Tile tile, Flowfield path, boolean diagonals){
return getTargetTile(tile, path, diagonals, 0);
}
/** Gets next tile to travel to. Main thread only. */
public @Nullable Tile getTargetTile(Tile tile, Flowfield path, boolean diagonals, int avoidanceId){
if(tile == null) return null; if(tile == null) return null;
//uninitialized flowfields are not applicable //uninitialized flowfields are not applicable
@@ -390,6 +394,7 @@ public class Pathfinder implements Runnable{
int value = values[apos]; int value = values[apos];
var points = diagonals ? Geometry.d8 : Geometry.d4; var points = diagonals ? Geometry.d8 : Geometry.d4;
int[] avoid = avoidanceId <= 0 ? null : avoidance.getAvoidance();
Tile current = null; Tile current = null;
int tl = 0; int tl = 0;
@@ -400,11 +405,13 @@ public class Pathfinder implements Runnable{
if(other == null) continue; if(other == null) continue;
int packed = dx/res + dy/res * ww; int packed = dx/res + dy/res * ww;
int avoidance = avoid == null ? 0 : avoid[packed] > Integer.MAX_VALUE - avoidanceId ? 1 : 0;
int cost = values[packed] + avoidance;
if(values[packed] < value && (current == null || values[packed] < tl) && path.passable(packed) && if(cost < value && avoidance == 0 && (current == null || cost < tl) && path.passable(packed) &&
!(point.x != 0 && point.y != 0 && (!path.passable(((tile.x + point.x)/res + tile.y/res*ww)) || !path.passable((tile.x/res + (tile.y + point.y)/res*ww))))){ //diagonal corner trap !(point.x != 0 && point.y != 0 && (!path.passable(((tile.x + point.x)/res + tile.y/res*ww)) || !path.passable((tile.x/res + (tile.y + point.y)/res*ww))))){ //diagonal corner trap
current = other; current = other;
tl = values[packed]; tl = cost;
} }
} }
@@ -655,6 +662,11 @@ public class Pathfinder implements Runnable{
return pathfinder.getTargetTile(from, this); return pathfinder.getTargetTile(from, this);
} }
/** @return the next tile to travel to for this flowfield. Main thread only. */
public @Nullable Tile getNextTile(Tile from, int unitAvoidanceId){
return pathfinder.getTargetTile(from, this, true, unitAvoidanceId);
}
public boolean hasCompleteWeights(){ public boolean hasCompleteWeights(){
return hasComplete && completeWeights != null; return hasComplete && completeWeights != null;
} }
+27 -5
View File
@@ -3,6 +3,7 @@ package mindustry.ai;
import arc.*; import arc.*;
import arc.input.*; import arc.input.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.ctype.*; import mindustry.ctype.*;
@@ -11,17 +12,39 @@ import mindustry.input.*;
import mindustry.type.*; import mindustry.type.*;
public class UnitStance extends MappableContent{ public class UnitStance extends MappableContent{
public static UnitStance stop, shoot, holdFire, pursueTarget, patrol, ram, mineAuto; public static UnitStance stop, holdFire, pursueTarget, patrol, ram, mineAuto;
/** Name of UI icon (from Icon class). */ /** Name of UI icon (from Icon class). */
public String icon; public String icon;
/** Key to press for this stance. */ /** Key to press for this stance. */
public @Nullable KeyBind keybind; public @Nullable KeyBind keybind;
/** Stances that are mutually exclusive to this stance. This is used for convenience, for writing only! */
public Seq<UnitStance> incompatibleStances = new Seq<>();
/** Incompatible stances as a bitset for easier operations. This is where incompatibility is actually stored. */
public Bits incompatibleBits = new Bits(32);
/** If true, this stance can be toggled on or off. */
public boolean toggle = true;
public UnitStance(String name, String icon, KeyBind keybind){ public UnitStance(String name, String icon, KeyBind keybind, boolean toggle){
super(name); super(name);
this.icon = icon; this.icon = icon;
this.keybind = keybind; this.keybind = keybind;
this.toggle = toggle;
}
public UnitStance(String name, String icon, KeyBind keybind){
this(name, icon, keybind, true);
}
@Override
public void init(){
super.init();
for(var stance : incompatibleStances){
if(stance == this) continue;
incompatibleBits.set(stance.id);
stance.incompatibleBits.set(id);
}
} }
public String localized(){ public String localized(){
@@ -47,13 +70,12 @@ public class UnitStance extends MappableContent{
} }
public static void loadAll(){ public static void loadAll(){
stop = new UnitStance("stop", "cancel", Binding.cancelOrders); stop = new UnitStance("stop", "cancel", Binding.cancelOrders, false);
shoot = new UnitStance("shoot", "commandAttack", Binding.unitStanceShoot);
holdFire = new UnitStance("holdfire", "none", Binding.unitStanceHoldFire); holdFire = new UnitStance("holdfire", "none", Binding.unitStanceHoldFire);
pursueTarget = new UnitStance("pursuetarget", "right", Binding.unitStancePursueTarget); pursueTarget = new UnitStance("pursuetarget", "right", Binding.unitStancePursueTarget);
patrol = new UnitStance("patrol", "refresh", Binding.unitStancePatrol); patrol = new UnitStance("patrol", "refresh", Binding.unitStancePatrol);
ram = new UnitStance("ram", "rightOpen", Binding.unitStanceRam); ram = new UnitStance("ram", "rightOpen", Binding.unitStanceRam);
mineAuto = new UnitStance("mineauto", "settings", null); mineAuto = new UnitStance("mineauto", "settings", null, false);
//Only vanilla items are supported for now //Only vanilla items are supported for now
for(Item item : Vars.content.items()){ for(Item item : Vars.content.items()){
+49 -17
View File
@@ -40,10 +40,10 @@ public class CommandAI extends AIController{
protected float payloadPickupCooldown; protected float payloadPickupCooldown;
protected int transferState = transferStateNone; protected int transferState = transferStateNone;
/** Stance, usually related to firing mode. */
public UnitStance stance = UnitStance.shoot;
/** Current command this unit is following. */ /** Current command this unit is following. */
public UnitCommand command; public UnitCommand command;
/** Stance, usually related to firing mode. Each bit is a stance ID. */
public Bits stances = new Bits(content.unitStances().size);
/** Current controller instance based on command. */ /** Current controller instance based on command. */
protected @Nullable AIController commandController; protected @Nullable AIController commandController;
/** Last command type assigned. Used for detecting command changes. */ /** Last command type assigned. Used for detecting command changes. */
@@ -63,6 +63,38 @@ public class CommandAI extends AIController{
} }
} }
public boolean hasStance(@Nullable UnitStance stance){
return stance != null && stances.get(stance.id);
}
public void setStance(UnitStance stance, boolean enabled){
if(enabled){
setStance(stance);
}else{
disableStance(stance);
}
}
public void setStance(UnitStance stance){
//this happens when an older save reads the default "shoot" stance, or any other removed stance
if(stance == UnitStance.stop) return;
stances.andNot(stance.incompatibleBits);
stances.set(stance.id);
stanceChanged();
}
public void disableStance(UnitStance stance){
stances.clear(stance.id);
stanceChanged();
}
public void stanceChanged(){
if(commandController != null && !(commandController instanceof CommandAI)){
commandController.stanceChanged();
}
}
@Override @Override
public void init(){ public void init(){
if(command == null){ if(command == null){
@@ -82,21 +114,18 @@ public class CommandAI extends AIController{
@Override @Override
public void updateUnit(){ public void updateUnit(){
//this should not be possible
if(stance == UnitStance.stop) stance = UnitStance.shoot;
//fix incorrect stance when mining if(command == UnitCommand.mineCommand && !hasStance(UnitStance.mineAuto) && !ItemUnitStance.all().contains(this::hasStance)){
if(command == UnitCommand.mineCommand && stance != UnitStance.mineAuto && !(stance instanceof ItemUnitStance)){ setStance(UnitStance.mineAuto);
stance = UnitStance.mineAuto;
} }
//pursue the target if relevant //pursue the target if relevant
if(stance == UnitStance.pursueTarget && target != null && attackTarget == null && targetPos == null){ if(hasStance(UnitStance.pursueTarget) && !hasStance(UnitStance.patrol) && target != null && attackTarget == null && targetPos == null){
commandTarget(target, false); commandTarget(target, false);
} }
//pursue the target for patrol, keeping the current position //pursue the target for patrol, keeping the current position
if(stance == UnitStance.patrol && target != null && attackTarget == null){ if(hasStance(UnitStance.patrol) && hasStance(UnitStance.pursueTarget) && target != null && attackTarget == null){
//commanding a target overwrites targetPos, so add it to the queue //commanding a target overwrites targetPos, so add it to the queue
if(targetPos != null){ if(targetPos != null){
commandQueue.add(targetPos.cpy()); commandQueue.add(targetPos.cpy());
@@ -207,6 +236,8 @@ public class CommandAI extends AIController{
finishPath(); finishPath();
} }
boolean ramming = hasStance(UnitStance.ram);
if(attackTarget != null){ if(attackTarget != null){
if(targetPos == null){ if(targetPos == null){
targetPos = new Vec2(); targetPos = new Vec2();
@@ -214,7 +245,7 @@ public class CommandAI extends AIController{
} }
targetPos.set(attackTarget); targetPos.set(attackTarget);
if(unit.isGrounded() && attackTarget instanceof Building build && build.tile.solid() && unit.type.pathCostId != ControlPathfinder.costIdLegs && stance != UnitStance.ram){ if(unit.isGrounded() && attackTarget instanceof Building build && build.tile.solid() && unit.type.pathCostId != ControlPathfinder.costIdLegs && !ramming){
Tile best = build.findClosestEdge(unit, Tile::solid); Tile best = build.findClosestEdge(unit, Tile::solid);
if(best != null){ if(best != null){
targetPos.set(best); targetPos.set(best);
@@ -225,7 +256,7 @@ public class CommandAI extends AIController{
boolean alwaysArrive = false; boolean alwaysArrive = false;
float engageRange = unit.type.range - 10f; float engageRange = unit.type.range - 10f;
boolean withinAttackRange = attackTarget != null && unit.within(attackTarget, engageRange) && stance != UnitStance.ram; boolean withinAttackRange = attackTarget != null && unit.within(attackTarget, engageRange) && !ramming;
if(targetPos != null){ if(targetPos != null){
boolean move = true, isFinalPoint = commandQueue.size == 0; boolean move = true, isFinalPoint = commandQueue.size == 0;
@@ -239,16 +270,17 @@ public class CommandAI extends AIController{
Building targetBuild = world.buildWorld(targetPos.x, targetPos.y); Building targetBuild = world.buildWorld(targetPos.x, targetPos.y);
//TODO: should the unit stop when it finds a target? //TODO: should the unit stop when it finds a target?
if( if(
(stance == UnitStance.patrol && target != null && unit.within(target, unit.type.range - 2f) && !unit.type.circleTarget) || (hasStance(UnitStance.patrol) && !hasStance(UnitStance.pursueTarget) && target != null && unit.within(target, unit.type.range - 2f) && !unit.type.circleTarget) ||
(command == UnitCommand.enterPayloadCommand && unit.within(targetPos, 4f) || (targetBuild != null && unit.within(targetBuild, targetBuild.block.size * tilesize/2f * 0.9f))) || (command == UnitCommand.enterPayloadCommand && unit.within(targetPos, 4f) || (targetBuild != null && unit.within(targetBuild, targetBuild.block.size * tilesize/2f * 0.9f))) ||
(command == UnitCommand.loopPayloadCommand && unit.within(targetPos, 10f)) (command == UnitCommand.loopPayloadCommand && unit.within(targetPos, 10f))
){ ){
move = false; move = false;
} }
if(unit.isGrounded() && stance != UnitStance.ram){ if(unit.isGrounded() && !ramming){
//TODO: blocking enable or disable? //TODO: blocking enable or disable?
if(timer.get(timerTarget3, avoidInterval)){ if(timer.get(timerTarget3, avoidInterval)){
Vec2 dstPos = Tmp.v1.trns(unit.rotation, unit.hitSize/2f); Vec2 dstPos = Tmp.v1.trns(unit.rotation, unit.hitSize/2f);
@@ -284,7 +316,7 @@ public class CommandAI extends AIController{
noFound[0] = false; noFound[0] = false;
vecOut.set(vecMovePos); vecOut.set(vecMovePos);
}else{ }else{
move = controlPath.getPathPosition(unit, vecMovePos, targetPos, vecOut, noFound) && (!blockingUnit || timeSpentBlocked > maxBlockTime); move &= controlPath.getPathPosition(unit, vecMovePos, targetPos, vecOut, noFound) && (!blockingUnit || timeSpentBlocked > maxBlockTime);
//TODO: what to do when there's a target and it can't be reached? //TODO: what to do when there's a target and it can't be reached?
/* /*
@@ -320,7 +352,7 @@ public class CommandAI extends AIController{
moveTo(vecOut, moveTo(vecOut,
withinAttackRange ? engageRange : withinAttackRange ? engageRange :
unit.isGrounded() ? 0f : unit.isGrounded() ? 0f :
attackTarget != null && stance != UnitStance.ram ? engageRange : 0f, attackTarget != null && !ramming ? engageRange : 0f,
unit.isFlying() ? 40f : 100f, false, null, isFinalPoint || alwaysArrive); unit.isFlying() ? 40f : 100f, false, null, isFinalPoint || alwaysArrive);
} }
} }
@@ -412,7 +444,7 @@ public class CommandAI extends AIController{
commandPosition(position); commandPosition(position);
} }
if(prev != null && (stance == UnitStance.patrol || command == UnitCommand.loopPayloadCommand)){ if(prev != null && (hasStance(UnitStance.patrol) || command == UnitCommand.loopPayloadCommand)){
commandQueue.add(prev.cpy()); commandQueue.add(prev.cpy());
} }
@@ -454,7 +486,7 @@ public class CommandAI extends AIController{
@Override @Override
public boolean shouldFire(){ public boolean shouldFire(){
return stance != UnitStance.holdFire; return !hasStance(UnitStance.holdFire);
} }
@Override @Override
+37 -1
View File
@@ -1,7 +1,10 @@
package mindustry.ai.types; package mindustry.ai.types;
import arc.math.*; import arc.math.*;
import arc.util.*;
import mindustry.*;
import mindustry.ai.*; import mindustry.ai.*;
import mindustry.entities.*;
import mindustry.entities.units.*; import mindustry.entities.units.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.world.*; import mindustry.world.*;
@@ -9,11 +12,19 @@ import mindustry.world.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
public class GroundAI extends AIController{ public class GroundAI extends AIController{
float stuckTime = 0f;
float stuckX = -999f, stuckY = -999f;
static final float stuckRange = tilesize * 1.5f;
@Override @Override
public void updateMovement(){ public void updateMovement(){
//if it hasn't moved the stuck range in twice the time it should have taken, it's stuck
float stuckThreshold = Math.max(1f, stuckRange * 2f / unit.type.speed);
Building core = unit.closestEnemyCore(); Building core = unit.closestEnemyCore();
boolean moved = false;
if(core != null && unit.within(core, unit.range() / 1.3f + core.block.size * tilesize / 2f)){ if(core != null && unit.within(core, unit.range() / 1.3f + core.block.size * tilesize / 2f)){
target = core; target = core;
@@ -38,7 +49,9 @@ public class GroundAI extends AIController{
move = false; move = false;
} }
if(move) pathfind(Pathfinder.fieldCore); moved = move;
if(move) pathfind(Pathfinder.fieldCore, true, stuckTime >= stuckThreshold);
} }
if(unit.type.canBoost && unit.elevation > 0.001f && !unit.onSolid()){ if(unit.type.canBoost && unit.elevation > 0.001f && !unit.onSolid()){
@@ -46,5 +59,28 @@ public class GroundAI extends AIController{
} }
faceTarget(); faceTarget();
if(moved){
if(unit.within(stuckX, stuckY, stuckRange)){
stuckTime += Time.delta;
if(stuckTime - Time.delta < stuckThreshold && stuckTime >= stuckThreshold){
float radius = unit.hitSize * Vars.unitCollisionRadiusScale * 2f;
Units.nearby(unit.team, unit.x, unit.y, radius, other -> {
if(other != unit && other.controller() instanceof GroundAI ai && other.within(unit.x, unit.y, radius + other.hitSize * unitCollisionRadiusScale)){
ai.stuckX = other.x;
ai.stuckY = other.y;
ai.stuckTime = Math.max(1f, stuckRange * 2f / other.type.speed) + 1f;
}
});
}
}else{
stuckX = unit.x;
stuckY = unit.y;
stuckTime = 0f;
}
}else{
stuckTime = 0f;
}
} }
} }
+14 -4
View File
@@ -13,6 +13,14 @@ public class MinerAI extends AIController{
public Item targetItem; public Item targetItem;
public Tile ore; public Tile ore;
@Override
public void stanceChanged(){
if(targetItem != null && unit.controller() instanceof CommandAI ai && !ai.hasStance(UnitStance.mineAuto) && !ai.hasStance(ItemUnitStance.getByItem(targetItem))){
mining = false;
targetItem = null;
}
}
@Override @Override
public void updateMovement(){ public void updateMovement(){
Building core = unit.closestCore(); Building core = unit.closestCore();
@@ -23,14 +31,16 @@ public class MinerAI extends AIController{
unit.mineTile(null); unit.mineTile(null);
} }
Item autoItem = unit.controller() instanceof CommandAI ai && ai.stance instanceof ItemUnitStance stance ? stance.item : null; CommandAI ai = unit.controller() instanceof CommandAI a ? a : null;
if(mining){ if(mining){
if(autoItem != null){ if(timer.get(timerTarget2, 60 * 4) || targetItem == null){
targetItem = autoItem; if(ai != null && !ai.hasStance(UnitStance.mineAuto)){
}else if(timer.get(timerTarget2, 60 * 4) || targetItem == null){ targetItem = content.items().min(i -> indexer.hasOre(i) && unit.canMine(i) && ai.hasStance(ItemUnitStance.getByItem(i)), i -> core.items.get(i));
}else{
targetItem = unit.type.mineItems.min(i -> indexer.hasOre(i) && unit.canMine(i), i -> core.items.get(i)); targetItem = unit.type.mineItems.min(i -> indexer.hasOre(i) && unit.canMine(i), i -> core.items.get(i));
} }
}
//core full of the target item, do nothing //core full of the target item, do nothing
if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){ if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){
+2 -1
View File
@@ -12,7 +12,8 @@ import static mindustry.Vars.*;
public class AsyncCore{ public class AsyncCore{
//all processes to be executed each frame //all processes to be executed each frame
public final Seq<AsyncProcess> processes = Seq.with( public final Seq<AsyncProcess> processes = Seq.with(
new PhysicsProcess() new PhysicsProcess(),
avoidance = new AvoidanceProcess()
); );
//futures to be awaited //futures to be awaited
@@ -0,0 +1,112 @@
package mindustry.async;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
import arc.util.*;
import mindustry.*;
import java.util.*;
import static mindustry.Vars.*;
public class AvoidanceProcess implements AsyncProcess{
/** cached world size */
static int wwidth, wheight;
@Nullable int[] buffer1, buffer2;
volatile boolean swap;
IntSeq requests = new IntSeq();
@Nullable int[] avoidance;
boolean modified;
boolean active;
public @Nullable int[] getAvoidance(){
if(!active){
//lazily initialize and begin processing after this first request
buffer1 = new int[wwidth * wheight];
buffer2 = new int[wwidth * wheight];
active = true;
}
return avoidance;
}
@Override
public void init(){
wwidth = Vars.world.width();
wheight = Vars.world.height();
}
@Override
public void reset(){
buffer1 = buffer2 = avoidance = null;
swap = false;
modified = false;
active = false;
requests.clear();
}
@Override
public void begin(){
if(!active) return;
requests.clear();
avoidance = !swap ? buffer1 : buffer2;
for(var team : state.teams.present){
//only do avoidance if it's relevant to the team
if(team.team.isAI() && !team.team.rules().rtsAi){
for(var unit : team.units){
if(unit.collisionLayer() == PhysicsProcess.layerGround){
//scaling is oversized 2x because units need to avoid things that are at their origin tile
float scaling = 2f;
requests.add(Point2.pack(unit.tileX(), unit.tileY()), Float.floatToRawIntBits(unit.hitSize * unitCollisionRadiusScale / tilesize * scaling), unit.id);
}
}
}
}
}
@Override
public void process(){
//double buffering; one buffer is always valid (not being updated)
var buffer = swap ? buffer1 : buffer2;
swap = !swap;
if(buffer == null) return;
//technically, this is wrong, and will lead to flickering avoidance when all units are gone, but this doesn't matter because it's not being queried either way
if(modified){
Arrays.fill(buffer, 0);
}
modified = requests.size > 0;
int total = requests.size;
int[] items = requests.items;
for(int i = 0; i < total; i += 3){
int point = items[i], id = items[i + 2];
int rx = Point2.x(point), ry = Point2.y(point);
float rad = Float.intBitsToFloat(items[i + 1]);
float rad2 = rad * rad;
int r = Math.max(1, Mathf.ceil(rad));
for(int dx = -r; dx <= r; dx++){
for(int dy = -r; dy <= r; dy++){
int x = dx + rx, y = dy + ry;
if(x >= 0 && y >= 0 && x < wwidth && y < wheight && (dx*dx + dy*dy) <= rad2){
buffer[x + y * wwidth] = Math.max(buffer[x + y * wwidth], Integer.MAX_VALUE - id);
}
}
}
}
}
@Override
public boolean shouldProcess(){
return active;
}
}
+21 -21
View File
@@ -6264,7 +6264,7 @@ public class Blocks{
}}; }};
tankAssembler = new UnitAssembler("tank-assembler"){{ tankAssembler = new UnitAssembler("tank-assembler"){{
requirements(Category.units, with(Items.thorium, 500, Items.oxide, 150, Items.carbide, 80, Items.silicon, 500)); requirements(Category.units, with(Items.thorium, 500, Items.oxide, 150, Items.carbide, 80, Items.silicon, 650));
regionSuffix = "-dark"; regionSuffix = "-dark";
size = 5; size = 5;
plans.add( plans.add(
@@ -6274,12 +6274,12 @@ public class Blocks{
areaSize = 13; areaSize = 13;
researchCostMultiplier = 0.4f; researchCostMultiplier = 0.4f;
consumePower(3f); consumePower(2.5f);
consumeLiquid(Liquids.cyanogen, 9f / 60f); consumeLiquid(Liquids.cyanogen, 9f / 60f);
}}; }};
shipAssembler = new UnitAssembler("ship-assembler"){{ shipAssembler = new UnitAssembler("ship-assembler"){{
requirements(Category.units, with(Items.carbide, 100, Items.oxide, 200, Items.tungsten, 500, Items.silicon, 800, Items.thorium, 400)); requirements(Category.units, with(Items.carbide, 100, Items.oxide, 200, Items.tungsten, 550, Items.silicon, 900, Items.thorium, 400));
regionSuffix = "-dark"; regionSuffix = "-dark";
size = 5; size = 5;
plans.add( plans.add(
@@ -6288,12 +6288,12 @@ public class Blocks{
); );
areaSize = 13; areaSize = 13;
consumePower(3f); consumePower(2.5f);
consumeLiquid(Liquids.cyanogen, 12f / 60f); consumeLiquid(Liquids.cyanogen, 12f / 60f);
}}; }};
mechAssembler = new UnitAssembler("mech-assembler"){{ mechAssembler = new UnitAssembler("mech-assembler"){{
requirements(Category.units, with(Items.carbide, 200, Items.thorium, 600, Items.oxide, 200, Items.tungsten, 500, Items.silicon, 900)); requirements(Category.units, with(Items.carbide, 200, Items.thorium, 600, Items.oxide, 200, Items.tungsten, 550, Items.silicon, 1000));
regionSuffix = "-dark"; regionSuffix = "-dark";
size = 5; size = 5;
//TODO different reqs //TODO different reqs
@@ -6303,14 +6303,14 @@ public class Blocks{
); );
areaSize = 13; areaSize = 13;
consumePower(3.5f); consumePower(3f);
consumeLiquid(Liquids.cyanogen, 12f / 60f); consumeLiquid(Liquids.cyanogen, 12f / 60f);
}}; }};
//TODO requirements / only accept inputs //TODO requirements / only accept inputs
basicAssemblerModule = new UnitAssemblerModule("basic-assembler-module"){{ basicAssemblerModule = new UnitAssemblerModule("basic-assembler-module"){{
requirements(Category.units, with(Items.carbide, 300, Items.thorium, 500, Items.oxide, 200, Items.phaseFabric, 400)); requirements(Category.units, with(Items.carbide, 300, Items.thorium, 500, Items.oxide, 250, Items.phaseFabric, 400));
consumePower(4f); consumePower(3.5f);
regionSuffix = "-dark"; regionSuffix = "-dark";
researchCostMultiplier = 0.75f; researchCostMultiplier = 0.75f;
@@ -6360,7 +6360,7 @@ public class Blocks{
}}; }};
payloadMassDriver = new PayloadMassDriver("payload-mass-driver"){{ payloadMassDriver = new PayloadMassDriver("payload-mass-driver"){{
requirements(Category.units, with(Items.tungsten, 120, Items.silicon, 120, Items.graphite, 50)); requirements(Category.units, with(Items.tungsten, 40, Items.silicon, 50, Items.graphite, 20));
regionSuffix = "-dark"; regionSuffix = "-dark";
size = 3; size = 3;
reload = 130f; reload = 130f;
@@ -6372,13 +6372,13 @@ public class Blocks{
}}; }};
largePayloadMassDriver = new PayloadMassDriver("large-payload-mass-driver"){{ largePayloadMassDriver = new PayloadMassDriver("large-payload-mass-driver"){{
requirements(Category.units, with(Items.thorium, 200, Items.tungsten, 200, Items.silicon, 200, Items.graphite, 100, Items.oxide, 30)); requirements(Category.units, with(Items.phaseFabric, 20, Items.tungsten, 200, Items.silicon, 200, Items.graphite, 100, Items.oxide, 30));
regionSuffix = "-dark"; regionSuffix = "-dark";
size = 5; size = 5;
reload = 130f; reload = 130f;
chargeTime = 100f; chargeTime = 100f;
range = 1100f; range = 2100f;
maxPayloadSize = 3.5f; maxPayloadSize = 4f;
consumePower(3f); consumePower(3f);
}}; }};
@@ -6388,24 +6388,24 @@ public class Blocks{
itemCapacity = 100; itemCapacity = 100;
consumePower(1f); consumePower(1f);
size = 3; size = 3;
deconstructSpeed = 1f; deconstructSpeed = 3f;
}}; }};
deconstructor = new PayloadDeconstructor("deconstructor"){{ deconstructor = new PayloadDeconstructor("deconstructor"){{
requirements(Category.units, with(Items.beryllium, 250, Items.oxide, 100, Items.silicon, 250, Items.carbide, 250)); requirements(Category.units, with(Items.beryllium, 250, Items.oxide, 100, Items.silicon, 250, Items.carbide, 50));
regionSuffix = "-dark"; regionSuffix = "-dark";
itemCapacity = 250; itemCapacity = 250;
consumePower(3f); consumePower(3f);
size = 5; size = 5;
deconstructSpeed = 2f; deconstructSpeed = 6f;
}}; }};
constructor = new Constructor("constructor"){{ constructor = new Constructor("constructor"){{
requirements(Category.units, with(Items.silicon, 100, Items.beryllium, 150, Items.tungsten, 80)); requirements(Category.units, with(Items.silicon, 50, Items.beryllium, 75, Items.tungsten, 40));
regionSuffix = "-dark"; regionSuffix = "-dark";
hasPower = true; hasPower = true;
buildSpeed = 0.6f; buildSpeed = 0.6f;
consumePower(2f); consumePower(2.5f);
size = 3; size = 3;
//TODO expand this list //TODO expand this list
filter = Seq.with(Blocks.tungstenWallLarge, Blocks.berylliumWallLarge, Blocks.carbideWallLarge, Blocks.reinforcedSurgeWallLarge, Blocks.reinforcedLiquidContainer, Blocks.reinforcedContainer, Blocks.beamNode); filter = Seq.with(Blocks.tungstenWallLarge, Blocks.berylliumWallLarge, Blocks.carbideWallLarge, Blocks.reinforcedSurgeWallLarge, Blocks.reinforcedLiquidContainer, Blocks.reinforcedContainer, Blocks.beamNode);
@@ -6413,7 +6413,7 @@ public class Blocks{
//yes this block is pretty much useless //yes this block is pretty much useless
largeConstructor = new Constructor("large-constructor"){{ largeConstructor = new Constructor("large-constructor"){{
requirements(Category.units, with(Items.silicon, 150, Items.oxide, 150, Items.tungsten, 200, Items.phaseFabric, 40)); requirements(Category.units, with(Items.silicon, 150, Items.oxide, 100, Items.tungsten, 200, Items.thorium, 80));
regionSuffix = "-dark"; regionSuffix = "-dark";
hasPower = true; hasPower = true;
buildSpeed = 0.75f; buildSpeed = 0.75f;
@@ -6421,11 +6421,11 @@ public class Blocks{
minBlockSize = 3; minBlockSize = 3;
size = 5; size = 5;
consumePower(2f); consumePower(3f);
}}; }};
payloadLoader = new PayloadLoader("payload-loader"){{ payloadLoader = new PayloadLoader("payload-loader"){{
requirements(Category.units, with(Items.graphite, 50, Items.silicon, 50, Items.tungsten, 80)); requirements(Category.units, with(Items.graphite, 80, Items.silicon, 160, Items.tungsten, 90));
regionSuffix = "-dark"; regionSuffix = "-dark";
hasPower = true; hasPower = true;
consumePower(2f); consumePower(2f);
@@ -6434,7 +6434,7 @@ public class Blocks{
}}; }};
payloadUnloader = new PayloadUnloader("payload-unloader"){{ payloadUnloader = new PayloadUnloader("payload-unloader"){{
requirements(Category.units, with(Items.graphite, 50, Items.silicon, 50, Items.tungsten, 30)); requirements(Category.units, with(Items.graphite, 140, Items.silicon, 220, Items.tungsten, 180));
regionSuffix = "-dark"; regionSuffix = "-dark";
hasPower = true; hasPower = true;
consumePower(2f); consumePower(2f);
+4
View File
@@ -415,6 +415,10 @@ public class Renderer implements ApplicationListener{
Groups.draw.draw(Drawc::draw); Groups.draw.draw(Drawc::draw);
if(drawDebugHitboxes){
DebugCollisionRenderer.draw();
}
Draw.reset(); Draw.reset();
Draw.flush(); Draw.flush();
Draw.sort(false); Draw.sort(false);
@@ -95,6 +95,10 @@ public abstract class UnlockableContent extends MappableContent{
uiIcon = Core.atlas.find(getContentType().name() + "-" + name + "-ui", fullIcon); uiIcon = Core.atlas.find(getContentType().name() + "-" + name + "-ui", fullIcon);
} }
public boolean isBanned(){
return false;
}
public boolean isOnPlanet(@Nullable Planet planet){ public boolean isOnPlanet(@Nullable Planet planet){
return planet == null || planet == Planets.sun || shownPlanets.isEmpty() || shownPlanets.contains(planet); return planet == null || planet == Planets.sun || shownPlanets.isEmpty() || shownPlanets.contains(planet);
} }
@@ -17,6 +17,7 @@ import mindustry.game.MapObjectives.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.io.*; import mindustry.io.*;
import mindustry.logic.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
@@ -280,6 +281,15 @@ public class MapObjectivesDialog extends BaseDialog{
}); });
})); }));
setInterpreter(Alignment.class, int.class, (cont, name, type, field, remover, indexer, get, set) -> {
Alignment align = field.getAnnotation(Alignment.class);
name(cont, name, remover, indexer);
cont.button(b -> {
b.label(() -> LStatement.alignToName.get(get.get(), "center"));
b.clicked(() -> LStatement.showAlignSelect(b, get.get(), set::get, align.hor(), align.ver()));
}, () -> {});
});
// Types that use the default interpreter. It would be nice if all types could use it, but I don't know how to reliably prevent classes like [? extends Content] from using it. // Types that use the default interpreter. It would be nice if all types could use it, but I don't know how to reliably prevent classes like [? extends Content] from using it.
for(var obj : MapObjectives.allObjectiveTypes) setInterpreter(obj.get().getClass(), defaultInterpreter()); for(var obj : MapObjectives.allObjectiveTypes) setInterpreter(obj.get().getClass(), defaultInterpreter());
for(var mark : MapObjectives.allMarkerTypes) setInterpreter(mark.get().getClass(), defaultInterpreter()); for(var mark : MapObjectives.allMarkerTypes) setInterpreter(mark.get().getClass(), defaultInterpreter());
+1 -1
View File
@@ -59,7 +59,7 @@ public class Fires{
if(tile != null){ if(tile != null){
Fire fire = get(tile); Fire fire = get(tile);
if(fire != null){ if(fire != null){
fire.time(fire.time + intensity * Time.delta); fire.time += intensity * Time.delta;
Fx.steam.at(fire); Fx.steam.at(fire);
if(fire.time >= fire.lifetime){ if(fire.time >= fire.lifetime){
Events.fire(Trigger.fireExtinguish); Events.fire(Trigger.fireExtinguish);
+1 -1
View File
@@ -110,7 +110,7 @@ public class Puddles{
} }
public static void register(Puddle puddle){ public static void register(Puddle puddle){
world.tiles.setPuddle(puddle.tile().array(), puddle); world.tiles.setPuddle(puddle.tile.array(), puddle);
} }
/** Reacts two liquids together at a location. */ /** Reacts two liquids together at a location. */
@@ -438,17 +438,19 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return heat; return heat;
} }
/** Sets the time scale of the building to the given intensity, unless it's above that value */
public void applyBoost(float intensity, float duration){ public void applyBoost(float intensity, float duration){
//do not refresh time scale when getting a weaker intensity //do not refresh time scale when getting a lower intensity
if(intensity >= this.timeScale - 0.001f){ if(intensity >= this.timeScale - 0.001f){
timeScaleDuration = Math.max(timeScaleDuration, duration); timeScaleDuration = Math.max(timeScaleDuration, duration);
} }
timeScale = Math.max(timeScale, intensity); timeScale = Math.max(timeScale, intensity);
} }
/** Sets the time scale of the building to the given intensity, unless it's below that value */
public void applySlowdown(float intensity, float duration){ public void applySlowdown(float intensity, float duration){
//do not refresh time scale when getting a weaker intensity //do not refresh time scale when getting a higher intensity
if(intensity <= this.timeScale - 0.001f){ if(intensity <= this.timeScale + 0.001f){
timeScaleDuration = Math.max(timeScaleDuration, duration); timeScaleDuration = Math.max(timeScaleDuration, duration);
} }
timeScale = Math.min(timeScale, intensity); timeScale = Math.min(timeScale, intensity);
@@ -1215,11 +1217,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
public void drawItemSelection(@Nullable UnlockableContent selection){ public void drawItemSelection(@Nullable UnlockableContent selection){
if(selection != null){ if(selection != null){
float dx = x - block.size * tilesize/2f, dy = y + block.size * tilesize/2f, s = iconSmall / 4f; float dx = x - block.size * tilesize/2f, dy = y + block.size * tilesize/2f, s = iconSmall / 4f * selection.fullIcon.ratio(), h = iconSmall / 4f;
Draw.mixcol(Color.darkGray, 1f); Draw.mixcol(Color.darkGray, 1f);
Draw.rect(selection.fullIcon, dx, dy - 1, s, s); Draw.rect(selection.fullIcon, dx, dy - 1, s, h);
Draw.reset(); Draw.reset();
Draw.rect(selection.fullIcon, dx, dy, s, s); Draw.rect(selection.fullIcon, dx, dy, s, h);
} }
} }
@@ -18,7 +18,7 @@ import mindustry.world.meta.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@EntityDef(value = {Firec.class}, pooled = true) @EntityDef(value = {Firec.class}, pooled = true)
@Component(base = true) @Component(base = true, genInterface = false)
abstract class FireComp implements Timedc, Posc, Syncc, Drawc{ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
public static final int frames = 40, duration = 90; public static final int frames = 40, duration = 90;
@@ -88,7 +88,7 @@ abstract class FireComp implements Timedc, Posc, Syncc, Drawc{
//apply damage to nearby units & building //apply damage to nearby units & building
if((damageTimer += Time.delta) >= damageDelay){ if((damageTimer += Time.delta) >= damageDelay){
damageTimer = 0f; damageTimer = 0f;
Puddlec p = Puddles.get(tile); Puddle p = Puddles.get(tile);
puddleFlammability = p != null ? p.getFlammability() / 3f : 0; puddleFlammability = p != null ? p.getFlammability() / 3f : 0;
if(damage){ if(damage){
@@ -17,7 +17,7 @@ import static mindustry.Vars.*;
import static mindustry.entities.Puddles.*; import static mindustry.entities.Puddles.*;
@EntityDef(value = {Puddlec.class}, pooled = true) @EntityDef(value = {Puddlec.class}, pooled = true)
@Component(base = true) @Component(base = true, genInterface = false)
abstract class PuddleComp implements Posc, Puddlec, Drawc, Syncc{ abstract class PuddleComp implements Posc, Puddlec, Drawc, Syncc{
private static final Rect rect = new Rect(), rect2 = new Rect(); private static final Rect rect = new Rect(), rect2 = new Rect();
@@ -12,7 +12,7 @@ import mindustry.ui.*;
/** Component/entity for labels in world space. Useful for servers. Does not save in files - create only on world load. */ /** Component/entity for labels in world space. Useful for servers. Does not save in files - create only on world load. */
@EntityDef(value = {WorldLabelc.class}, serialize = false) @EntityDef(value = {WorldLabelc.class}, serialize = false)
@Component(base = true) @Component(base = true, genInterface = false)
public abstract class WorldLabelComp implements Posc, Drawc, Syncc{ public abstract class WorldLabelComp implements Posc, Drawc, Syncc{
@Import int id; @Import int id;
@Import float x, y; @Import float x, y;
@@ -31,10 +31,10 @@ public abstract class WorldLabelComp implements Posc, Drawc, Syncc{
@Override @Override
public void draw(){ public void draw(){
drawAt(text, x, y, z, flags, fontSize); drawAt(text, x, y, z, flags, fontSize, Align.center, Align.center);
} }
public static void drawAt(String text, float x, float y, float layer, int flags, float fontSize){ public static void drawAt(String text, float x, float y, float layer, int flags, float fontSize, int align, int lineAlign){
Draw.z(layer); Draw.z(layer);
float z = Drawf.text(); float z = Drawf.text();
@@ -46,14 +46,32 @@ public abstract class WorldLabelComp implements Posc, Drawc, Syncc{
font.getData().setScale(0.25f / Scl.scl(1f) * fontSize); font.getData().setScale(0.25f / Scl.scl(1f) * fontSize);
layout.setText(font, text); layout.setText(font, text);
int border = (flags & flagBackground) != 0 ? 1 : 0;
if(Align.isBottom(align)){
y += layout.height + border * 1.5f;
}else if(Align.isTop(align)){
y -= border * 1.5f;
}else{
y += layout.height / 2;
}
if(Align.isLeft(align)){
x += layout.width / 2 + border;
}else if(Align.isRight(align)){
x -= layout.width / 2 + border;
}
if((flags & flagBackground) != 0){ if((flags & flagBackground) != 0){
Draw.color(0f, 0f, 0f, 0.3f); Draw.color(0f, 0f, 0f, 0.3f);
Fill.rect(x, y - layout.height / 2, layout.width + 2, layout.height + 3); Fill.rect(x, y - layout.height / 2, layout.width + 2, layout.height + 3);
Draw.color(); Draw.color();
} }
float tx = Align.isLeft(lineAlign) ? -layout.width * 0.5f : Align.isRight(lineAlign) ? layout.width * 0.5f : 0;
font.setColor(Color.white); font.setColor(Color.white);
font.draw(text, x, y, 0, Align.center, false); font.draw(text, x + tx, y, 0, lineAlign, false);
Draw.reset(); Draw.reset();
Pools.free(layout); Pools.free(layout);
@@ -4,6 +4,7 @@ import arc.math.*;
import arc.math.geom.*; import arc.math.geom.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.async.*;
import mindustry.entities.*; import mindustry.entities.*;
import mindustry.game.*; import mindustry.game.*;
import mindustry.gen.*; import mindustry.gen.*;
@@ -51,6 +52,9 @@ public class AIController implements UnitController{
updateMovement(); updateMovement();
} }
/** Called when the parent CommandAI changes its stance. */
public void stanceChanged(){}
/** /**
* @return whether controller state should not be reset after reading. * @return whether controller state should not be reset after reading.
* Do not override unless you know exactly what you are doing. * Do not override unless you know exactly what you are doing.
@@ -129,11 +133,15 @@ public class AIController implements UnitController{
} }
public void pathfind(int pathTarget, boolean stopAtTargetTile){ public void pathfind(int pathTarget, boolean stopAtTargetTile){
pathfind(pathTarget, stopAtTargetTile, false);
}
public void pathfind(int pathTarget, boolean stopAtTargetTile, boolean avoidance){
int costType = unit.type.flowfieldPathType; int costType = unit.type.flowfieldPathType;
Tile tile = unit.tileOn(); Tile tile = unit.tileOn();
if(tile == null) return; if(tile == null) return;
Tile targetTile = pathfinder.getField(unit.team, costType, pathTarget).getNextTile(tile); Tile targetTile = pathfinder.getField(unit.team, costType, pathTarget).getNextTile(tile, avoidance && unit.collisionLayer() == PhysicsProcess.layerGround ? unit.id : 0);
if((tile == targetTile && stopAtTargetTile) || !unit.canPass(targetTile.x, targetTile.y)) return; if((tile == targetTile && stopAtTargetTile) || !unit.canPass(targetTile.x, targetTile.y)) return;
+29 -2
View File
@@ -757,6 +757,8 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public @Multiline String text = "frog"; public @Multiline String text = "frog";
public float fontSize = 1f, textHeight = 7f; public float fontSize = 1f, textHeight = 7f;
public @LabelFlag byte flags = WorldLabel.flagBackground | WorldLabel.flagOutline; public @LabelFlag byte flags = WorldLabel.flagBackground | WorldLabel.flagOutline;
public @Alignment int textAlign = Align.center;
public @Alignment(ver = false) int lineAlign = Align.center;
public float radius = 6f, rotation = 0f; public float radius = 6f, rotation = 0f;
public int sides = 4; public int sides = 4;
@@ -791,6 +793,15 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
this.textHeight = textHeight; this.textHeight = textHeight;
} }
public ShapeTextMarker(String text, float x, float y, float radius, float rotation, float textHeight, int textAlign){
this.text = text;
this.pos.set(x, y);
this.radius = radius;
this.rotation = rotation;
this.textHeight = textHeight;
this.textAlign = textAlign;
}
public ShapeTextMarker(){} public ShapeTextMarker(){}
@Override @Override
@@ -812,7 +823,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
// font size cannot be 0 // font size cannot be 0
if(Mathf.equal(fontSize, 0f)) return; if(Mathf.equal(fontSize, 0f)) return;
WorldLabel.drawAt(fetchedText, pos.x, pos.y + radius * scaleFactor + textHeight * scaleFactor, drawLayer, flags, fontSize * scaleFactor); WorldLabel.drawAt(fetchedText, pos.x, pos.y + radius * scaleFactor + textHeight * scaleFactor, drawLayer, flags, fontSize * scaleFactor, textAlign, lineAlign);
} }
@Override @Override
@@ -823,6 +834,8 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
switch(type){ switch(type){
case fontSize -> fontSize = (float)p1; case fontSize -> fontSize = (float)p1;
case textHeight -> textHeight = (float)p1; case textHeight -> textHeight = (float)p1;
case textAlign -> textAlign = (int)p1;
case lineAlign -> lineAlign = (int)p1;
case outline -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagOutline, !Mathf.equal((float)p1, 0f)); case outline -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagOutline, !Mathf.equal((float)p1, 0f));
case labelFlags -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagBackground, !Mathf.equal((float)p1, 0f)); case labelFlags -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagBackground, !Mathf.equal((float)p1, 0f));
case radius -> radius = (float)p1; case radius -> radius = (float)p1;
@@ -980,6 +993,9 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public @Multiline String text = "uwu"; public @Multiline String text = "uwu";
public float fontSize = 1f; public float fontSize = 1f;
public @LabelFlag byte flags = WorldLabel.flagBackground | WorldLabel.flagOutline; public @LabelFlag byte flags = WorldLabel.flagBackground | WorldLabel.flagOutline;
public @Alignment int textAlign = Align.center;
public @Alignment(ver = false) int lineAlign = Align.center;
// Cached localized text. // Cached localized text.
private transient String fetchedText; private transient String fetchedText;
@@ -1006,7 +1022,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
fetchedText = fetchText(text); fetchedText = fetchText(text);
} }
WorldLabel.drawAt(fetchedText, pos.x, pos.y, drawLayer, flags, fontSize * scaleFactor); WorldLabel.drawAt(fetchedText, pos.x, pos.y, drawLayer, flags, fontSize * scaleFactor, textAlign, lineAlign);
} }
@Override @Override
@@ -1016,6 +1032,8 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
if(!Double.isNaN(p1)){ if(!Double.isNaN(p1)){
switch(type){ switch(type){
case fontSize -> fontSize = (float)p1; case fontSize -> fontSize = (float)p1;
case textAlign -> textAlign = (int)p1;
case lineAlign -> lineAlign = (int)p1;
case outline -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagOutline, !Mathf.equal((float)p1, 0f)); case outline -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagOutline, !Mathf.equal((float)p1, 0f));
case labelFlags -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagBackground, !Mathf.equal((float)p1, 0f)); case labelFlags -> flags = (byte)Pack.bitmask(flags, WorldLabel.flagBackground, !Mathf.equal((float)p1, 0f));
} }
@@ -1317,6 +1335,14 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface LabelFlag{} public @interface LabelFlag{}
/** For {@code int}; treats it as an alignment from {@link Align} */
@Target(FIELD)
@Retention(RUNTIME)
public @interface Alignment{
boolean hor() default true;
boolean ver() default true;
}
/** For {@link UnlockableContent}; filters all un-researchable content. */ /** For {@link UnlockableContent}; filters all un-researchable content. */
@Target(FIELD) @Target(FIELD)
@Retention(RUNTIME) @Retention(RUNTIME)
@@ -1341,4 +1367,5 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
@Target(FIELD) @Target(FIELD)
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface TilePos{} public @interface TilePos{}
} }
@@ -0,0 +1,93 @@
package mindustry.graphics;
import arc.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.math.geom.*;
import arc.util.*;
import mindustry.core.*;
import mindustry.gen.*;
import mindustry.world.*;
import static arc.Core.*;
import static mindustry.Vars.*;
public class DebugCollisionRenderer{
static final float[] edges = {
1, -1,
1, 1,
-1, 1,
-1, -1,
};
public static void draw(){
Rect rect = camera.bounds(new Rect());
Draw.draw(Layer.overlayUI, () -> {
//hitboxes
Draw.color(Color.green, 0.3f);
Groups.draw.each(d -> {
if(d instanceof Hitboxc h && rect.overlaps(Tmp.r1.setCentered(d.x(), d.y(), d.clipSize()))){
Fill.square(d.x(), d.y(), h.hitSize()/2f);
}
});
//tile hitboxes for units
Lines.stroke(0.4f, Color.magenta);
int rx = Mathf.clamp((int)(Core.camera.width / tilesize / 2) + 1, 0, world.width()/2);
int ry = Mathf.clamp((int)(Core.camera.height / tilesize / 2) + 1, 0, world.height()/2);
for(int x = -rx; x <= rx; x++){
for(int y = -ry; y <= ry; y++){
int wx = World.toTile(Core.camera.position.x) + x;
int wy = World.toTile(Core.camera.position.y) + y;
Tile tile = world.tile(wx, wy);
if(tile != null && tile.solid()){
for(int i = 0; i < 4; i++){
Tile other = tile.nearby(i);
if(other == null || !other.solid()){
Lines.line(
wx * tilesize + edges[i*2] * tilesize/2f,
wy * tilesize + edges[i*2+1] * tilesize/2f,
wx * tilesize + edges[((i + 1) % 4)*2] * tilesize/2f,
wy * tilesize + edges[((i + 1) % 4)*2+1] * tilesize/2f
);
}
}
}
if(debugDrawAvoidance && tile != null){
int[] avoid = avoidance.getAvoidance();
if(avoid != null && avoid[tile.array()] != 0){
Draw.color(0f, 1f, 1f, 0.25f);
Fill.square(tile.worldx(), tile.worldy(), 4f);
}
}
}
}
Groups.draw.each(d -> {
if(d instanceof Unit u && rect.overlaps(Tmp.r1.setCentered(u.x, u.y, d.clipSize())) && !u.isFlying()){
u.hitboxTile(Tmp.r1);
Lines.rect(Tmp.r1);
}
});
//physics hitboxes
Lines.stroke(0.5f);
Draw.color(Color.red, 0.5f);
Groups.draw.each(d -> {
if(d instanceof Unit u && rect.overlaps(Tmp.r1.setCentered(u.x, u.y, u.clipSize()))){
Lines.circle(u.x, u.y, u.hitSize * unitCollisionRadiusScale);
}
});
Draw.reset();
});
Draw.reset();
}
}
+2 -2
View File
@@ -35,7 +35,6 @@ public class Binding{
schematicFlipY = KeyBind.add("schematic_flip_y", KeyCode.x), schematicFlipY = KeyBind.add("schematic_flip_y", KeyCode.x),
schematicMenu = KeyBind.add("schematic_menu", KeyCode.t), schematicMenu = KeyBind.add("schematic_menu", KeyCode.t),
commandMode = KeyBind.add("command_mode", KeyCode.shiftLeft, "command"), commandMode = KeyBind.add("command_mode", KeyCode.shiftLeft, "command"),
commandQueue = KeyBind.add("command_queue", KeyCode.mouseMiddle), commandQueue = KeyBind.add("command_queue", KeyCode.mouseMiddle),
createControlGroup = KeyBind.add("create_control_group", KeyCode.controlLeft), createControlGroup = KeyBind.add("create_control_group", KeyCode.controlLeft),
@@ -103,7 +102,8 @@ public class Binding{
chatHistoryNext = KeyBind.add("chat_history_next", KeyCode.down), chatHistoryNext = KeyBind.add("chat_history_next", KeyCode.down),
chatScroll = KeyBind.add("chat_scroll", new Axis(KeyCode.scroll)), chatScroll = KeyBind.add("chat_scroll", new Axis(KeyCode.scroll)),
chatMode = KeyBind.add("chat_mode", KeyCode.tab), chatMode = KeyBind.add("chat_mode", KeyCode.tab),
console = KeyBind.add("console", KeyCode.f8) console = KeyBind.add("console", KeyCode.f8),
debugHitboxes = KeyBind.add("debug_hitboxes", KeyCode.unset)
; ;
//dummy static class initializer //dummy static class initializer
@@ -234,6 +234,10 @@ public class DesktopInput extends InputHandler{
boolean detached = settings.getBool("detach-camera", false); boolean detached = settings.getBool("detach-camera", false);
if(!scene.hasField() && !scene.hasDialog()){ if(!scene.hasField() && !scene.hasDialog()){
if(input.keyTap(Binding.debugHitboxes)){
drawDebugHitboxes = !drawDebugHitboxes;
}
if(input.keyTap(Binding.detachCamera)){ if(input.keyTap(Binding.detachCamera)){
settings.put("detach-camera", detached = !detached); settings.put("detach-camera", detached = !detached);
if(!detached){ if(!detached){
+8 -4
View File
@@ -372,15 +372,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
//make sure its current stance is valid with its current command //make sure its current stance is valid with its current command
stancesOut.clear(); stancesOut.clear();
unit.type.getUnitStances(unit, stancesOut); unit.type.getUnitStances(unit, stancesOut);
if(stancesOut.size > 0 && !stancesOut.contains(ai.stance)){ for(var stance : content.unitStances()){
ai.stance = stancesOut.first(); //disable stances that the unit does not support anymore (TODO: this is slow!)
if(ai.hasStance(stance) && !stancesOut.contains(stance)){
ai.disableStance(stance);
}
} }
} }
} }
} }
@Remote(called = Loc.server, targets = Loc.both, forward = true) @Remote(called = Loc.server, targets = Loc.both, forward = true)
public static void setUnitStance(Player player, int[] unitIds, UnitStance stance){ public static void setUnitStance(Player player, int[] unitIds, UnitStance stance, boolean enable){
if(player == null || unitIds == null || stance == null) return; if(player == null || unitIds == null || stance == null) return;
if(net.server() && !netServer.admins.allowAction(player, ActionType.commandUnits, event -> { if(net.server() && !netServer.admins.allowAction(player, ActionType.commandUnits, event -> {
@@ -395,7 +398,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
if(stance == UnitStance.stop){ //not a real stance, just cancels orders if(stance == UnitStance.stop){ //not a real stance, just cancels orders
ai.clearCommands(); ai.clearCommands();
}else if(unit.type.allowStance(unit, stance)){ }else if(unit.type.allowStance(unit, stance)){
ai.stance = stance; //if toggle is not allowed, the stance will always be set to true when pressed
ai.setStance(stance, !stance.toggle || enable);
} }
unit.lastCommanded = player.coloredName(); unit.lastCommanded = player.coloredName();
} }
+22 -8
View File
@@ -362,7 +362,7 @@ public class TypeIO{
public static UnitStance readStance(Reads read){ public static UnitStance readStance(Reads read){
int val = read.ub(); int val = read.ub();
//never returns null //never returns null
return val == 255 || val >= content.unitStances().size ? UnitStance.shoot : content.unitStance(val); return val == 255 || val >= content.unitStances().size ? UnitStance.stop : content.unitStance(val);
} }
public static void writeEntity(Writes write, Entityc entity){ public static void writeEntity(Writes write, Entityc entity){
@@ -523,7 +523,7 @@ public class TypeIO{
write.b(3); write.b(3);
write.i(logic.controller.pos()); write.i(logic.controller.pos());
}else if(control instanceof CommandAI ai){ }else if(control instanceof CommandAI ai){
write.b(8); write.b(9);
write.bool(ai.attackTarget != null); write.bool(ai.attackTarget != null);
write.bool(ai.targetPos != null); write.bool(ai.targetPos != null);
@@ -559,7 +559,16 @@ public class TypeIO{
} }
} }
writeStance(write, ai.stance); int count = content.unitStances().count(ai::hasStance);
write.b(count);
for(var stance : content.unitStances()){
if(ai.hasStance(stance)){
writeStance(write, stance);
}
}
}else if(control instanceof AssemblerAI){ //hate }else if(control instanceof AssemblerAI){ //hate
write.b(5); write.b(5);
}else{ }else{
@@ -591,8 +600,8 @@ public class TypeIO{
out.controller = world.build(pos); out.controller = world.build(pos);
return out; return out;
} }
//type 4 is the old CommandAI with no commandIndex, type 6 is the new one with the index as a single byte, type 7 is the one with the command queue, 8 adds a stance //type 4 is the old CommandAI with no commandIndex, type 6 is the new one with the index as a single byte, type 7 is the one with the command queue, 8 adds a stance, 9 adds multiple stances
}else if(type == 4 || type == 6 || type == 7 || type == 8){ }else if(type == 4 || type == 6 || type == 7 || type == 8 || type == 9){
CommandAI ai = prev instanceof CommandAI pai ? pai : new CommandAI(); CommandAI ai = prev instanceof CommandAI pai ? pai : new CommandAI();
boolean hasAttack = read.bool(), hasPos = read.bool(); boolean hasAttack = read.bool(), hasPos = read.bool();
@@ -616,14 +625,14 @@ public class TypeIO{
ai.attackTarget = null; ai.attackTarget = null;
} }
if(type == 6 || type == 7 || type == 8){ if(type == 6 || type == 7 || type == 8 || type == 9){
byte id = read.b(); byte id = read.b();
ai.command = id < 0 ? null : content.unitCommand(id); ai.command = id < 0 ? null : content.unitCommand(id);
if(ai.command == null) ai.command = UnitCommand.moveCommand; if(ai.command == null) ai.command = UnitCommand.moveCommand;
} }
//command queue only in type 7/8 //command queue only in type 7/8
if(type == 7 || type == 8){ if(type == 7 || type == 8 || type == 9){
ai.commandQueue.clear(); ai.commandQueue.clear();
int length = read.ub(); int length = read.ub();
for(int i = 0; i < length; i++){ for(int i = 0; i < length; i++){
@@ -646,7 +655,12 @@ public class TypeIO{
} }
if(type == 8){ if(type == 8){
ai.stance = readStance(read); ai.setStance(readStance(read));
}else if(type == 9){
int stances = read.ub();
for(int i = 0; i < stances; i++){
ai.setStance(readStance(read));
}
} }
return ai; return ai;
+11
View File
@@ -28,6 +28,17 @@ public enum ConditionOp{
this.objFunction = objFunction; this.objFunction = objFunction;
} }
public boolean test(LVar va, LVar vb){
if(this == ConditionOp.strictEqual){
return va.isobj == vb.isobj && ((va.isobj && va.objval == vb.objval) || (!va.isobj && va.numval == vb.numval));
}
if(objFunction != null && va.isobj && vb.isobj){
//use object function if both are objects
return objFunction.get(va.obj(), vb.obj());
}
return function.get(va.num(), vb.num());
}
@Override @Override
public String toString(){ public String toString(){
return symbol; return symbol;
+2
View File
@@ -147,6 +147,8 @@ public class GlobalVars{
put("@" + sensor.name(), sensor); put("@" + sensor.name(), sensor);
} }
LStatement.nameToAlign.each((name, align) -> put("@" + name, align));
logicIdToContent = new UnlockableContent[ContentType.all.length][]; logicIdToContent = new UnlockableContent[ContentType.all.length][];
contentIdToLogicId = new int[ContentType.all.length][]; contentIdToLogicId = new int[ContentType.all.length][];
+1 -1
View File
@@ -40,7 +40,7 @@ public enum LAccess{
cameraHeight, cameraHeight,
displayWidth, displayWidth,
displayHeight, displayHeight,
bufferUsage, bufferSize,
operations, operations,
size, size,
solid, solid,
+42 -62
View File
@@ -25,10 +25,8 @@ import mindustry.ui.*;
import mindustry.world.*; import mindustry.world.*;
import mindustry.world.blocks.environment.*; import mindustry.world.blocks.environment.*;
import mindustry.world.blocks.logic.*; import mindustry.world.blocks.logic.*;
import mindustry.world.blocks.logic.CanvasBlock.*;
import mindustry.world.blocks.logic.LogicBlock.*; import mindustry.world.blocks.logic.LogicBlock.*;
import mindustry.world.blocks.logic.LogicDisplay.*; import mindustry.world.blocks.logic.LogicDisplay.*;
import mindustry.world.blocks.logic.MemoryBlock.*;
import mindustry.world.blocks.logic.MessageBlock.*; import mindustry.world.blocks.logic.MessageBlock.*;
import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.payloads.*;
import mindustry.world.meta.*; import mindustry.world.meta.*;
@@ -516,14 +514,14 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
Object obj = target.obj(); Object obj = target.obj();
if(obj instanceof Building b && (exec.privileged || (b.team == exec.team && exec.linkIds.contains(b.id)))){ if(obj instanceof Building b && (exec.privileged || (exec.build != null && exec.build.validLink(b)))){
if(type == LAccess.enabled && !p1.bool()){ if(type == LAccess.enabled){
if(p1.bool()){
b.noSleep();
}else{
b.lastDisabler = exec.build; b.lastDisabler = exec.build;
} }
if(type == LAccess.enabled && p1.bool()){
b.noSleep();
} }
if(type.isObj && p1.isobj){ if(type.isObj && p1.isobj){
@@ -568,22 +566,15 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
Object targetObj = target.obj();
if(targetObj instanceof LReadable read){
if(!read.readable(exec)) return;
read.read(position, output);
}else{
int address = position.numi(); int address = position.numi();
Building from = target.building(); if(targetObj instanceof CharSequence str){
if(from instanceof MemoryBuild mem && (exec.privileged || (from.team == exec.team && !mem.block.privileged))){
output.setnum(address < 0 || address >= mem.memory.length ? 0 : mem.memory[address]);
}else if(from instanceof LogicBuild logic && (exec.privileged || (from.team == exec.team && !from.block.privileged)) && position.isobj && position.objval instanceof String name){
LVar fromVar = logic.executor.optionalVar(name);
if(fromVar != null && !output.constant){
output.objval = fromVar.objval;
output.numval = fromVar.numval;
output.isobj = fromVar.isobj;
}
}else if(target.isobj && target.objval instanceof CharSequence str){
output.setnum(address < 0 || address >= str.length() ? Double.NaN : (int)str.charAt(address)); output.setnum(address < 0 || address >= str.length() ? Double.NaN : (int)str.charAt(address));
}else if(from instanceof CanvasBuild canvas && (exec.privileged || (from.team == exec.team))){ }
output.setnum(canvas.getPixel(address));
} }
} }
} }
@@ -602,20 +593,10 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
int address = position.numi(); Object targetObj = target.obj();
Building from = target.building(); if(targetObj instanceof LWritable write){
if(!write.writable(exec)) return;
if(from instanceof MemoryBuild mem && (exec.privileged || (from.team == exec.team && !mem.block.privileged)) && address >= 0 && address < mem.memory.length){ write.write(position, value);
mem.memory[address] = value.num();
}else if(from instanceof LogicBuild logic && (exec.privileged || (from.team == exec.team && !from.block.privileged)) && position.isobj && position.objval instanceof String name){
LVar toVar = logic.executor.optionalVar(name);
if(toVar != null && !toVar.constant){
toVar.objval = value.objval;
toVar.numval = value.numval;
toVar.isobj = value.isobj;
}
}else if(from instanceof CanvasBuild canvas && (exec.privileged || (from.team == exec.team))){
canvas.setPixel(address, value.numi());
} }
} }
} }
@@ -658,7 +639,7 @@ public class LExecutor{
} }
} }
}else{ }else{
if(target instanceof CharSequence seq && sense == LAccess.size){ if(target instanceof CharSequence seq && (sense == LAccess.size || sense == LAccess.bufferSize)){
to.setnum(seq.length()); to.setnum(seq.length());
return; return;
} }
@@ -785,15 +766,7 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
if(!to.constant){ if(!to.constant) to.set(from);
if(from.isobj){
to.objval = from.objval;
to.isobj = true;
}else{
to.numval = LVar.invalid(from.numval) ? 0 : from.numval;
to.isobj = false;
}
}
} }
} }
@@ -829,6 +802,28 @@ public class LExecutor{
} }
} }
public static class SelectI implements LInstruction{
public ConditionOp op = ConditionOp.notEqual;
public LVar result, comp0, comp1, a, b;
public SelectI(ConditionOp op, LVar result, LVar comp0, LVar comp1, LVar a, LVar b){
this.op = op;
this.result = result;
this.comp0 = comp0;
this.comp1 = comp1;
this.a = a;
this.b = b;
}
public SelectI(){}
@Override
public void run(LExecutor exec){
if(result.constant) return;
result.set(op.test(comp0, comp1) ? a : b);
}
}
public static class EndI implements LInstruction{ public static class EndI implements LInstruction{
@Override @Override
@@ -883,7 +878,7 @@ public class LExecutor{
int advance = (int)data.spaceXadvance, lineHeight = (int)data.lineHeight; int advance = (int)data.spaceXadvance, lineHeight = (int)data.lineHeight;
int xOffset, yOffset; int xOffset, yOffset;
int align = p1.id; //p1 is not a variable, it's a raw align value. what a massive hack int align = p1.numi();
int maxWidth = 0, lines = 1, lineWidth = 0; int maxWidth = 0, lines = 1, lineWidth = 0;
for(int i = 0; i < str.length(); i++){ for(int i = 0; i < str.length(); i++){
@@ -1134,26 +1129,11 @@ public class LExecutor{
@Override @Override
public void run(LExecutor exec){ public void run(LExecutor exec){
if(address != -1){ if(address != -1 && op.test(value, compare)){
LVar va = value;
LVar vb = compare;
boolean cmp;
if(op == ConditionOp.strictEqual){
cmp = va.isobj == vb.isobj && ((va.isobj && va.objval == vb.objval) || (!va.isobj && va.numval == vb.numval));
}else if(op.objFunction != null && va.isobj && vb.isobj){
//use object function if both are objects
cmp = op.objFunction.get(value.obj(), compare.obj());
}else{
cmp = op.function.get(value.num(), compare.num());
}
if(cmp){
exec.counter.numval = address; exec.counter.numval = address;
} }
} }
} }
}
public static class WaitI implements LInstruction{ public static class WaitI implements LInstruction{
public LVar value; public LVar value;
@@ -18,6 +18,8 @@ public enum LMarkerControl{
flushText("fetch"), flushText("fetch"),
fontSize("size"), fontSize("size"),
textHeight("height"), textHeight("height"),
textAlign("align"),
lineAlign("align"),
labelFlags("background", "outline"), labelFlags("background", "outline"),
texture("printFlush", "name"), texture("printFlush", "name"),
textureSize("width", "height"), textureSize("width", "height"),
+6
View File
@@ -0,0 +1,6 @@
package mindustry.logic;
public interface LReadable{
boolean readable(LExecutor exec);
void read(LVar position, LVar output);
}
+49 -1
View File
@@ -23,6 +23,25 @@ import static mindustry.logic.LCanvas.*;
* A statement is an intermediate representation of an instruction, to be used mostly in UI. * A statement is an intermediate representation of an instruction, to be used mostly in UI.
* Contains all relevant variable information. */ * Contains all relevant variable information. */
public abstract class LStatement{ public abstract class LStatement{
private static final String[] aligns = {"topLeft", "top", "topRight", "left", "center", "right", "bottomLeft", "bottom", "bottomRight"};
public static final ObjectMap<String, Integer> nameToAlign = ObjectMap.of(
"center", Align.center,
"top", Align.top,
"bottom", Align.bottom,
"left", Align.left,
"right", Align.right,
"topLeft", Align.topLeft,
"topRight", Align.topRight,
"bottomLeft", Align.bottomLeft,
"bottomRight", Align.bottomRight
);
public static final IntMap<String> alignToName = new IntMap<>();
static {
nameToAlign.each((k, v) -> alignToName.put(v, k));
}
public transient @Nullable StatementElem elem; public transient @Nullable StatementElem elem;
public abstract void build(Table table); public abstract void build(Table table);
@@ -175,7 +194,36 @@ public abstract class LStatement{
showSelect(b, values, current, getter, 4, c -> {}); showSelect(b, values, current, getter, 4, c -> {});
} }
protected void showSelectTable(Button b, Cons2<Table, Runnable> hideCons){ protected void fieldAlignSelect(Table t, Prov<String> get, Cons<String> set, boolean hor, boolean ver) {
t.button(b -> {
b.image(Icon.pencilSmall);
b.clicked(() -> {
var current = get.get();
showAlignSelect(b, current.startsWith("@") ? nameToAlign.get(current.substring(1), -1) : -1, align -> set.get("@" + alignToName.get(align)), hor, ver);
});
}, Styles.logict, () -> {}).size(40f).color(t.color).left().padLeft(-10);
}
public static void showAlignSelect(Button b, int current, Intc setter, boolean hor, boolean ver) {
showSelectTable(b, (t, hide) -> {
t.defaults().size(150f, 40f);
int i = 0;
for(String align : aligns){
int val = nameToAlign.get(align);
if(!hor && !Align.isCenterHorizontal(val)) continue;
if(!ver && !Align.isCenterVertical(val)) continue;
t.button(align, Styles.logicTogglet, () -> {
setter.get(val);
hide.run();
}).checked(current == nameToAlign.get(align)).grow();
if (++i % 3 == 0) t.row();
}
});
}
protected static void showSelectTable(Button b, Cons2<Table, Runnable> hideCons){
Table t = new Table(Tex.paneSolid){ Table t = new Table(Tex.paneSolid){
@Override @Override
public float getPrefHeight(){ public float getPrefHeight(){
+78 -32
View File
@@ -6,7 +6,6 @@ import arc.graphics.*;
import arc.scene.style.*; import arc.scene.style.*;
import arc.scene.ui.*; import arc.scene.ui.*;
import arc.scene.ui.layout.*; import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*; import arc.util.*;
import mindustry.*; import mindustry.*;
import mindustry.annotations.Annotations.*; import mindustry.annotations.Annotations.*;
@@ -123,19 +122,6 @@ public class LStatements{
@RegisterStatement("draw") @RegisterStatement("draw")
public static class DrawStatement extends LStatement{ public static class DrawStatement extends LStatement{
static final String[] aligns = {"center", "top", "bottom", "left", "right", "topLeft", "topRight", "bottomLeft", "bottomRight"};
//yes, boxing Integer is gross but this is easier to construct and Integers <128 don't allocate anyway
static final ObjectMap<String, Integer> nameToAlign = ObjectMap.of(
"center", Align.center,
"top", Align.top,
"bottom", Align.bottom,
"left", Align.left,
"right", Align.right,
"topLeft", Align.topLeft,
"topRight", Align.topRight,
"bottomLeft", Align.bottomLeft,
"bottomRight", Align.bottomRight
);
public GraphicsType type = GraphicsType.clear; public GraphicsType type = GraphicsType.clear;
public String x = "0", y = "0", p1 = "0", p2 = "0", p3 = "0", p4 = "0"; public String x = "0", y = "0", p1 = "0", p2 = "0", p3 = "0", p4 = "0";
@@ -165,7 +151,7 @@ public class LStatements{
} }
if(type == GraphicsType.print){ if(type == GraphicsType.print){
p1 = "bottomLeft"; p1 = "@bottomLeft";
} }
rebuild(table); rebuild(table);
@@ -253,13 +239,11 @@ public class LStatements{
row(s); row(s);
s.add("align "); s.add("align ");
fields(s, "align", p1, v -> p1 = v);
s.button(b -> { fieldAlignSelect(s, () -> p1, v -> {
b.label(() -> nameToAlign.containsKey(p1) ? p1 : "bottomLeft"); p1 = v;
b.clicked(() -> showSelect(b, aligns, p1, t -> { rebuild(table);
p1 = t; }, true, true);
}, 2, cell -> cell.size(165, 50)));
}, Styles.logict, () -> {}).size(165, 40).color(s.color).left().padLeft(2);
} }
case translate, scale -> { case translate, scale -> {
fields(s, "x", x, v -> x = v); fields(s, "x", x, v -> x = v);
@@ -278,12 +262,15 @@ public class LStatements{
if(type == GraphicsType.color && p2.equals("0")){ if(type == GraphicsType.color && p2.equals("0")){
p2 = "255"; p2 = "255";
} }
if(type == GraphicsType.print && nameToAlign.get(p1) != null){
p1 = "@" + p1;
}
} }
@Override @Override
public LInstruction build(LAssembler builder){ public LInstruction build(LAssembler builder){
return new DrawI((byte)type.ordinal(), builder.var(x), builder.var(y), return new DrawI((byte)type.ordinal(), builder.var(x), builder.var(y), builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4));
type == GraphicsType.print ? new LVar(p1, nameToAlign.get(p1, Align.bottomLeft), true) : builder.var(p1), builder.var(p2), builder.var(p3), builder.var(p4));
} }
@Override @Override
@@ -793,6 +780,55 @@ public class LStatements{
} }
} }
@RegisterStatement("select")
public static class SelectStatement extends LStatement{
public String result = "result";
public ConditionOp op = ConditionOp.notEqual;
public String comp0 = "x", comp1 = "false", a = "a", b = "b";
@Override
public void build(Table table){
rebuild(table);
}
private void rebuild(Table table){
table.clearChildren();
table.left();
table.table(t -> {
t.setColor(table.color);
field(t, result, str -> result = str);
t.add(" = if ");
JumpStatement.addOp(this, t, op, o -> {
op = o;
rebuild(table);
}, comp0, str -> comp0 = str, comp1, str -> comp1 = str);
}).left();
table.row();
table.table(t -> {
t.setColor(table.color);
t.add("then ");
field(t, a, str -> a = str);
t.add(" else ");
field(t, b, str -> b = str);
}).left();
}
@Override
public LInstruction build(LAssembler builder){
return new SelectI(op, builder.var(result), builder.var(comp0), builder.var(comp1), builder.var(a), builder.var(b));
}
@Override
public LCategory category(){
return LCategory.operation;
}
}
@RegisterStatement("wait") @RegisterStatement("wait")
public static class WaitStatement extends LStatement{ public static class WaitStatement extends LStatement{
public String value = "0.5"; public String value = "0.5";
@@ -984,17 +1020,22 @@ public class LStatements{
table.clearChildren(); table.clearChildren();
table.setColor(last); table.setColor(last);
if(op != ConditionOp.always) field(table, value, str -> value = str); addOp(this, table, op, o -> {
table.button(b -> {
b.label(() -> op.symbol);
b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> {
op = o; op = o;
rebuild(table); rebuild(table);
})); }, value, str -> value = str, compare, str -> compare = str);
}, Styles.logict, () -> {}).size(op == ConditionOp.always ? 80f : 48f, 40f).pad(4f).color(table.color); }
if(op != ConditionOp.always) field(table, compare, str -> compare = str); public static void addOp(LStatement st, Table t, ConditionOp op, Cons<ConditionOp> getter, String comp0, Cons<String> set0, String comp1, Cons<String> set2){
if(op != ConditionOp.always) st.field(t, comp0, set0);
t.button(b -> {
b.add(op.symbol);
b.clicked(() -> st.showSelect(b, ConditionOp.all, op, getter));
}, Styles.logict, () -> {
}).size(op == ConditionOp.always ? 80f : 48f, 40f).pad(4f).color(t.color);
if(op != ConditionOp.always) st.field(t, comp1, set2);
} }
//elements need separate conversion logic //elements need separate conversion logic
@@ -2345,6 +2386,11 @@ public class LStatements{
}).width(240f).left(); }).width(240f).left();
})); }));
}, Styles.logict, () -> {}).size(40f).padLeft(-11).color(table.color); }, Styles.logict, () -> {}).size(40f).padLeft(-11).color(table.color);
}else if(type == LMarkerControl.textAlign || type == LMarkerControl.lineAlign){
fieldAlignSelect(t, () -> p1, v -> {
p1 = v;
rebuild(table);
}, true, type != LMarkerControl.lineAlign);
} }
}); });
+6
View File
@@ -101,6 +101,12 @@ public class LVar{
isobj = true; isobj = true;
} }
public void set(LVar other){
isobj = other.isobj;
objval = other.objval;
numval = other.numval;
}
public static boolean invalid(double d){ public static boolean invalid(double d){
return Double.isNaN(d) || Double.isInfinite(d); return Double.isNaN(d) || Double.isInfinite(d);
} }
+6
View File
@@ -0,0 +1,6 @@
package mindustry.logic;
public interface LWritable{
boolean writable(LExecutor exec);
void write(LVar position, LVar value);
}
+1 -1
View File
@@ -798,7 +798,7 @@ public class Mods implements Loadable{
public void reload(){ public void reload(){
newImports.each(this::updateDependencies); newImports.each(this::updateDependencies);
newImports.remove(m -> m.missingDependencies.isEmpty() && m.softDependencies.isEmpty()); newImports.removeAll(m -> m.missingDependencies.isEmpty() && m.softDependencies.isEmpty());
if(newImports.any()){ if(newImports.any()){
checkDependencies(newImports, newImports.contains(m -> m.softDependencies.any())); checkDependencies(newImports, newImports.contains(m -> m.softDependencies.any()));
+2 -1
View File
@@ -700,6 +700,7 @@ public class UnitType extends UnlockableContent implements Senseable{
return (envEnabled & env) != 0 && (envDisabled & env) == 0 && (envRequired == 0 || (envRequired & env) == envRequired); return (envEnabled & env) != 0 && (envDisabled & env) == 0 && (envRequired == 0 || (envRequired & env) == envRequired);
} }
@Override
public boolean isBanned(){ public boolean isBanned(){
return state.rules.isBanned(this); return state.rules.isBanned(this);
} }
@@ -1038,7 +1039,7 @@ public class UnitType extends UnlockableContent implements Senseable{
if(stances.size == 0){ if(stances.size == 0){
if(canAttack){ if(canAttack){
stances.addAll(UnitStance.stop, UnitStance.shoot, UnitStance.holdFire, UnitStance.pursueTarget, UnitStance.patrol); stances.addAll(UnitStance.stop, UnitStance.holdFire, UnitStance.pursueTarget, UnitStance.patrol);
if(!flying){ if(!flying){
stances.add(UnitStance.ram); stances.add(UnitStance.ram);
} }
@@ -17,7 +17,6 @@ import mindustry.gen.*;
import mindustry.graphics.*; import mindustry.graphics.*;
import mindustry.type.*; import mindustry.type.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.world.*;
import static arc.Core.*; import static arc.Core.*;
import static mindustry.Vars.*; import static mindustry.Vars.*;
@@ -95,7 +94,7 @@ public class DatabaseDialog extends BaseDialog{
if(++i % 10 == 0) t.row(); if(++i % 10 == 0) t.row();
} }
}).row();; }).row();
for(int j = 0; j < allContent.length; j++){ for(int j = 0; j < allContent.length; j++){
ContentType type = ContentType.all[j]; ContentType type = ContentType.all[j];
@@ -106,6 +105,11 @@ public class DatabaseDialog extends BaseDialog{
if(array.size == 0) continue; if(array.size == 0) continue;
//sorting only makes sense when in-game; otherwise, banned blocks can't exist
if(state.isGame()){
array.sort(Structs.comps(Structs.comparingBool(UnlockableContent::isBanned), Structs.comparingInt(u -> u.id)));
}
all.add("@content." + type.name() + ".name").growX().left().color(Pal.accent); all.add("@content." + type.name() + ".name").growX().left().color(Pal.accent);
all.row(); all.row();
all.image().growX().pad(5).padLeft(0).padRight(0).height(3).color(Pal.accent); all.image().growX().pad(5).padLeft(0).padRight(0).height(3).color(Pal.accent);
@@ -116,13 +120,11 @@ public class DatabaseDialog extends BaseDialog{
int cols = (int)Mathf.clamp((Core.graphics.getWidth() - Scl.scl(30)) / Scl.scl(32 + 12), 1, 22); int cols = (int)Mathf.clamp((Core.graphics.getWidth() - Scl.scl(30)) / Scl.scl(32 + 12), 1, 22);
int count = 0; int count = 0;
for(int i = 0; i < array.size; i++){ for(var unlock : array){
UnlockableContent unlock = array.get(i);
Image image = unlocked(unlock) ? new Image(new TextureRegionDrawable(unlock.uiIcon), mobile ? Color.white : Color.lightGray).setScaling(Scaling.fit) : new Image(Icon.lock, Pal.gray); Image image = unlocked(unlock) ? new Image(new TextureRegionDrawable(unlock.uiIcon), mobile ? Color.white : Color.lightGray).setScaling(Scaling.fit) : new Image(Icon.lock, Pal.gray);
//banned cross //banned cross
if(state.isGame() && (unlock instanceof UnitType u && u.isBanned() || unlock instanceof Block b && state.rules.isBanned(b))){ if(state.isGame() && unlock.isBanned()){
list.stack(image, new Image(Icon.cancel){{ list.stack(image, new Image(Icon.cancel){{
setColor(Color.scarlet); setColor(Color.scarlet);
touchable = Touchable.disabled; touchable = Touchable.disabled;
@@ -1274,7 +1274,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{
if(sector.isAttacked()){ if(sector.isAttacked()){
addSurvivedInfo(sector, stable, false); addSurvivedInfo(sector, stable, false);
}else if(sector.hasBase() && sector.planet.campaignRules.sectorInvasion && sector.near().contains(Sector::hasEnemyBase)){ }else if(sector.hasBase() && sector.planet.campaignRules.sectorInvasion && sector.near().contains(s -> s.hasEnemyBase() && (s.preset == null || !s.preset.requireUnlock))){
stable.add("@sectors.vulnerable"); stable.add("@sectors.vulnerable");
stable.row(); stable.row();
}else if(!sector.hasBase() && sector.hasEnemyBase()){ }else if(!sector.hasBase() && sector.hasEnemyBase()){
@@ -474,6 +474,9 @@ public class SettingsMenuDialog extends BaseDialog{
} }
graphics.checkPref("minimap", !mobile); graphics.checkPref("minimap", !mobile);
graphics.checkPref("smoothcamera", true); graphics.checkPref("smoothcamera", true);
if(!mobile){
graphics.checkPref("detach-camera", false);
}
graphics.checkPref("position", false); graphics.checkPref("position", false);
if(!mobile){ if(!mobile){
graphics.checkPref("mouseposition", false); graphics.checkPref("mouseposition", false);
@@ -581,7 +581,7 @@ public class PlacementFragment{
for(var stance : stances){ for(var stance : stances){
coms.button(stance.getIcon(), Styles.clearNoneTogglei, () -> { coms.button(stance.getIcon(), Styles.clearNoneTogglei, () -> {
Call.setUnitStance(player, units.mapInt(un -> un.id, un -> un.type.allowStance(un, stance)).toArray(), stance); Call.setUnitStance(player, units.mapInt(un -> un.id, un -> un.type.allowStance(un, stance)).toArray(), stance, !activeStances.get(stance.id));
}).checked(i -> activeStances.get(stance.id)).size(50f).tooltip(stance.localized(), true); }).checked(i -> activeStances.get(stance.id)).size(50f).tooltip(stance.localized(), true);
if(++scol % 6 == 0) coms.row(); if(++scol % 6 == 0) coms.row();
@@ -604,7 +604,7 @@ public class PlacementFragment{
for(var unit : control.input.selectedUnits){ for(var unit : control.input.selectedUnits){
if(unit.controller() instanceof CommandAI cmd){ if(unit.controller() instanceof CommandAI cmd){
activeCommands.set(cmd.command.id); activeCommands.set(cmd.command.id);
activeStances.set(cmd.stance.id); activeStances.set(cmd.stances);
} }
stancesOut.clear(); stancesOut.clear();
@@ -631,7 +631,7 @@ public class PlacementFragment{
for(UnitStance stance : stances){ for(UnitStance stance : stances){
//first stance must always be the stop stance //first stance must always be the stop stance
if(stance.keybind != null && Core.input.keyTap(stance.keybind)){ if(stance.keybind != null && Core.input.keyTap(stance.keybind)){
Call.setUnitStance(player, control.input.selectedUnits.mapInt(un -> un.id, un -> un.type.allowStance(un, stance)).toArray(), stance); Call.setUnitStance(player, control.input.selectedUnits.mapInt(un -> un.id, un -> un.type.allowStance(un, stance)).toArray(), stance, !activeStances.get(stance.id));
} }
} }
+7 -2
View File
@@ -923,11 +923,16 @@ public class Block extends UnlockableContent implements Senseable{
} }
public boolean isVisible(){ public boolean isVisible(){
return !isHidden() && (state.rules.editor || (!state.rules.hideBannedBlocks || !state.rules.isBanned(this))); return !isHidden() && (state.rules.editor || (!state.rules.hideBannedBlocks || !isBanned()));
} }
public boolean isPlaceable(){ public boolean isPlaceable(){
return isVisible() && (!state.rules.isBanned(this) || state.rules.editor) && supportsEnv(state.rules.env); return isVisible() && (!isBanned() || state.rules.editor) && supportsEnv(state.rules.env);
}
@Override
public boolean isBanned(){
return state.rules.isBanned(this);
} }
/** @return whether this block supports a specific environment. */ /** @return whether this block supports a specific environment. */
@@ -94,7 +94,7 @@ public class LiquidTurret extends Turret{
var fire = Fires.get(x + tx, y + ty); var fire = Fires.get(x + tx, y + ty);
float dst = fire == null ? 0 : dst2(fire); float dst = fire == null ? 0 : dst2(fire);
//do not extinguish fires on other team blocks //do not extinguish fires on other team blocks
if(other != null && fire != null && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){ if(other != null && fire != null && other.build != this && Fires.has(other.x, other.y) && dst <= range * range && (result == null || dst < mindst) && (other.build == null || other.team() == team)){
result = fire; result = fire;
mindst = dst; mindst = dst;
} }
@@ -96,8 +96,7 @@ public class DirectionalUnloader extends Block{
front.handleItem(this, item); front.handleItem(this, item);
back.items.remove(item, 1); back.items.remove(item, 1);
back.itemTaken(item); back.itemTaken(item);
offset ++; offset = item.id + 1;
offset %= itemc;
break; break;
} }
} }
@@ -376,6 +376,11 @@ public class Floor extends Block{
return (other.realBlendId(otherTile) > realBlendId(tile) || edges(tile.x, tile.y) == null); return (other.realBlendId(otherTile) > realBlendId(tile) || edges(tile.x, tile.y) == null);
} }
/** @return whether being on this floor can damage a unit */
public boolean damages(){
return damageTaken > 0f || (status != null && status.damage > 0f);
}
public static class UpdateRenderState{ public static class UpdateRenderState{
public Tile tile; public Tile tile;
public Floor floor; public Floor floor;
@@ -146,7 +146,7 @@ public class CanvasBlock extends Block{
return result; return result;
} }
public class CanvasBuild extends Building{ public class CanvasBuild extends Building implements LReadable, LWritable{
public @Nullable Texture texture; public @Nullable Texture texture;
public byte[] data = new byte[Mathf.ceil(canvasSize * canvasSize * bitsPerPixel / 8f)]; public byte[] data = new byte[Mathf.ceil(canvasSize * canvasSize * bitsPerPixel / 8f)];
public int blending; public int blending;
@@ -226,6 +226,25 @@ public class CanvasBlock extends Block{
} }
} }
public boolean readable(LExecutor exec){
return exec.privileged || this.team == exec.team;
}
@Override
public void read(LVar position, LVar output){
output.setnum(getPixel(position.numi()));
}
@Override
public boolean writable(LExecutor exec){
return exec.privileged || this.team == exec.team;
}
@Override
public void write(LVar position, LVar value){
setPixel(position.numi(), value.numi());
}
boolean blends(Tile other){ boolean blends(Tile other){
return other != null && other.build != null && other.build.block == block && other.build.tileX() == other.x && other.build.tileY() == other.y; return other != null && other.build != null && other.build.block == block && other.build.tileX() == other.x && other.build.tileY() == other.y;
} }
@@ -82,17 +82,11 @@ public class LogicBlock extends Block{
int x = lbuild.tileX(), y = lbuild.tileY(); int x = lbuild.tileX(), y = lbuild.tileY();
LogicLink link = entity.links.find(l -> l.x == x && l.y == y); LogicLink link = entity.links.find(l -> l.x == x && l.y == y);
String bname = getLinkName(lbuild.block);
if(link != null){ if(link != null){
link.active = !link.active; entity.links.remove(link);
//find a name when the base name differs (new block type)
if(!link.name.startsWith(bname)){
link.name = "";
link.name = entity.findLinkName(lbuild.block);
}
//disable when unlinking //disable when unlinking
if(!link.active && lbuild.block.autoResetEnabled && lbuild.lastDisabler == entity){ if(lbuild.block.autoResetEnabled && lbuild.lastDisabler == entity){
lbuild.enabled = true; lbuild.enabled = true;
} }
}else{ }else{
@@ -148,12 +142,8 @@ public class LogicBlock extends Block{
stream.writeInt(bytes.length); stream.writeInt(bytes.length);
stream.write(bytes); stream.write(bytes);
int actives = links.count(l -> l.active); stream.writeInt(links.size);
stream.writeInt(actives);
for(LogicLink link : links){ for(LogicLink link : links){
if(!link.active) continue;
stream.writeUTF(link.name); stream.writeUTF(link.name);
stream.writeShort(link.x); stream.writeShort(link.x);
stream.writeShort(link.y); stream.writeShort(link.y);
@@ -207,11 +197,7 @@ public class LogicBlock extends Block{
String name = stream.readUTF(); String name = stream.readUTF();
short x = stream.readShort(), y = stream.readShort(); short x = stream.readShort(), y = stream.readShort();
Tmp.p2.set((int)(offset / (tilesize/2)), (int)(offset / (tilesize/2))); transformer.get(Tmp.p1.set(x, y));
transformer.get(Tmp.p1.set(x * 2, y * 2).sub(Tmp.p2));
Tmp.p1.add(Tmp.p2);
Tmp.p1.x /= 2;
Tmp.p1.y /= 2;
links.add(new LogicLink(Tmp.p1.x, Tmp.p1.y, name, true)); links.add(new LogicLink(Tmp.p1.x, Tmp.p1.y, name, true));
} }
@@ -224,7 +210,7 @@ public class LogicBlock extends Block{
} }
public static class LogicLink{ public static class LogicLink{
public boolean active = true, valid; public boolean valid;
public int x, y; public int x, y;
public String name; public String name;
public Building lastBuild; public Building lastBuild;
@@ -237,13 +223,11 @@ public class LogicBlock extends Block{
} }
public LogicLink copy(){ public LogicLink copy(){
LogicLink out = new LogicLink(x, y, name, valid); return new LogicLink(x, y, name, valid);
out.active = active;
return out;
} }
} }
public class LogicBuild extends Building implements Ranged{ public class LogicBuild extends Building implements Ranged, LReadable, LWritable{
/** logic "source code" as list of asm statements */ /** logic "source code" as list of asm statements */
public String code = ""; public String code = "";
public LExecutor executor = new LExecutor(); public LExecutor executor = new LExecutor();
@@ -357,18 +341,19 @@ public class LogicBlock extends Block{
//store connections //store connections
for(LogicLink link : links){ for(LogicLink link : links){
if(link.active && (link.valid = validLink(world.build(link.x, link.y)))){ link.valid = validLink(world.build(link.x, link.y));
if(link.valid){
asm.putConst(link.name, world.build(link.x, link.y)); asm.putConst(link.name, world.build(link.x, link.y));
} }
} }
//store link objects //store link objects
executor.links = new Building[links.count(l -> l.valid && l.active)]; executor.links = new Building[links.count(l -> l.valid)];
executor.linkIds.clear(); executor.linkIds.clear();
int index = 0; int index = 0;
for(LogicLink link : links){ for(LogicLink link : links){
if(link.active && link.valid){ if(link.valid){
Building build = world.build(link.x, link.y); Building build = world.build(link.x, link.y);
executor.links[index ++] = build; executor.links[index ++] = build;
if(build != null) executor.linkIds.add(build.id); if(build != null) executor.linkIds.add(build.id);
@@ -387,9 +372,7 @@ public class LogicBlock extends Block{
if(!var.constant){ if(!var.constant){
LVar dest = asm.getVar(var.name); LVar dest = asm.getVar(var.name);
if(dest != null && !dest.constant){ if(dest != null && !dest.constant){
dest.isobj = var.isobj; dest.set(var);
dest.objval = var.objval;
dest.numval = var.numval;
} }
} }
} }
@@ -497,8 +480,6 @@ public class LogicBlock extends Block{
for(int i = 0; i < links.size; i++){ for(int i = 0; i < links.size; i++){
LogicLink l = links.get(i); LogicLink l = links.get(i);
if(!l.active) continue;
var cur = world.build(l.x, l.y); var cur = world.build(l.x, l.y);
boolean valid = validLink(cur); boolean valid = validLink(cur);
@@ -551,6 +532,38 @@ public class LogicBlock extends Block{
} }
} }
@Override
public boolean readable(LExecutor exec){
return exec.privileged || (this.team == exec.team && !this.block.privileged);
}
@Override
public void read(LVar position, LVar output){
if(position.isobj && position.objval instanceof String varName){
LVar ret = executor.optionalVar(varName);
if(ret == null){
output.setnum(Double.NaN);
return;
}
if(output.constant) return;
output.set(ret);
}
}
@Override
public boolean writable(LExecutor exec){
return exec.privileged || (this.team == exec.team && !this.block.privileged);
}
@Override
public void write(LVar position, LVar value){
if(position.isobj && position.objval instanceof String varName){
LVar at = executor.optionalVar(varName);
if(at == null || at.constant) return;
at.set(value);
}
}
@Override @Override
public byte[] config(){ public byte[] config(){
return compress(code, relativeConnections()); return compress(code, relativeConnections());
@@ -577,7 +590,7 @@ public class LogicBlock extends Block{
for(LogicLink l : links){ for(LogicLink l : links){
Building build = world.build(l.x, l.y); Building build = world.build(l.x, l.y);
if(l.active && validLink(build)){ if(validLink(build)){
Drawf.square(build.x, build.y, build.block.size * tilesize / 2f + 1f, Pal.place); Drawf.square(build.x, build.y, build.block.size * tilesize / 2f + 1f, Pal.place);
} }
} }
@@ -585,7 +598,7 @@ public class LogicBlock extends Block{
//draw top text on separate layer //draw top text on separate layer
for(LogicLink l : links){ for(LogicLink l : links){
Building build = world.build(l.x, l.y); Building build = world.build(l.x, l.y);
if(l.active && validLink(build)){ if(validLink(build)){
build.block.drawPlaceText(l.name, build.tileX(), build.tileY(), true); build.block.drawPlaceText(l.name, build.tileX(), build.tileY(), true);
} }
} }
@@ -111,7 +111,7 @@ public class LogicDisplay extends Block{
public double sense(LAccess sensor){ public double sense(LAccess sensor){
return switch(sensor){ return switch(sensor){
case displayWidth, displayHeight -> displaySize; case displayWidth, displayHeight -> displaySize;
case bufferUsage -> commands.size; case bufferSize -> commands.size;
case operations -> operations; case operations -> operations;
default -> super.sense(sensor); default -> super.sense(sensor);
}; };
@@ -37,7 +37,7 @@ public class MemoryBlock extends Block{
return accessible(); return accessible();
} }
public class MemoryBuild extends Building{ public class MemoryBuild extends Building implements LReadable, LWritable{
public double[] memory = new double[memoryCapacity]; public double[] memory = new double[memoryCapacity];
//massive byte size means picking up causes sync issues //massive byte size means picking up causes sync issues
@@ -56,6 +56,29 @@ public class MemoryBlock extends Block{
return accessible(); return accessible();
} }
public boolean readable(LExecutor exec){
return exec.privileged || (this.team == exec.team && !this.block.privileged);
}
@Override
public void read(LVar position, LVar output){
int address = position.numi();
//Return null when out of bounds. (instead of 0)
output.setnum(address < 0 || address >= memory.length ? Double.NaN : memory[address]);
}
@Override
public boolean writable(LExecutor exec){
return exec.privileged || (this.team == exec.team && !this.block.privileged);
}
@Override
public void write(LVar position, LVar value){
int address = position.numi();
if(address < 0 || address >= memory.length) return;
memory[address] = value.num();
}
@Override @Override
public double sense(LAccess sensor){ public double sense(LAccess sensor){
return switch(sensor){ return switch(sensor){
@@ -14,6 +14,7 @@ import arc.util.io.*;
import arc.util.pooling.*; import arc.util.pooling.*;
import mindustry.core.*; import mindustry.core.*;
import mindustry.gen.*; import mindustry.gen.*;
import mindustry.logic.*;
import mindustry.ui.*; import mindustry.ui.*;
import mindustry.ui.dialogs.*; import mindustry.ui.dialogs.*;
import mindustry.world.*; import mindustry.world.*;
@@ -67,7 +68,7 @@ public class MessageBlock extends Block{
return accessible(); return accessible();
} }
public class MessageBuild extends Building{ public class MessageBuild extends Building implements LReadable{
public StringBuilder message = new StringBuilder(); public StringBuilder message = new StringBuilder();
@Override @Override
@@ -165,6 +166,25 @@ public class MessageBlock extends Block{
return !accessible() ? SystemCursor.arrow : super.getCursor(); return !accessible() ? SystemCursor.arrow : super.getCursor();
} }
@Override
public boolean readable(LExecutor exec){
return true;
}
@Override
public void read(LVar position, LVar output){
int address = position.numi();
output.setnum(address < 0 || address >= message.length() ? Double.NaN : message.charAt(address));
}
@Override
public double sense(LAccess sensor){
return switch(sensor){
case bufferSize -> message.length();
default -> super.sense(sensor);
};
}
@Override @Override
public void damage(float damage){ public void damage(float damage){
if(privileged) return; if(privileged) return;
@@ -228,7 +228,7 @@ public class PayloadLoader extends PayloadBlock{
return payload != null && ( return payload != null && (
exporting || exporting ||
(payload.block().hasLiquids && liquids.currentAmount() >= 0.1f && payload.build.liquids.currentAmount() >= payload.block().liquidCapacity - 0.001f) || (payload.block().hasLiquids && liquids.currentAmount() >= 0.1f && payload.build.liquids.currentAmount() >= payload.block().liquidCapacity - 0.001f) ||
(payload.block().hasItems && items.any() && payload.block().separateItemCapacity && content.items().contains(i -> payload.build.items.get(i) >= payload.block().itemCapacity)) || (payload.block().hasItems && items.any() && payload.block().separateItemCapacity && content.items().contains(i -> (payload.build.items.get(i) >= payload.block().itemCapacity) && items.has(i))) ||
(hasBattery() && payload.build.power.status >= 0.999999999f)); (hasBattery() && payload.build.power.status >= 0.999999999f));
} }
@@ -246,7 +246,7 @@ public class Drill extends Block{
@Override @Override
public boolean shouldConsume(){ public boolean shouldConsume(){
return items.total() < itemCapacity && enabled; return items.total() < itemCapacity && enabled && dominantItem != null;
} }
@Override @Override
@@ -33,7 +33,7 @@ public class Incinerator extends Block{
@Override @Override
public BlockStatus status(){ public BlockStatus status(){
return heat > 0.5f ? BlockStatus.active : BlockStatus.noInput; return !enabled ? BlockStatus.logicDisable : heat > 0.5f ? BlockStatus.active : BlockStatus.noInput;
} }
@Override @Override
@@ -38,7 +38,7 @@ public class ItemIncinerator extends Block{
@Override @Override
public BlockStatus status(){ public BlockStatus status(){
return efficiency > 0 ? BlockStatus.active : BlockStatus.noInput; return !enabled ? BlockStatus.logicDisable : efficiency > 0 ? BlockStatus.active : BlockStatus.noInput;
} }
@Override @Override
@@ -220,6 +220,14 @@ public class UnitFactory extends UnitBlock{
} }
} }
@Override
public void drawSelect(){
super.drawSelect();
if(plans.size > 1 && currentPlan != -1 && currentPlan < plans.size){
drawItemSelection(plans.get(currentPlan).unit);
}
}
@Override @Override
public Vec2 getCommandPosition(){ public Vec2 getCommandPosition(){
return commandPos; return commandPos;
@@ -112,9 +112,9 @@
"NEW_ACHIEVEMENT_26_4_NAME" "Terjesztőmester" "NEW_ACHIEVEMENT_26_4_NAME" "Terjesztőmester"
"NEW_ACHIEVEMENT_26_4_DESC" "Használj minden nyersanyagszállító-blokkot (egy bolygón) egyetlen pályán." "NEW_ACHIEVEMENT_26_4_DESC" "Használj minden nyersanyagszállító-blokkot (egy bolygón) egyetlen pályán."
"NEW_ACHIEVEMENT_26_5_NAME" "Túlhajtás" "NEW_ACHIEVEMENT_26_5_NAME" "Túlhajtás"
"NEW_ACHIEVEMENT_26_5_DESC" "Építs egy túlhajtó kivetítőt." "NEW_ACHIEVEMENT_26_5_DESC" "Építs egy túlhajtókivetítőt."
"NEW_ACHIEVEMENT_26_6_NAME" "Foltozás" "NEW_ACHIEVEMENT_26_6_NAME" "Foltozás"
"NEW_ACHIEVEMENT_26_6_DESC" "Építs egy foltozó kivetítőt." "NEW_ACHIEVEMENT_26_6_DESC" "Építs egy foltozókivetítőt."
"NEW_ACHIEVEMENT_26_7_NAME" "Hatástalanság" "NEW_ACHIEVEMENT_26_7_NAME" "Hatástalanság"
"NEW_ACHIEVEMENT_26_7_DESC" "Építs kútfúró tornyot a vízre, ahelyett, hogy szivattyút használnál." "NEW_ACHIEVEMENT_26_7_DESC" "Építs kútfúró tornyot a vízre, ahelyett, hogy szivattyút használnál."
"NEW_ACHIEVEMENT_26_8_NAME" "Raktárkészlet" "NEW_ACHIEVEMENT_26_8_NAME" "Raktárkészlet"
@@ -1,17 +1,17 @@
A Mindustry egy gyárépítős játék, Toronyvédő és RTS elemekkel. Készíts bonyolult ellátási láncokat, hogy lőszert juttass a lövegtornyokba, termelj az építkezéshez használható nyersanyagokat, és állíts elő egységeket. Irányítsd az egységeket, hogy elfoglald az ellenséges bázisokat, és bővítsd a termelésedet. Védd meg a támaszpontodat a hullámokban támadó ellenségektől. A Mindustry egy gyárépítős játék toronyvédő és RTS elemekkel. Készíts bonyolult ellátási láncokat, hogy lőszert juttass a lövegtornyokba, termelj az építkezéshez használható nyersanyagokat és állíts elő egységeket. Irányítsd az egységeket, hogy elfoglald az ellenséges bázisokat, majd bővítsd a termelésedet. Védd meg a támaszpontodat a hullámokban támadó ellenségektől.
Játszd végig a hadjáratokat egyedül, vagy vállvetve a barátaiddal a platformokon átívelő többjátékos módban, vagy hívd ki őket csapat alapú PvP mérkőzésekre Játszd végig a hadjáratokat egyedül vagy vállvetve a barátaiddal a platformokon átívelő többjátékos módban, vagy hívd ki őket csapat alapú PvP mérkőzésekre
[img]{STEAM_APP_IMAGE}/extras/factory.gif[/img] [img]{STEAM_APP_IMAGE}/extras/factory.gif[/img]
[h2]Gyárépítés[/h2] [h2]Gyárépítés[/h2]
[list] [list]
[*] Hozz létre bonyolult szállítószalagokból álló ellátási láncokat, hogy lőszert juttass a lövegtornyokba és termelj nyersanyagokat az építkezésekhez [*] Hozz létre bonyolult szállítószalagokból álló ellátási láncokat, hogy lőszert juttass a lövegtornyokba, majd termelj nyersanyagokat az építkezésekhez
[*] Használd a gyártóblokkokat a legkülönfélébb fejlett nyersanyagok létrehozásához [*] Használd a gyártóblokkokat a legkülönfélébb fejlett nyersanyagok létrehozásához
[*] Oszd szét a folyadékokat és küzdj meg az állandó kihívásokkal, mint például a tűzkitörésekkel, vagy az ellenséges repülőgépek rajtaütéseivel [*] Oszd szét a folyadékokat és küzdj meg az állandó kihívásokkal, mint például a tűzkitörésekkel vagy az ellenséges repülőgépek rajtaütéseivel
[*] Hozd ki a legtöbbet a termelésből, az épületek hűtőfolyadék-ellátásával [*] Biztosítsd az épületek hűtőfolyadék-ellátását, hogy a legtöbbet hozd ki a termelésből
[*] Egységek széles skáláját állíthatod elő a bázisod automatikus irányításához, és az ellenséges bázisok megtámadásához [*] Egységek széles skáláját állíthatod elő a bázisod automatikus irányításához és az ellenséges bázisok megtámadásához
[/list] [/list]
[h2]Toronyvédés[/h2] [h2]Toronyvédés[/h2]
@@ -20,7 +20,7 @@ Játszd végig a hadjáratokat egyedül, vagy vállvetve a barátaiddal a platfo
[*] Védd meg építményeidet a hullámokban támadó ellenségektől [*] Védd meg építményeidet a hullámokban támadó ellenségektől
[*] Stratégiailag helyezd el a lövegtornyokat, hogy elpusztítsd a támadóidat, mielőtt elérnék a támaszpontodat [*] Stratégiailag helyezd el a lövegtornyokat, hogy elpusztítsd a támadóidat, mielőtt elérnék a támaszpontodat
[*] Lásd el a lövegtornyokat lőszerrel, hűtőfolyadékkal és árammal [*] Lásd el a lövegtornyokat lőszerrel, hűtőfolyadékkal és árammal
[*] Erősítsd meg a védelmedet erőpajzs- és foltozó-kivetítőkkel vagy más támogató épületekkel [*] Erősítsd meg a védelmedet erőpajzs- és foltozókivetítőkkel vagy más támogató épületekkel
[/list] [/list]
[img]{STEAM_APP_IMAGE}/extras/rts3.png[/img] [img]{STEAM_APP_IMAGE}/extras/rts3.png[/img]
@@ -30,7 +30,7 @@ Játszd végig a hadjáratokat egyedül, vagy vállvetve a barátaiddal a platfo
[list] [list]
[*] Állíts fel összeszerelősorokat a gépesített egységek hadainak előállításához [*] Állíts fel összeszerelősorokat a gépesített egységek hadainak előállításához
[*] Használd az egységeidet a hatékonyan felszerelt ellenséges bázisok ellen [*] Használd az egységeidet a hatékonyan felszerelt ellenséges bázisok ellen
[*] Foglalj el minél több területet, hogy még több támaszpontot helyezhess el, és további erőforrásokhoz férhess hozzá a terjeszkedéshez [*] Foglalj el minél több területet, hogy még több támaszpontot helyezhess el és további erőforrásokhoz férhess hozzá a terjeszkedéshez
[/list] [/list]
[h2]Hadjárat[/h2] [h2]Hadjárat[/h2]
@@ -38,11 +38,11 @@ Játszd végig a hadjáratokat egyedül, vagy vállvetve a barátaiddal a platfo
[list] [list]
[*] Játszd végig a két különböző bolygó hadjáratait [*] Játszd végig a két különböző bolygó hadjáratait
[*] Hódítsd meg a Serpulo és az Erekir bolygót, miközben 35 kézzel készített pályán és 250+ procedurálisan előállított szektoron keresztül haladsz [*] Hódítsd meg a Serpulo és az Erekir bolygót, miközben 35 kézzel készített pályán és 250+ procedurálisan előállított szektoron keresztül haladsz
[*] Foglalj el területeket és építs gyárakat, hogy nyersanyagokat termelhess, miközben más szektorokban játszol [*] Foglalj el területeket és építs gyárakat, hogy nyersanyagokat termelhess miközben más szektorokban játszol
[*] Védd meg az elfoglalt szektorokat az időszakos invázióktól [*] Védd meg az elfoglalt szektorokat az időszakos invázióktól
[*] Koordináld az erőforrások elosztását a szektorok között az indítóállások felhasználásával [*] Koordináld az erőforrások elosztását a szektorok között az indítóállások felhasználásával
[*] Fedezz fel új épületeket, gyárakat a fejlődés elősegítése érdekében [*] Fedezz fel új épületeket, gyárakat a fejlődés elősegítése érdekében
[*] Hívd meg barátaidat, hogy együtt teljesítsétek a küldetéseket [*] Hívd meg a barátaidat, hogy együtt teljesítsétek a küldetéseket
[*] Sajátítsd el a 250-nél is több technológiai épület használatát [*] Sajátítsd el a 250-nél is több technológiai épület használatát
[*] Használd az 50-nél is több különböző típusú drónt, mechet, hajót, tankot [*] Használd az 50-nél is több különböző típusú drónt, mechet, hajót, tankot
[*] Teljesítsd a 80-nál is több feladatot [*] Teljesítsd a 80-nál is több feladatot
@@ -51,7 +51,7 @@ Játszd végig a hadjáratokat egyedül, vagy vállvetve a barátaiddal a platfo
[h2]Közösség és modolás[/h2] [h2]Közösség és modolás[/h2]
[list] [list]
[*] Használd a Steam Műhelyt a közösség által készített pályák és vázlatok böngészéséhez. [*] Használd a Steam Műhelyt a közösség által készített pályák és vázlatok böngészéséhez
[*] Csatlakozz nyilvános- és közösségi kiszolgálókhoz, hogy másokkal játszhass platformokon keresztül [*] Csatlakozz nyilvános- és közösségi kiszolgálókhoz, hogy másokkal játszhass platformokon keresztül
[*] Játssz vállvetve, PvP-ben vagy homokozóban a barátaiddal [*] Játssz vállvetve, PvP-ben vagy homokozóban a barátaiddal
[*] A közösségi kiszolgálók támogatják az egyéni pályák és játékmódok bővítményeit [*] A közösségi kiszolgálók támogatják az egyéni pályák és játékmódok bővítményeit
+1 -1
View File
@@ -26,4 +26,4 @@ org.gradle.caching=true
org.gradle.internal.http.socketTimeout=100000 org.gradle.internal.http.socketTimeout=100000
org.gradle.internal.http.connectionTimeout=100000 org.gradle.internal.http.connectionTimeout=100000
android.enableR8.fullMode=false android.enableR8.fullMode=false
archash=9b55a5d628 archash=bd8d9520a4
+9 -27
View File
@@ -58,15 +58,15 @@
{ {
"name": "XCore", "name": "XCore",
"address": [ "address": [
"176.9.86.158:52001", "62.30.47.117:7001",
"176.9.86.158:52002", "62.30.47.117:7002",
"176.9.86.158:52003", "62.30.47.117:7003",
"176.9.86.158:52004", "62.30.47.117:7004",
"176.9.86.158:52005", "62.30.47.117:7005",
"176.9.86.158:52006", "62.30.47.117:7006",
"176.9.86.158:52007", "62.30.47.117:7007",
"176.9.86.158:52008", "62.30.47.117:7008",
"176.9.86.158:52009" "62.30.47.117:7009"
] ]
}, },
{ {
@@ -86,18 +86,6 @@
"147.45.230.117:3011" "147.45.230.117:3011"
] ]
}, },
{
"name": "Chaotic Neutral",
"address": [
"37.187.73.180:7011",
"37.187.73.180:7012",
"37.187.73.180:7013",
"37.187.73.180:7014",
"37.187.73.180:7015",
"37.187.73.180:7016",
"37.187.73.180:7017"
]
},
{ {
"name": "io", "name": "io",
"address": [ "address": [
@@ -128,12 +116,6 @@
"name": "OmniCorp Classic", "name": "OmniCorp Classic",
"address": ["omnidustry.ru:6567", "omnidustry.ru:6568", "omnidustry.ru:6569", "omnidustry.ru:6570", "omnidustry.ru:6571", "omnidustry.ru:6572", "omnidustry.ru:6573", "omnidustry.ru:6574", "omnidustry.ru:6575", "omnidustry.ru:6576"] "address": ["omnidustry.ru:6567", "omnidustry.ru:6568", "omnidustry.ru:6569", "omnidustry.ru:6570", "omnidustry.ru:6571", "omnidustry.ru:6572", "omnidustry.ru:6573", "omnidustry.ru:6574", "omnidustry.ru:6575", "omnidustry.ru:6576"]
}, },
{
"name": "The Devil",
"address": [
"new.xem8k5.top"
]
},
{ {
"name": "Eradication Mindustry", "name": "Eradication Mindustry",
"address": [ "address": [