diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 7b28a0c840..b9f7dae159 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1152,9 +1152,9 @@ block.spirit-factory.description = Produziert leichte Drohnen, die Erz abbauen u block.phantom-factory.description = Produziert erweiterte Drohnen, die deutlich effizienter sind als Spirit-Drohnen. block.wraith-factory.description = Produziert schnelle Abfangjäger. block.ghoul-factory.description = Produziert schwere Flächenbomber. -block.revenant-factory.description = Produziert schwere Laser-Bodeneinheiten. +block.revenant-factory.description = Produziert schwere Raketen basierte Flugeinheiten. block.dagger-factory.description = Produziert Standard-Bodeneinheiten. -block.crawler-factory.description = Produces fast self-destructing swarm units. +block.crawler-factory.description = Produziert schnelle selbstzerstörende Schwarmeinheiten. block.titan-factory.description = Produziert fortgeschrittene, gepanzerte Bodeneinheiten. block.fortress-factory.description = Produziert schwere Artillerie-Bodeneinheiten. block.repair-point.description = Heilt durchgehend die nächste befreundete, beschädigte Einheit in der Umgebung. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 5286ad94e8..acaf71885e 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -3,16 +3,16 @@ credits = Zasłużeni contributors = Tłumacze i pomocnicy discord = Odwiedź nasz serwer Discord! link.discord.description = Oficjalny serwer Discord Mindustry -link.reddit.description = The Mindustry subreddit +link.reddit.description = Subreddit Mindustry link.github.description = Kod źródłowy gry -link.changelog.description = Informacje o aktualizacjach +link.changelog.description = Historia aktualizacji link.dev-builds.description = Niestabilne wersje gry link.trello.description = Oficjalna tablica Trello z planowanym funkcjami link.itch.io.description = Strona itch.io z oficjanymi wersjami do pobrania link.google-play.description = Strona na sklepie Google Play link.wiki.description = Oficjana Wiki Mindustry linkfail = Nie udało się otworzyć linku!\nURL został skopiowany. -screenshot = Zapisano zdjęcie do {0} +screenshot = Zapisano zdjęcie w {0} screenshot.invalid = Zrzut ekranu jest zbyt duży. Najprawdopodobniej brakuje miejsca w pamięci urządzenia. gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! @@ -24,22 +24,22 @@ load.image = Obrazy load.content = Treść load.system = System load.mod = Mody -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. -schematic.rename = Rename Schematic -schematic.info = {0}x{1}, {2} blocks +schematic = Schemat +schematic.add = Zapisz schemat... +schematics = Schematy +schematic.replace = Schemat o takiej nazwie już istnieje. Czy chcesz go zastąpić? +schematic.import = Importuj Schemat... +schematic.exportfile = Eksportuj plik +schematic.importfile = Importuj plik +schematic.browseworkshop = Przeglądaj Warsztat +schematic.copy = Zapisano w schowku +schematic.copy.import = Importuj ze schowka +schematic.shareworkshop = Podziel się na Warsztacie +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Odwróć schemat +schematic.saved = Schemat zapisany. +schematic.delete.confirm = Ten schemat zostanie kompletnie wyeliminowany. +schematic.rename = Zmień nazwę schematu +schematic.info = {0}x{1}, {2} bloków stat.wave = Fale powstrzymane:[accent] {0} stat.enemiesDestroyed = Przeciwnicy zniszczeni:[accent] {0} stat.built = Budynki zbudowane:[accent] {0} @@ -55,7 +55,7 @@ level.select = Wybrany poziom level.mode = Tryb gry: showagain = Nie pokazuj tego więcej coreattack = < Rdzeń jest atakowany! > -nearpoint = [[ [scarlet]OPUŚĆ PUNKT ZRZUTU NATYCHMIAST[] ]\nnadciąga zniszczenie +nearpoint = [[ [scarlet]NATYCHMIAST OPUŚĆ PUNKT ZRZUTU[] ]\nnadciąga zniszczenie database = Centralna baza danych savegame = Zapisz Grę loadgame = Wczytaj Grę @@ -64,7 +64,7 @@ customgame = Własna Gra newgame = Nowa Gra none = minimap = Minimapa -position = Position +position = Pozycja close = Zamknij website = Strona Gry quit = Wyjdź @@ -80,30 +80,30 @@ uploadingcontent = Przesyłanie Zawartości uploadingpreviewfile = Przesyłanie Pliku Podglądu committingchanges = Zatwierdzanie Zmian done = Gotowe -feature.unsupported = Your device does not support this feature. +feature.unsupported = Twoje urządzenie nie wspiera tej funkcji. mods.alphainfo = Pamiętaj, że mody są wersji alpha, i[scarlet] mogą być pełne błędów[].\nZgłaszaj wszystkie znalezione problemy na Mindustry Github lub Discord. mods.alpha = [scarlet](Alpha) mods = Mody mods.none = [LIGHT_GRAY]Nie znaleziono modów! -mods.guide = Modding Guide -mods.report = Report Bug -mods.openfolder = Open Mod Folder +mods.guide = Poradnik do modów +mods.report = Zgłoś Błąd +mods.openfolder = Otwórz folder z modami mod.enabled = [lightgray]Włączony mod.disabled = [scarlet]Wyłączony -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable +mod.disable = Wyłącz +mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu. +mod.missingdependencies = [scarlet]Brakujące zależności: {0} +mod.nowdisabled = [scarlet]Brakuje zależności dla moda '{0}':[accent] {1}\n[lightgray]Najpierw trzeba ściągnąć te mody.\nMod zostanie automatycznie wyłączony. +mod.enable = Włącz mod.requiresrestart = Gra się wyłączy aby wprowadzić zmiany moda. -mod.reloadrequired = [scarlet]Reload Required +mod.reloadrequired = [scarlet]Wymagany restart mod.import = Importuj Mod -mod.import.github = Import Github Mod +mod.import.github = Importuj mod z Githuba mod.remove.confirm = Ten mod zostanie usunięty. mod.author = [LIGHT_GRAY]Autor:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.missing = Ten zapis zawiera mody, które zostały niedawno zaktualizowane, bądź nie są już zainstalowane. Zapis może zostać uszkodzony. Czy jesteś pewien, że chcesz go załadować?\n[lightgray]Mody:\n{0} +mod.preview.missing = Przed opublikowaniem tego moda na Warsztacie musisz dodać zdjęcie podglądowe.\nDodaj zdjęcie o nazwie[accent] preview.png[] do folderu moda i spróbuj jeszcze raz. +mod.folder.missing = Jedynie mody w formie folderów mogą się znaleźć na Warsztacie.\nBy zamienić moda w folder, wyciągnij go z archiwum, umieść w folderze i usuń archiwum. Później uruchom ponownie grę bądź załaduj ponownie mody. about.button = O Grze name = Nazwa: noname = Najpierw wybierz [accent]nazwę gracza[] @@ -125,7 +125,7 @@ server.kicked.clientOutdated = Nieaktualna gra! Zaktualizują ją! server.kicked.serverOutdated = Nieaktualny serwer! Poproś hosta o jego aktualizację. server.kicked.banned = Zostałeś zbanowany na tym serwerze. server.kicked.typeMismatch = Ten serwer jest niekompatybilny z twoją wersją gry. -server.kicked.playerLimit = Serwer pełny. Poczekaj na wolny slot. +server.kicked.playerLimit = Serwer pełny. Poczekaj na wolne miejsce. server.kicked.recentKick = Zostałeś niedawno wyrzucony.\nPoczekaj chwilę przed ponownym połączniem. server.kicked.nameInUse = Ta nazwa jest już zajęta na tym serwerze. server.kicked.nameEmpty = Wybrana przez Ciebie nazwa jest nieprawidłowa. @@ -133,8 +133,8 @@ server.kicked.idInUse = Jesteś już na serwerze! Używanie tego samego konta na server.kicked.customClient = Ten serwer nie wspomaga wersji deweloperskich. Pobierz oficjalną wersję. server.kicked.gameover = Koniec gry! server.versions = Twoja wersja gry:[accent] {0}[]\nWersja gry serwera:[accent] {1}[] -host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKtokolwiek z tym samym [LIGHT_GRAY]wifi lub hotspotem[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, [accent]przekierowywanie portów[] jest potrzebne.\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci. -join.info = Tutaj możesz wpisać [accent]IP serwera[], aby dołączyć lub wyszukaj [accent]serwery w lokalnej sieci[], do których chcesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać się hosta o IP. +host.info = Przycisk [accent]host[] hostuje serwer na porcie [scarlet]6567[] i [scarlet]6568.[]\nKażdy w tej samej sieci [LIGHT_GRAY]wifi lub hotspocie[] powinien zobaczyć twój serwer.\n\nJeśli chcesz, aby każdy z twoim IP mógł dołączyć, musisz wykonać [accent]przekierowywanie portów[].\n\n[LIGHT_GRAY]Notka:Jeśli ktokolwiek ma problem z dołączeniem do gry, upewnij się, że udostępniłeś Mindustry dostęp do sieci. +join.info = Tutaj możesz wpisać [accent]adres IP serwera[], aby dołączyć lub wyszukać [accent]serwerów w lokalnej sieci[], do których możesz dołączyć .\nGra wieloosobowa na LAN i WAN jest wspomagana.\n\n[LIGHT_GRAY]Notka: Nie ma automatycznej listy wszystkich serwerów; jeśli chcesz dołączyć przez IP, musisz zapytać hosta o IP. hostserver = Stwórz Serwer invitefriends = Zaproś Znajomych hostserver.mobile = Hostuj\nGrę @@ -217,7 +217,7 @@ warning = Uwaga. confirm = Potwierdź delete = Usuń view.workshop = Pokaż w Warsztacie -workshop.listing = Edit Workshop Listing +workshop.listing = Edytuj pozycję w Warsztacie ok = OK open = Otwórz customize = Dostosuj @@ -237,10 +237,10 @@ quit.confirm.tutorial = Czy jesteś pewien tego co robisz?\nSamouczek może zost loading = [accent]Ładowanie... reloading = [accent]Reloading Mods... saving = [accent]Zapisywanie... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] by wyczyścić plan +selectschematic = [accent][[{0}][] by wybrać+skopiować +pausebuilding = [accent][[{0}][] by wtrzymać budowę +resumebuilding = [scarlet][[{0}][] by kontynuować budowę wave = [accent]Fala {0} wave.waiting = Fala za {0} wave.waveInProgress = [LIGHT_GRAY]Fala w trakcie @@ -259,18 +259,18 @@ map.nospawn = Ta mapa nie zawiera żadnego rdzenia! Dodaj [ROYAL]niebieski[] rdz map.nospawn.pvp = Ta mapa nie ma żadnego rdzenia przeciwnika, aby mogli się zrespić przeciwnicy! Dodaj[SCARLET] inny niż niebieski[] rdzeń do mapy w edytorze. map.nospawn.attack = Ta mapa nie ma żadnego rdzenia przeciwnika, aby można było go zaatakować! Dodaj[SCARLET] czerwony[] rdzeń do mapy w edytorze. map.invalid = Błąd podczas ładowania mapy: uszkodzony lub niepoprawny plik mapy. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): -eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +workshop.update = Aktualizuj pozycję +workshop.error = Błąd podczas wczytywania szczegółów z Warsztatu: {0} +map.publish.confirm = Czy jesteś pewien, że chcesz opublikować tę mapę?\n\n[lightgray]Najpierw upewnij się, że zgadzasz się z umową EULA Warsztatu, w przeciwnym razie twoje mapy nie będą widoczne! +workshop.menu = Wybierz co chcesz zrobić z tą pozycją. +workshop.info = Informacja o pozycji +changelog = Historia aktualizacji (opcjonalna): +eula = Umowa EULA Steam +missing = Ta pozycja została przeniesiona bądź usunięta.\n[lightgray]Pozycja na Warsztacie została automatycznie odłączona. +publishing = [accent]Trwa publikowanie... +publish.confirm = Czy jesteś pewien, że chcesz to opublikować?\n\n[lightgray]Najpierw upewnij się, że zgadzasz się z umową EULA Warsztatu, w przeciwnym razie twoje pozycje nie będą widoczne! +publish.error = Błąd podczas publikowania pozycji: {0} +steam.error = Nie udało się zainicjować serwisów Steam.\nBłąd: {0} editor.brush = Pędzel editor.openin = Otwórz w Edytorze editor.oregen = Generacja Złóż @@ -310,7 +310,7 @@ editor.removeunit = Usuń Jednostkę editor.teams = Drużyny editor.errorload = Błąd podczas ładowania pliku:\n[accent]{0} editor.errorsave = Błąd podczas zapisywania pliku:\n[accent]{0} -editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszeżenia spodziewając sie że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze. +editor.errorimage = To obraz, nie mapa. Nie zmieniaj rozszerzenia, spodziewając się, że to coś zmieni.\n\nJeśli chcesz zaimportować starszą mapę, użyj przycisku „importuj starszą mapę” w edytorze. editor.errorlegacy = Ta mapa jest zbyt stara i używa starszego formatu mapy, który nie jest już obsługiwany. editor.errornot = To nie jest plik mapy. editor.errorheader = Ten plik mapy jest nieprawidłowy lub uszkodzony. @@ -357,7 +357,7 @@ toolmode.square = Kwadrat toolmode.square.description = Kwadratowy pędzel. toolmode.eraseores = Wymaż Rudy toolmode.eraseores.description = Usuń tylko rudy. -toolmode.fillteams = Wypełń Drużyny +toolmode.fillteams = Wypełnij Drużyny toolmode.fillteams.description = Wypełniaj drużyny zamiast bloków. toolmode.drawteams = Rysuj Drużyny toolmode.drawteams.description = Rysuj drużyny zamiast bloków. @@ -411,9 +411,9 @@ abandon = Opuść abandon.text = Ta strefa i wszystkie jej surowce będą przejęte przez przeciwników. locked = Zablokowane complete = [LIGHT_GRAY]Ukończone: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Osiągnij falę {0} w {1} +requirement.core = Zniszcz Rdzeń wroga w {0} +requirement.unlock = Odblokuj {0} resume = Kontynuuj Strefę:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Najwyższa fala: {0} launch = < WYSTRZEL > @@ -424,13 +424,13 @@ launch.confirm = Spowoduje to wystrzelenie wszystkich surowców w rdzeniu.\nNie launch.skip.confirm = Jeśli teraz przejdziesz do kolejnej fali, Nie biędziesz miał możliwości wystrzelenia do czasu pokonania dalszych fal. uncover = Odkryj configure = Skonfiguruj Ładunek -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Zabronione bloki +addall = Dodaj wszystkie configure.locked = [LIGHT_GRAY]Dotrzyj do fali {0}\nAby skonfigurować ładunek. configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. zone.unlocked = [LIGHT_GRAY]Strefa {0} odblokowana. zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Ładunek odblokowany:[lightgray]\n{0} zone.resources = Wykryte Zasoby: zone.objective = [lightgray]Cel: [accent]{0} zone.objective.survival = Przeżyj @@ -487,8 +487,8 @@ settings.cleardata = Wyczyść Dane Gry... settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. paused = [accent]< Wstrzymano > -clear = Clear -banned = [scarlet]Banned +clear = Wyczyść +banned = [scarlet]Zbanowano yes = Tak no = Nie info.title = Informacje @@ -597,7 +597,7 @@ setting.difficulty.normal = Normalny setting.difficulty.hard = Trudny setting.difficulty.insane = Szalony setting.difficulty.name = Poziom trudności -setting.screenshake.name = Trzęsienie się ekranu +setting.screenshake.name = Wstrząsy ekranu setting.effects.name = Wyświetlanie efektów setting.destroyedblocks.name = Display Destroyed Blocks setting.conveyorpathfinding.name = Conveyor Placement Pathfinding @@ -623,7 +623,7 @@ setting.chatopacity.name = Przezroczystość czatu setting.lasersopacity.name = Przezroczystość laserów zasilających setting.playerchat.name = Wyświetlaj czat w grze public.confirm = Czy chcesz ustawić swoją grę jako publiczną?\n[lightgray]Można to później zmienić w Ustawienia->Gra->Widoczność Gry Publicznej. -public.beta = Note that beta versions of the game cannot make public lobbies. +public.beta = Wersje beta gry nie mogą tworzyć publicznych pokoi. uiscale.reset = Skala interfejsu uległa zmianie.\nNaciśnij "OK" by potwierdzić zmiany.\n[scarlet]Cofanie zmian i wyjście z gry za[accent] {0}[] uiscale.cancel = Anuluj i Wyjdź setting.bloom.name = Bloom @@ -631,20 +631,20 @@ keybind.title = Zmień keybinds.mobile = [scarlet]Większość skrótów klawiszowych nie funkcjonuje w wersji mobilnej. Tylko podstawowe poruszanie się jest wspierane. category.general.name = Ogólne category.view.name = Wyświetl -category.multiplayer.name = Multiplayer +category.multiplayer.name = Wielu graczy command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj -keybind.clear_building.name = Clear Building +keybind.clear_building.name = Wyczyść budynek keybind.press = Naciśnij wybrany klawisz... keybind.press.axis = Naciśnij oś lub klawisz... keybind.screenshot.name = Zrzut ekranu mapy keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.schematic_select.name = Wybierz region +keybind.schematic_menu.name = Menu schematów +keybind.schematic_flip_x.name = Obróć schemat horyzontalnie +keybind.schematic_flip_y.name = Obróć schemat wertykalnie keybind.fullscreen.name = Przełącz Pełny Ekran keybind.select.name = Zaznacz keybind.diagonal_placement.name = Budowa po skosie @@ -656,7 +656,7 @@ keybind.zoom_hold.name = Inicjator przybliżania keybind.zoom.name = Przybliżanie keybind.menu.name = Menu keybind.pause.name = Pauza -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Wstrzymaj/kontynuuj budowę keybind.minimap.name = Minimapa keybind.dash.name = Przyspieszenie keybind.chat.name = Czat @@ -855,7 +855,7 @@ block.duo.name = Podwójne Działko block.scorch.name = Płomień block.scatter.name = Flak block.hail.name = Grad -block.lancer.name = Lancer +block.lancer.name = Lansjer block.conveyor.name = Przenośnik block.titanium-conveyor.name = Przenośnik Tytanowy block.armored-conveyor.name = Przenośnik Opancerzony @@ -864,7 +864,7 @@ block.junction.name = Węzeł block.router.name = Rozdzielacz block.distributor.name = Dystrybutor block.sorter.name = Sortownik -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Odwrotny Sortownik block.message.name = Wiadomość block.overflow-gate.name = Brama Przepełnieniowa block.silicon-smelter.name = Huta Krzemu diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 5c7edb10df..0639a0e71d 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -1,43 +1,43 @@ -credits.text = Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits.text = Criado por [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Créditos contributors = Tradutores e contribuidores discord = Junte-se ao Discord do Mindustry! (Lá nós falamos em inglês) link.discord.description = O discord oficial do Mindustry -link.reddit.description = The Mindustry subreddit +link.reddit.description = O subreddit do Mindustry link.github.description = Código fonte do jogo. link.changelog.description = Lista de mudanças da atualização -link.dev-builds.description = Desenvolvimentos Instáveis -link.trello.description = Trello Oficial para Updates Planejados -link.itch.io.description = Pagina da Itch.io com os Downloads -link.google-play.description = Listamento do google play store +link.dev-builds.description = Desenvolvimentos instáveis +link.trello.description = Trello oficial para atualizações planejadas +link.itch.io.description = Página da Itch.io com os downloads +link.google-play.description = Página da google play store link.wiki.description = Wiki oficial do Mindustry linkfail = Falha ao abrir o link\nO Url foi copiado screenshot = Screenshot salvo para {0} -screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura. +screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente para captura de tela. gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [YELLOW]Novo recorde! -copied = Copied. +copied = Copiado load.sound = Sons load.map = Mapas load.image = Imagens load.content = Conteúdo load.system = Sistema load.mod = Mods -schematic = Schematic -schematic.add = Save Schematic... -schematics = Schematics -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Import Schematic... -schematic.exportfile = Export File -schematic.importfile = Import File -schematic.browseworkshop = Browse Workshop -schematic.copy = Copy to Clipboard -schematic.copy.import = Import from Clipboard -schematic.shareworkshop = Share on Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schematic saved. -schematic.delete.confirm = This schematic will be utterly eradicated. +schematic = Esquema +schematic.add = Salvar Esquema... +schematics = Esquemas +schematic.replace = Um Esquema com esse nome já existe. Substituí-lo? +schematic.import = Importar Esquema... +schematic.exportfile = Exportar arquivo +schematic.importfile = Importar arquivo +schematic.browseworkshop = Navegar pela Oficina +schematic.copy = Copiar para a área de transferência +schematic.copy.import = Importar da área de transferência +schematic.shareworkshop = Compartilhar na Oficina +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Virar o Esquema +schematic.saved = Esquema salvo. +schematic.delete.confirm = Esse Esquema será totalmente erradicado. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks stat.wave = Hordas derrotadas:[accent] {0} @@ -46,9 +46,9 @@ stat.built = Construções construídas:[accent] {0} stat.destroyed = Construções destruídas:[accent] {0} stat.deconstructed = Construções desconstruídas:[accent] {0} stat.delivered = Recursos lançados: -stat.rank = Rank Final: [accent]{0} +stat.rank = Classificação Final: [accent]{0} launcheditems = [accent]Itens lançados -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +launchinfo = [unlaunched][[LANCE] seu núcleo para obter os itens indicados em azul. map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -56,11 +56,11 @@ level.mode = Modo de Jogo: showagain = Não mostrar na proxima sessão coreattack = < O núcleo está sobre ataque! > nearpoint = [[ [scarlet]SAIA DO PONTO DE SPAWN IMEDIATAMENTE[] ]\nANIQUILAÇÃO IMINENTE -database = banco do núcleo +database = Banco de dados savegame = Salvar Jogo loadgame = Carregar Jogo joingame = Entrar no Jogo -customgame = Jogo Customi-/nzado +customgame = Jogo Customi-\nzado newgame = Novo Jogo none = minimap = Mini-Mapa @@ -77,63 +77,63 @@ invalid = Inválido preparingconfig = Preparando configuração preparingcontent = Preparando conteúdo uploadingcontent = Fazendo upload do conteúdo -uploadingpreviewfile = Fazendo upload do arquivo de pré visualização +uploadingpreviewfile = Fazendo upload do arquivo de pré-visualização committingchanges = Enviando mudanças done = Feito -feature.unsupported = Your device does not support this feature. +feature.unsupported = Seu dispositivo não suporta essa função. mods.alphainfo = Mantenha em mente que os mods estão em Alpha, e[scarlet] talvez sejam bem bugados[].\nReporte quaisquer problemas no Discord ou Github do Mindustry. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]No mods found! -mods.guide = Modding Guide -mods.report = Report Bug -mods.openfolder = Open Mod Folder -mod.enabled = [lightgray]Enabled -mod.disabled = [scarlet]Disabled -mod.disable = Disable -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable -mod.requiresrestart = The game will now close to apply the mod changes. -mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.github = Import Github Mod -mod.remove.confirm = This mod will be deleted. +mods.none = [LIGHT_GRAY]Nenhum Mod encontrado! +mods.guide = Guia de Mods +mods.report = Reportar um Bug +mods.openfolder = Abrir pasta de Mods +mod.enabled = [lightgray]Ativado +mod.disabled = [scarlet]Desativado +mod.disable = Desativar +mod.delete.error = Incapaz de deletar o Mod. O arquivo talvez esteja em uso. +mod.missingdependencies = [scarlet]Dependências ausentes: {0} +mod.nowdisabled = [scarlet]O Mod '{0}' está com dependências ausentes :[accent] {1}\n[lightgray]Esses Mods precisam ser baixados primeiro.\nEsse Mod será desativado automaticamente. +mod.enable = Ativar +mod.requiresrestart = O jogo irá fechar para aplicar as mudanças do Mod. +mod.reloadrequired = [scarlet]Recarregamento necessário +mod.import = Importar Mod +mod.import.github = Importar Mod do Github +mod.remove.confirm = Esse Mod será deletado. mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.missing = Esse jogo salvo foi criado antes de você atualizar ou desinstalar um mod. O jogo salvo pode se corromper. Você tem certeza que quer carregar?\n[lightgray]Mods:\n{0} +mod.preview.missing = Antes de publicar esse mod na Oficina, você deve adicionar uma imagem de pré-visualização.\nColoque uma imagem com o nome[accent] preview.png[] na pasta do Mod e tente novamente. +mod.folder.missing = Somente Mods no formato de pasta serão publicados na Oficina.\nPara converter qualquer Mod em uma pasta, Simplesmente descompacte seu arquivo numa pasta e delete a compactação antiga, então reinicie seu jogo ou recarregue os Mods. about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. filename = Nome do arquivo: -unlocked = Novo bloco Desbloqueado! +unlocked = Novo bloco desbloqueado! completed = [accent]Completado techtree = Árvore de tecnologia research.list = [LIGHT_GRAY]Pesquise: -research = Pesquisa -researched = [LIGHT_GRAY]{0} pesquisado. +research = Pesquisar +researched = [LIGHT_GRAY]{0} Pesquisado. players = {0} Jogadores Ativos players.single = {0} Jogador Ativo server.closing = [accent]Fechando servidor... -server.kicked.kick = Voce foi expulso do servidor! +server.kicked.kick = Você foi expulso do servidor! server.kicked.whitelist = Você não está na lista branca do servidor. server.kicked.serverClose = Servidor Fechado. server.kicked.vote = Você foi expulso desse servidor. Adeus. server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! -server.kicked.serverOutdated = Servidor desatualiado! Peça ao dono para atualizar! +server.kicked.serverOutdated = Servidor desatualizado! Peça ao dono para atualizar! server.kicked.banned = Você foi banido do servidor. server.kicked.typeMismatch = Este servidor não é compatível com a sua versão. server.kicked.playerLimit = Este servidor está cheio. Espere por uma vaga. -server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para conectar de novo. +server.kicked.recentKick = Voce foi expulso recentemente.\nEspere para se conectar de novo. server.kicked.nameInUse = Este nome já está sendo usado\nneste servidor. server.kicked.nameEmpty = Você deve ter pelo menos uma letra ou número no nome. server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. server.kicked.gameover = Fim de jogo! server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] -host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall +host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguém esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. hostserver = Hospedar servidor invitefriends = Convidar amigos @@ -201,8 +201,8 @@ save.newslot = Nome do salvamento: save.rename = Renomear save.rename.text = Novo jogo: selectslot = Selecione um lugar para salvar. -slot = [accent]Slot {0} -editmessage = Edit Message +slot = [accent]Conexões {0} +editmessage = Editar Mensagem save.corrupted = [accent]Arquivo corrompido ou inválido! empty = on = Ligado @@ -216,8 +216,8 @@ save.playtime = Tempo De Jogo: {0} warning = Aviso. confirm = Confirmar delete = Excluir -view.workshop = Ver na oficina -workshop.listing = Edit Workshop Listing +view.workshop = Ver na Oficina +workshop.listing = Editar a lista da Oficina ok = OK open = Abrir customize = Customizar @@ -235,12 +235,12 @@ classic.export.text = [accent]Mindustry[] acabou de ter uma grande atualização quit.confirm = Você tem certeza que quer sair? quit.confirm.tutorial = Você tem certeza você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] loading = [accent]Carregando... -reloading = [accent]Reloading Mods... +reloading = [accent]Recarregando Mods... saving = [accent]Salvando... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] para cancelar a construção +selectschematic = [accent][[{0}][] para selecionar+copiar +pausebuilding = [accent][[{0}][] para parar a construção +resumebuilding = [scarlet][[{0}][] para continuar a construção wave = [accent]Horda {0} wave.waiting = Horda em {0} wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso @@ -259,18 +259,18 @@ map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicio map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor. map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor. map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Atualizar Item +workshop.error = Erro buscando os detalhes da Oficina: {0} map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info +workshop.menu = Selecione oquê você gostaria de fazer com esse Item. +workshop.info = Informação do Item changelog = Changelog (optional): -eula = EULA do Steam +eula = EULA da Steam missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +publish.confirm = você tem certeza de que quer publicar isso?\n\n[lightgray]Primeiramente tenha certeza de que você concorda com o EULA da Oficina, ou seus itens não irão aparecer! +publish.error = Erro publicando o Item: {0} +steam.error = Falha em iniciar os serviços da Steam.\nError: {0} editor.brush = Pincel editor.openin = Abrir no Editor editor.oregen = Geração de minério @@ -283,7 +283,7 @@ editor.waves = Hordas: editor.rules = Regras: editor.generation = Geração: editor.ingame = Editar em jogo -editor.publish.workshop = Publicar na oficina +editor.publish.workshop = Publicar na Oficina editor.newmap = Novo mapa workshop = Oficina waves.title = Hordas @@ -294,7 +294,7 @@ waves.waves = Hordas(s) waves.perspawn = por spawn waves.to = para waves.boss = Chefe -waves.preview = Pré visualizar +waves.preview = Pré-visualizar waves.edit = Editar... waves.copy = Copiar para área de transferência waves.load = Carregar da área de transferência @@ -396,13 +396,13 @@ width = Largura: height = Altura: menu = Menu play = Jogar -campaign = Campa-/nnha +campaign = Campa-\nnha load = Carregar save = Salvar fps = FPS: {0} ping = Ping: {0}ms language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. -settings = Configu-/nrações +settings = Configu-\nrações tutorial = Tutorial tutorial.retake = Refazer Tutorial editor = Editor @@ -411,9 +411,9 @@ abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado complete = [LIGHT_GRAY]Completo: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.wave = Alcançar a Horda {0} em {1} +requirement.core = Destruir o núcleo inimigo em {0} +requirement.unlock = Desbloquear {0} resume = Resumir Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Melhor: {0} launch = Lançar @@ -425,18 +425,18 @@ launch.skip.confirm = Se você pular a horda agora, você não será capaz de la uncover = Descobrir configure = Configurar carregamento bannedblocks = Blocos Banidos -addall = Add All +addall = Adicionar Todos configure.locked = [LIGHT_GRAY]Alcançe a horda {0}\npara configurar o carregamento. configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} +zone.config.unlocked = Equipamento desbloqueado:[lightgray]\n{0} zone.resources = Recursos detectados: zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective.survival = Sobreviver zone.objective.attack = Destruir o núcleo inimigo add = Adicionar... -boss.health = Saúde do chefe +boss.health = Vida do chefe connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} error.unreachable = Servidor inalcançável. error.invalidaddress = Endereço inválido. @@ -475,7 +475,7 @@ zone.nuclearComplex.description = Uma antiga instalação para produção e proc zone.fungalPass.description = Uma area de transição entre montanhas altas e baixas, terras cheias de esporos. Uma pequena base de reconhecimento inimiga está localizada aqui.\nDestrua-a.\nUse as unidades crawler e dagger. Destrua os dois núcleos. zone.impact0078.description = zone.crags.description = -settings.language = Linguagem +settings.language = Idioma settings.data = Dados do jogo settings.reset = Restaurar Padrões settings.rebind = Religar @@ -485,7 +485,7 @@ settings.sound = Som settings.graphics = Gráficos settings.cleardata = Apagar dados... settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! -settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. +settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, Incluindo jogos salvos, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente. paused = Pausado clear = Clear banned = [scarlet]Banido @@ -501,10 +501,10 @@ block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Capacidade de Energia blocks.powershot = Energia/tiro blocks.damage = Dano -blocks.targetsair = Mirar no ar -blocks.targetsground = Mirar no chão +blocks.targetsair = Mira no ar +blocks.targetsground = Mira no chão blocks.itemsmoved = Velocidade de movimento -blocks.launchtime = Tempo entre tiros +blocks.launchtime = Tempo entre Disparos. blocks.shootrange = Alcance blocks.size = Tamanho blocks.liquidcapacity = Capacidade de Líquido @@ -519,8 +519,8 @@ blocks.repairtime = Tempo de reparo total do bloco blocks.speedincrease = Aumento de velocidade blocks.range = Distância blocks.drilltier = Furáveis -blocks.drillspeed = Velocidade da broca base -blocks.boosteffect = Efeito do Boost +blocks.drillspeed = Velocidade base da Broca +blocks.boosteffect = Efeito do Impulso blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção @@ -530,8 +530,8 @@ blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição bar.drilltierreq = Broca melhor necessária. -bar.drillspeed = Velocidade da broca: {0}/s -bar.pumpspeed = Pump Speed: {0}/s +bar.drillspeed = Velocidade da Broca: {0}/s +bar.pumpspeed = Velocidade da Bomna: {0}/s bar.efficiency = Eficiência: {0}% bar.powerbalance = Energia: {0} bar.powerstored = Armazenada: {0}/{1} @@ -544,7 +544,7 @@ bar.heat = Aquecimento bar.power = Poder bar.progress = Progresso da construção bar.spawned = Unidades: {0}/{1} -bullet.damage = [stat]{0}[lightgray] dano +bullet.damage = [stat]{0}[lightgray] Dano bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos bullet.incendiary = [stat]Incendiário bullet.homing = [stat]Guiado @@ -578,7 +578,7 @@ setting.landscape.name = Travar panorama setting.shadows.name = Sombras setting.blockreplace.name = Automatic Block Suggestions setting.linear.name = Filtragem linear -setting.hints.name = Hints +setting.hints.name = Dicas setting.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] @@ -599,10 +599,10 @@ setting.difficulty.insane = Insano setting.difficulty.name = Dificuldade setting.screenshake.name = Balanço da Tela setting.effects.name = Efeitos -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Mostrar Blocos Destruídos +setting.conveyorpathfinding.name = Posicionamento do localizador do Transportador setting.sensitivity.name = Sensibilidade do Controle -setting.saveinterval.name = Intervalo de autosalvamento +setting.saveinterval.name = Intervalo de Auto Salvamento setting.seconds = {0} Segundos setting.fullscreen.name = Tela Cheia setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) @@ -610,19 +610,19 @@ setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.pixelate.name = Pixelizado [LIGHT_GRAY](Pode diminuir a performace) setting.minimap.name = Mostrar minimapa -setting.position.name = Show Player Position +setting.position.name = Mostrar a posição do Jogador setting.musicvol.name = Volume da Música -setting.ambientvol.name = Volume do ambiente +setting.ambientvol.name = Volume do Ambiente setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som -setting.crashreport.name = Enviar denuncias de crash anonimas +setting.crashreport.name = Enviar denúncias anônimas de erros setting.savecreate.name = Criar salvamentos automaticamente setting.publichost.name = Visibilidade do jogo público setting.chatopacity.name = Opacidade do chat -setting.lasersopacity.name = Power Laser Opacity +setting.lasersopacity.name = Opacidade do laser setting.playerchat.name = Mostrar chat em jogo -public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. +public.confirm = Você quer fazer sua partida pública?\n[accent]Qualquer um será capaz de entrar na sua partida.\n[lightgray]Isso pode ser mudado depois em Configurações->Jogo->Visibilidade da partida pública. public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... uiscale.cancel = Cancelar e sair @@ -641,10 +641,10 @@ keybind.press.axis = Pressione uma Axis ou tecla... keybind.screenshot.name = Captura do mapa keybind.move_x.name = mover_x keybind.move_y.name = mover_y -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.schematic_select.name = Selecionar região +keybind.schematic_menu.name = Menu de Esquemas +keybind.schematic_flip_x.name = girar o Esquema X +keybind.schematic_flip_y.name = girar o Esquema Y keybind.fullscreen.name = Alterar tela cheia keybind.select.name = selecionar keybind.diagonal_placement.name = Colocação diagonal @@ -652,18 +652,18 @@ keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar -keybind.zoom_hold.name = segurar_zoom +keybind.zoom_hold.name = segurar Zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Parar/Resumir a construção keybind.minimap.name = Minimapa keybind.dash.name = Correr keybind.chat.name = Conversa keybind.player_list.name = Lista_de_jogadores -keybind.console.name = console +keybind.console.name = Console keybind.rotate.name = Girar -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotateplaced.name = Girar (Segure) keybind.toggle_menus.name = Ativar menus keybind.chat_history_prev.name = Historico do chat anterior keybind.chat_history_next.name = Historico do proximo chat @@ -781,11 +781,11 @@ block.rock.name = Rocha block.snowrock.name = Rocha com neve block.snow-pine.name = Pinheiro com neve block.shale.name = Xisto -block.shale-boulder.name = Pedra de xisto +block.shale-boulder.name = Pedra de Xisto block.moss.name = Musgo block.shrubs.name = Arbusto -block.spore-moss.name = Musgo de esporos -block.shalerocks.name = Rohas de xisto +block.spore-moss.name = Musgo de Esporos +block.shalerocks.name = Rochas de Xisto block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -839,16 +839,16 @@ block.ignarock.name = Rocha ígnea block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma block.cliffs.name = Colinas -block.copper-wall.name = Parede de Cobre -block.copper-wall-large.name = Parede de Cobre Grande -block.titanium-wall.name = Parede de titânio -block.titanium-wall-large.name = Parede de titânio grande -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Parede de fase -block.phase-wall-large.name = Parde de fase grande -block.thorium-wall.name = Parede de tório -block.thorium-wall-large.name = Parede de tório grande +block.copper-wall.name = Muro de Cobre +block.copper-wall-large.name = Muro de Cobre Grande +block.titanium-wall.name = Muro de Titânio +block.titanium-wall-large.name = Muro de Titânio grande +block.plastanium-wall.name = Muro de Plastânio Grande +block.plastanium-wall-large.name = Muro de Plastânio Grande +block.phase-wall.name = Muro de Fase +block.phase-wall-large.name = Muro de Fase Grande +block.thorium-wall.name = Muro de Tório +block.thorium-wall-large.name = Muro de Tório Grande block.door.name = Porta block.door-large.name = Porta Grande block.duo.name = Dupla @@ -864,7 +864,7 @@ block.junction.name = Junção block.router.name = Roteador block.distributor.name = Distribuidor block.sorter.name = Ordenador -block.inverted-sorter.name = Inverted Sorter +block.inverted-sorter.name = Ordenador Invertido block.message.name = Mensagem block.overflow-gate.name = Portão Sobrecarregado block.silicon-smelter.name = Fundidora de silicio @@ -917,7 +917,7 @@ block.pyratite-mixer.name = Misturador de Piratita block.blast-mixer.name = Misturador de Explosão block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande -block.oil-extractor.name = Extrator de petróleo +block.oil-extractor.name = Extrator de Petróleo block.command-center.name = Centro de comando block.draug-factory.name = Fábrica de drone de mineração Draug block.spirit-factory.name = Fábrica de drone de reparo Spirit @@ -960,12 +960,12 @@ block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande team.blue.name = Azul -team.crux.name = Vermelho -team.sharded.name = orange +team.crux.name = Vermelha +team.sharded.name = Estilhaçada team.orange.name = Laranja -team.derelict.name = derelict +team.derelict.name = Abandonada team.green.name = Verde -team.purple.name = Roxo +team.purple.name = Roxa unit.spirit.name = Drone Spirit unit.draug.name = Drone minerador Draug unit.phantom.name = Drone Phantom @@ -975,7 +975,7 @@ unit.titan.name = Titan unit.ghoul.name = Bombardeiro Ghoul unit.wraith.name = Lutador Wraith unit.fortress.name = Fortaleza -unit.revenant.name = Fantasma +unit.revenant.name = Revenã unit.eruptor.name = Eruptor unit.chaos-array.name = Arraia do caos unit.eradicator.name = Erradicador diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index c9b44e0183..8f7c34e7c7 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -3,7 +3,7 @@ credits = Творці contributors = Перекладачі та помічники discord = Приєднуйтесь до Mindustry Discord! link.discord.description = Офіційний Discord сервер Mindustry -link.reddit.description = Гілка Mindustry на Reddit +link.reddit.description = Спільнота Mindustry на Reddit link.github.description = Вихідний код гри link.changelog.description = Список змін link.dev-builds.description = Нестабільні версії @@ -25,17 +25,17 @@ load.content = Зміст load.system = Система load.mod = Модифікації schematic = Схема -schematic.add = Зберегти схему... +schematic.add = Зберегти схему… schematics = Схеми schematic.replace = Схема з такою ж назвою вже існує. Замінити її? -schematic.import = Імпортувати схему... +schematic.import = Імпортувати схему… schematic.exportfile = Експортувати файл schematic.importfile = Імпортувати файл schematic.browseworkshop = Переглянути в Майстерні schematic.copy = Копіювати в буфер обміну schematic.copy.import = Імпортувати з клавіатури schematic.shareworkshop = Поширити в Майстерні -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Відобразити схему schematic.saved = Схема збережена. schematic.delete.confirm = Ця схема буде повністю випалена. schematic.rename = Перейменувати схему. @@ -48,7 +48,7 @@ stat.deconstructed = Будівель декоструйовано[accent] {0} stat.delivered = Ресурсів запущено: stat.rank = Фінальний рахунок: [accent]{0} launcheditems = [accent]Запущені предмети -launchinfo = [unlaunched][[LAUNCH] ваше ядро для отримання предметів позначено синім кольором. +launchinfo = [unlaunched]Натисніть на кнопку «[[ЗАПУСК]», щоб ваше ядро отримало предмети, які виділені синім кольором. map.delete = Ви впевнені, що хочете видалити мапу «[accent]{0}[]»? level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи @@ -80,25 +80,25 @@ uploadingcontent = Вивантаження вмісту uploadingpreviewfile = Вивантаження файлу передперегляду committingchanges = Здійснення змін done = Зроблено -feature.unsupported = Your device does not support this feature. +feature.unsupported = Ваш пристрій не підтримує цю особливість. mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [scarlet](Альфа) mods = Модифікації mods.none = [LIGHT_GRAY]Модифікацій не знайдено! mods.guide = Посібник зі створення модифицій mods.report = Повідомити про ваду -mods.openfolder = Open Mod Folder +mods.openfolder = Відкрити теку модифікацій mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено mod.disable = Вимкнути -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. +mod.missingdependencies = [scarlet]Відсутні залежності: {0} +mod.nowdisabled = [scarlet]Модифікації '{0}' не вистачає залежностей:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буду автоматично вимкнена. mod.enable = Увімкнути mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію -mod.import.github = Import Github Mod +mod.import.github = Імпортувати модификацію з Ґітгаб mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} @@ -229,13 +229,13 @@ data.export = Експортувати дані data.import = Импортувати дані data.exported = Дані імпортовано. data.invalid = Це не дійсні ігрові дані. -data.import.confirm = Імпорт зовнішніх даних видалить[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. +data.import.confirm = Імпорт зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. classic.export = Експортувати класичні дані classic.export.text = Класичне (версія 3.5 збірка 40) збереження або мапа були знайдені. Ви хочете експортувати ці дані в домашню теку телефону, для використання у застосунку Mindustry Classic? quit.confirm = Ви впевнені, що хочете вийти? quit.confirm.tutorial = Ви впевнені, що хочете вийти з навчання? loading = [accent]Завантаження… -reloading = [accent]Reloading Mods... +reloading = [accent]Перезавантаження модифікацій… saving = [accent]Збереження… cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy @@ -259,18 +259,18 @@ map.nospawn = Ця мапа не має жодного ядра для появ map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]не помаранчеве[] ядро до цієї мапи в редакторі. map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Оновити предмет +workshop.error = Помилка при отриманні інформації з Майстерні: {0} map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Переконайтеся, що спершу ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +workshop.menu = Виберіть, що ви хочете зробити з цим предметом. +workshop.info = Інформація про предмет +changelog = Журнал змін (за бажанням): eula = Ліцензійна угода -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... -publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! -publish.error = Error publishing item: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. +publishing = [accent]Публікація… +publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! +publish.error = Сталася помилка при публікації предмета: {0} +steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Генерація руд @@ -302,7 +302,7 @@ waves.invalid = Недійсні хвилі у буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. editor.default = [lightgray]<За замовчуванням> -details = Деталі... +details = Деталі… edit = Редагувати… editor.name = Назва: editor.spawn = Створити бойову одиницю @@ -509,7 +509,7 @@ blocks.shootrange = Діапазон дії blocks.size = Розмір blocks.liquidcapacity = Місткість рідини blocks.powerrange = Діапазон передачі енергії -blocks.powerconnections = Max Connections +blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує blocks.powerdamage = Енергія/урон blocks.itemcapacity = Місткість предметів @@ -523,17 +523,17 @@ blocks.drillspeed = Базова швидкість буріння blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я -blocks.buildtime = Час будівництва +blocks.buildtime = Час будування blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси bar.drilltierreq = Потребується кращий бур -bar.drillspeed = Швидкість буріння: {0}/с -bar.pumpspeed = Pump Speed: {0}/s +bar.drillspeed = Швидкість буріння: {0} за с. +bar.pumpspeed = Швидкість викачування: {0} за с. bar.efficiency = Ефективність: {0}% -bar.powerbalance = Енергія: {0}/с +bar.powerbalance = Енергія: {0} за с. bar.powerstored = Зберігає: {0}/{1} bar.poweramount = Енергія: {0} bar.poweroutput = Вихідна енергія: {0} @@ -542,7 +542,7 @@ bar.capacity = Місткість: {0} bar.liquid = Рідина bar.heat = Нагрівання bar.power = Енергія -bar.progress = Хід будівництва +bar.progress = Хід будування bar.spawned = Бойов. од.: {0}/{1} bullet.damage = [stat]{0}[lightgray] шкода bullet.splashdamage = [stat]{0}[lightgray] шкода по ділянці ~[stat] {1}[lightgray] блок. @@ -556,27 +556,27 @@ bullet.tarred = [stat]дьогтьовий bullet.multiplier = [stat]{0}[lightgray]x патронів bullet.reload = [stat]{0}[lightgray]x швидкість перезаряджання unit.blocks = блоки -unit.powersecond = одиниць енергії/секунду -unit.liquidsecond = рідких одиниць/секунду -unit.itemssecond = предметів/секунду -unit.liquidunits = рідинних одиниць -unit.powerunits = енергетичних одиниць +unit.powersecond = одиниць енергії за секунду +unit.liquidsecond = одиниць рідини за секунду +unit.itemssecond = предметів за секунду +unit.liquidunits = одиниць рідини +unit.powerunits = одиниць енергії unit.degrees = град. -unit.seconds = сек. -unit.persecond = /сек +unit.seconds = с +unit.persecond = за секунду unit.timesspeed = x швидкість unit.percent = % unit.items = предм. -category.general = Загальні -category.power = Енергетичні +category.general = Загальне +category.power = Енергія category.liquids = Рідини category.items = Предмети -category.crafting = Введення/виведення +category.crafting = Виробництво category.shooting = Стрільба category.optional = Додаткові поліпшення setting.landscape.name = Тільки альбомний(гозинтальний) режим setting.shadows.name = Тіні -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація setting.hints.name = Hints setting.animatedwater.name = Анімована вода @@ -599,18 +599,18 @@ setting.difficulty.insane = Неможлива setting.difficulty.name = Складність: setting.screenshake.name = Тряска екрану setting.effects.name = Ефекти -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Показувати зруйновані блоки +setting.conveyorpathfinding.name = Пошук шляху для встановлення конвейерівConveyor Placement Pathfinding setting.sensitivity.name = Чутливість контролера setting.saveinterval.name = Інтервал збереження -setting.seconds = {0} сек. +setting.seconds = {0} с setting.fullscreen.name = Повноекранний режим setting.borderlesswindow.name = Вікно без полів[lightgray] (може потребувати перезапуску) -setting.fps.name = Показувати FPS +setting.fps.name = Показувати FPS і затримку до сервера setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація[lightgray] (вимикає анімації) setting.minimap.name = Показувати міні-мапу -setting.position.name = Show Player Position +setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.ambientvol.name = Звуки навколишнього середовища setting.mutemusic.name = Заглушити музику @@ -635,16 +635,16 @@ category.multiplayer.name = Мережева гра command.attack = Атакувати command.rally = Точка збору command.retreat = Відступити -keybind.clear_building.name = Clear Building +keybind.clear_building.name = Очистити план будування keybind.press = Натисніть клавішу… keybind.press.axis = Натисніть клавішу… keybind.screenshot.name = Зняток мапи -keybind.move_x.name = Рух по осі x -keybind.move_y.name = Рух по осі y -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.move_x.name = Рух по осі X +keybind.move_y.name = Рух по осі Y +keybind.schematic_select.name = Вибрати ділянку +keybind.schematic_menu.name = Меню схем +keybind.schematic_flip_x.name = Відобразити по осі X +keybind.schematic_flip_y.name = Відобразити по осі Y keybind.fullscreen.name = Повноекранний keybind.select.name = Вибір/Постріл keybind.diagonal_placement.name = Діагональне розміщення @@ -656,14 +656,14 @@ keybind.zoom_hold.name = Керування масштабом keybind.zoom.name = Приблизити keybind.menu.name = Меню keybind.pause.name = Пауза -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Призупинити/Продовжити будування keybind.minimap.name = Мінімапа -keybind.dash.name = Прискоритися/Літати +keybind.dash.name = Прискоритися & летіітати keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль keybind.rotate.name = Обертати -keybind.rotateplaced.name = Обертати існуюче (утримуйте) +keybind.rotateplaced.name = Обертати існуюче (прокручуйте) keybind.toggle_menus.name = Меню перемикання keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату @@ -695,7 +695,7 @@ rules.unitdamagemultiplier = Множник шкоди бойових одини rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (блоків) rules.respawntime = Час відродження:[lightgray] (sec) rules.wavespacing = Інтервал хвиль:[lightgray] (sec) -rules.buildcostmultiplier = Множник затрат на будівництво +rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування rules.waitForWaveToEnd = Хвилі чекають на ворогів rules.dropzoneradius = Радіус зони висадки:[lightgray] (блоків) @@ -703,7 +703,7 @@ rules.respawns = Максимальна кількість відроджень rules.limitedRespawns = Обмеження відроджень rules.title.waves = Хвилі rules.title.respawns = Відродження -rules.title.resourcesbuilding = Ресурси & будівництво +rules.title.resourcesbuilding = Ресурси & будування rules.title.player = Гравці rules.title.enemy = Вороги rules.title.unit = Бойов. од. @@ -836,15 +836,15 @@ block.dark-panel-5.name = Темна панель 5 block.dark-panel-6.name = Темна панель 6 block.dark-metal.name = Темний метал block.ignarock.name = Магматичні гірські породи -block.hotrock.name = Гарячий Камінь +block.hotrock.name = Гарячий камінь block.magmarock.name = Магмовий камінь block.cliffs.name = Скелі block.copper-wall.name = Мідна стіна block.copper-wall-large.name = Велика мідна стіна block.titanium-wall.name = Титанова стіна block.titanium-wall-large.name = Велика титанова стіна -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.plastanium-wall.name = Пластанієва стіна +block.plastanium-wall-large.name = Велика пластанієва стіна block.phase-wall.name = Фазова стіна block.phase-wall-large.name = Велика фазова стіна block.thorium-wall.name = Торієва стіна @@ -899,11 +899,11 @@ block.omega-mech-pad.name = Реконструктор «Омега» block.tau-mech-pad.name = Реконструктор «Тау» block.conduit.name = Трубопровід block.mechanical-pump.name = Механічна помпа -block.item-source.name = Джерело предметів +block.item-source.name = Нескінченне джерело предметів block.item-void.name = Предметний вакуум -block.liquid-source.name = Рідке джерело +block.liquid-source.name = Нескінченне джерело рідин block.power-void.name = Енергетичний вакуум -block.power-source.name = Джерело енергії +block.power-source.name = Нескінченне джерело енергії block.unloader.name = Розвантажувач block.vault.name = Сховище block.wave.name = Хвиля @@ -982,8 +982,8 @@ unit.eradicator.name = Випалювач unit.lich.name = Лич unit.reaper.name = Жнець tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді -tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочніть з[accent] видобування міді[]. Використовуйте [[WASD] для руху.\n[accent] Утримуйте [[Ctrl] під час прокрутки миші[] для приближення і віддалення. Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді +tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть екраном, щоб рухатися.\n[accent] Зведіть або розведіть 2 пальця [] для приближення і віддалення відповідно.\nз[accent] видобування міді.[] Наблизьтесь, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\n[accent]Натисніть ПКМ[], щоб зупинити будування. tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення to confirm your selection.\nPress the[accent] X button[] to cancel placement. tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] @@ -991,8 +991,8 @@ tutorial.conveyor = [accent]Конвеєри[] використовуються tutorial.conveyor.mobile = [accent]Конвеєри[] використовується для транспортування предметів до ядра.\nЗробіть лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви вибрали.\nВикористовуйте колесо прокрутки, щоб обертати блоки перед їх розміщенням\n[accent]{0}/{1} конвеєрів, які розміщені в лінію\n[accent]0/1 предмет доставлено tutorial.turret = Оборонні споруди повинні бути побудовані для відбиття[lightgray] ворогів[].\nПобудуйте[accent] башточку «Подвійна»[] біля вашої бази. tutorial.drillturret = «Подвійна» потребує [accent] мідні боєприпаси []для стрільби.\nРозмістіть бур біля башточки\nПроведіть конвеєри до башточки, щоб заповнити її боєприпасами.\n\n[accent]Доставлено боєприпасів: 0/1 -tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch -tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будівництво під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. +tutorial.pause = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисність пробіл для павзи.tutorial.launch +tutorial.pause.mobile = Під час бою ви можете[accent] поставити на павзу гру.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]атисніть кнопку зліва вгорі для павзи. tutorial.unpause = Тепер натисність пробіл, щоб зняти павзу. tutorial.unpause.mobile = Тепер натисність туди ще раз, щоб зняти павзу. tutorial.breaking = Блоки часто повинні бути знищені.\n[accent]Утримуючи ПКМ[] Ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з металобрухту ліворуч від вашого ядра використовуючи видалення у зоні. @@ -1022,17 +1022,17 @@ liquid.water.description = Найкорисніша рідина. Зазвича liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена в вугілля в якості палива або використана як куля. liquid.cryofluid.description = Інертна, не роз’їдаюча рідина, створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості охолоджуючої рідини. -mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будівництва. Наносить більше шкоди, ніж «Дротик». +mech.alpha-mech.description = Стандартний керований мех. Заснований на бойовій одиниці «Кинджал», з оновленими бронею та можливостями будування. Наносить більше шкоди, ніж «Дротик». mech.delta-mech.description = Швидкий, легкоброньований мех, зроблений для тактики «атакуй і біжи». Наносить мало шкоди будівлям, але може дуже швидко вбити великі групи підрозділів противника своєю дуговою блискавкою. mech.tau-mech.description = Мех підтримки. Ремонтує союзні блоки, стріляючи по них. Може зцілювати союзників у радіусі його ремонтної здатності. mech.omega-mech.description = Об’ємний і добре броньований мех, зроблений для фронтових штурмів. Його броня може перекрити до 90% пошкоджень, що надходять. mech.dart-ship.description = Стандартний корабель управління. Розумно швидкий і легкий, але має мало наступальних можливостей і низьку швидкість видобутку. mech.javelin-ship.description = Корабель для стратегії атакуй та біжи». Хоча спочатку він повільний, потім вже може розганятися до великих швидкостей і літати над ворожими форпостами, завдаючи великої кількості шкоди своїми блискавками та ракетами. -mech.trident-ship.description = Важкий бомбардувальник, побудований для будівництва та знищення ворожих укріплень. Дуже добре броньований. +mech.trident-ship.description = Важкий бомбардувальник, побудований для будування та знищення ворожих укріплень. Дуже добре броньований. mech.glaive-ship.description = Великий, добре броньований бойовий корабель. Оснащений запальним ретранслятором. Високо маневрений. unit.draug.description = Примітивний дрон, який добуває ресурси. Дешевий для виробництва. Автоматично видобуває мідь і свинець поблизу. Доставляє видобуті ресурси до найближчого ядра. unit.spirit.description = Модифікований «Драугр», призначений для ремонту замість видобутку. Автоматично відновлює будь-які пошкоджені блоки. -unit.phantom.description = Вдосконалений безпілотник. Йде за користувачами. Допомагає в будівництві блоків. +unit.phantom.description = Вдосконалений безпілотник. Йде за користувачами. Допомагає в будуванні блоків. unit.dagger.description = Базовий мех(бойова одиниця). Дешевий у виробництві. Нездоланні при використанні в натовпі. unit.crawler.description = Наземна одиниця, що складається зі стертої рами з високими вибуховими речовинами, прив’язаними зверху. Не особливо міцний. Вибухає при контакті з ворогами. unit.titan.description = Вдосконалений броньований наземний блок. Нападає як на наземні, так і повітряні цілі. Оснащений двома мініатюрними вогнеметами класу Випалювач. @@ -1067,8 +1067,8 @@ block.copper-wall.description = Дешевий захисний блок.\nКо block.copper-wall-large.description = Дешевий захисний блок.\nКорисна для захисту ядра та башточок у перші кілька хвиль.\nОхоплює кілька плиток. block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів. block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від ворогів.\nОхоплює кілька плиток. -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання енергетичних вузлів. +block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з'єднання вузлів живлення.\nОхоплює кілька плиток. block.thorium-wall.description = Сильний захисний блок.\nГідний захист від ворогів. block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від ворогів.\nОхоплює кілька плиток. block.phase-wall.description = Стіна, покрита спеціальним світловідбиваючим складом, який базується на фазовій тканині. Відхиляє більшість куль при ударі. @@ -1104,7 +1104,7 @@ block.liquid-junction.description = Діє як міст для двох кан block.bridge-conduit.description = Розширений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.phase-conduit.description = Розширений блок транспортування рідини. Використовує енергію для транспортування рідин до підключеного фазового каналу через декілька плиток. block.power-node.description = Передає живлення на підключені вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. -block.power-node-large.description = Удосконалений вузол живлення з більшим діапазоном і більшою кількістю підключень. +block.power-node-large.description = Удосконалений вузол живлення з більшим діапазоном. block.surge-tower.description = Надзвичайно дальний вузол живлення з меншою кількістю доступних з’єднань. block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index 87b5e8803b..d99e3b590b 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -18,12 +18,14 @@ gameover = 遊戲結束 gameover.pvp = [accent]{0}[]隊獲勝! highscore = [accent]新的高分紀錄! copied = 已複製。 + load.sound = 音效載入中 load.map = 地圖載入中 load.image = 圖片載入中 load.content = 內容載入中 load.system = 系統載入中 load.mod = 模組載入中 + schematic = 藍圖 schematic.add = 儲存藍圖... schematics = 藍圖 @@ -40,6 +42,7 @@ schematic.saved = 藍圖已保存。 schematic.delete.confirm = 該藍圖將被完全清除。 schematic.rename = 重新命名藍圖 schematic.info = {0}x{1}, {2}方塊 + stat.wave = 打敗的波次:[accent]{0} stat.enemiesDestroyed = 摧毀的敵人:[accent]{0} stat.built = 建設的建築:[accent]{0} @@ -47,6 +50,7 @@ stat.destroyed = 摧毀的建築:[accent]{0} stat.deconstructed = 拆除的建築:[accent]{0} stat.delivered = 發射的核心資源: stat.rank = 最終排名:[accent]{0} + launcheditems = [accent]已發射的物品 launchinfo = [unlaunched][[LAUNCH]你的核心以獲得藍字部分的物品。 map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? @@ -87,14 +91,14 @@ mods = 模組 mods.none = [lightgray]找不到模組! mods.guide = 模組指南 mods.report = 回報錯誤 -mods.openfolder = Open Mod Folder +mods.openfolder = 開啟模組資料夾 mod.enabled = [lightgray]已啟用 mod.disabled = [scarlet]已禁用 +mod.enable = 啟用 mod.disable = 禁用 -mod.delete.error = Unable to delete mod. File may be in use. +mod.delete.error = 無法刪除模組,檔案可能在使用中。 mod.missingdependencies = [scarlet]缺少依賴項目: {0} mod.nowdisabled = [scarlet]「{0}'」模組缺少依賴項目:[accent] {1}\n[lightgray]必須先下載這些模組。\n此模組將被自動禁用。 -mod.enable = 啟用 mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 mod.reloadrequired = [scarlet]需要重新載入 mod.import = 匯入模組 @@ -104,6 +108,7 @@ mod.author = [lightgray]作者:[] {0} mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} mod.preview.missing = 在工作坊發佈這個模組前,您必須添加預覽圖。\n在該模組的資料夾中放置一個名為[accent] preview.png[]的圖片並重試。 mod.folder.missing = 只有資料夾形式的模組可以在工作坊上發布。\n要將模組轉換為資料夾,只需將其文件解壓縮到資料夾並刪除舊的.zip檔,然後重新啟動遊戲或重新載入模組。 + about.button = 關於 name = 名稱: noname = 請先選擇一個[accent]玩家名稱[]。 @@ -270,7 +275,7 @@ missing = 此項目已被刪除或移動。\n[lightgray]工作坊列表現在已 publishing = [accent]發佈中... publish.confirm = 您確定要發布嗎?\n\n[lightgray]首先確定您同意Workshop EULA,否則您的項目將不會顯示! publish.error = 發佈項目時出錯: {0} -steam.error = Failed to initialize Steam services.\nError: {0} +steam.error = Steam 服務初始化失敗.\n錯誤: {0} editor.brush = 粉刷 editor.openin = 在編輯器中開啟 editor.oregen = 礦石生成 @@ -347,6 +352,7 @@ editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。 editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖? editor.exists = 具有該名稱的地圖已經存在。 editor.selectmap = 選取要載入的地圖: + toolmode.replace = 取代 toolmode.replace.description = 僅繪製在實體方塊上。 toolmode.replaceall = 全部取代 @@ -361,6 +367,7 @@ toolmode.fillteams = 填充團隊 toolmode.fillteams.description = 填充團隊而不是方塊。 toolmode.drawteams = Draw Teams toolmode.drawteams.description = 繪製團隊而不是方塊。 + filters.empty = [lightgray]沒有過濾器!使用下面的按鈕添加一個。 filter.distort = 扭曲 filter.noise = 雜訊 @@ -392,6 +399,7 @@ filter.option.floor2 = 次要地板 filter.option.threshold2 = 次要閾值 filter.option.radius = 半徑 filter.option.percentile = 百分比 + width = 寬度: height = 長度: menu = 主選單 @@ -407,6 +415,7 @@ tutorial = 教學 tutorial.retake = 重置教學 editor = 地圖編輯器 mapeditor = 地圖編輯器 + abandon = 放棄 abandon.text = 此區域及其所有資源將會丟失給敵人。 locked = 鎖定 @@ -437,6 +446,7 @@ zone.objective.survival = 生存 zone.objective.attack = 摧毀敵人核心 add = 新增... boss.health = 頭目血量 + connectfail = [crimson]伺服器連線錯誤:[accent]{0} error.unreachable = 無法到達伺服器。請確認位址是否正確? error.invalidaddress = 無效的位址。 @@ -447,6 +457,7 @@ error.mapnotfound = 找不到地圖! error.io = 網絡輸出入錯誤。 error.any = 未知網絡錯誤。 error.bloom = 初始化特效失敗.\n您的設備可能不支援它 + zone.groundZero.name = 零號地區 zone.desertWastes.name = 沙漠荒原 zone.craters.name = 隕石坑 @@ -461,6 +472,7 @@ zone.saltFlats.name = 鹽沼 zone.impact0078.name = 衝擊 0078 zone.crags.name = 岩壁 zone.fungalPass.name = 真菌隘口 + zone.groundZero.description = 再次開始的最佳位置。敵人威脅度低。資源少。\n盡可能的收集更多的鉛和銅。\n繼續前進。 zone.frozenForest.description = 即使這裡更靠近山脈,孢子也已經擴散到這裡了。嚴寒的溫度不可能永遠禁錮它們。\n\n開始進入能源的世界。建造燃燒發電機。學會使用修理方塊。 zone.desertWastes.description = 這些荒原規模巨大,難以預測,並且與廢棄的結構交錯在一起。\n此地區存在著煤炭。燃燒它以獲得能源或合成石墨。\n\n[lightgray]無法保證此地圖的著陸位置。 @@ -475,6 +487,7 @@ zone.nuclearComplex.description = 以前生產和加工釷的設施已變成廢 zone.fungalPass.description = 高山與被孢子纏繞的低地之間的過渡區域。一個小的敵人偵察基地位於這裡。\n破壞它。\n使用匕首機甲和爬行機甲單位來摧毀兩個核心。 zone.impact0078.description = <在此處輸入說明> zone.crags.description = <在此輸入說明> + settings.language = 語言 settings.data = 遊戲數據 settings.reset = 重設為預設設定 @@ -509,7 +522,7 @@ blocks.shootrange = 範圍 blocks.size = 尺寸 blocks.liquidcapacity = 液體容量 blocks.powerrange = 輸出範圍 -blocks.powerconnections = Max Connections +blocks.powerconnections = 最大連接數 blocks.poweruse = 能量使用 blocks.powerdamage = 能量/傷害 blocks.itemcapacity = 物品容量 @@ -529,9 +542,10 @@ blocks.inaccuracy = 誤差 blocks.shots = 射擊數 blocks.reload = 射擊次數/秒 blocks.ammo = 彈藥 + bar.drilltierreq = 需要更好的鑽頭 bar.drillspeed = 鑽頭速度:{0}/秒 -bar.pumpspeed = Pump Speed: {0}/s +bar.pumpspeed = 液體泵送速度:{0}/s bar.efficiency = 效率:{0}% bar.powerbalance = 能量變化:{0} bar.powerstored = 能量存量: {0}/{1} @@ -544,6 +558,9 @@ bar.heat = 熱 bar.power = 能量 bar.progress = 建造進度 bar.spawned = 單位:{0}/{1} +bar.input = 能量輸入 +bar.output = 能量輸出 + bullet.damage = [stat]{0}[lightgray]傷害 bullet.splashdamage = [stat]{0}[lightgray]範圍傷害 ~[stat] {1}[lightgray]格 bullet.incendiary = [stat]燃燒 @@ -555,6 +572,7 @@ bullet.freezing = [stat]冷凍 bullet.tarred = [stat]焦油 bullet.multiplier = [stat]{0}[lightgray]×彈藥倍數 bullet.reload = [stat]{0}[lightgray]×射擊速率 + unit.blocks = 方塊 unit.powersecond = 能量單位/秒 unit.liquidsecond = 液體單位/秒 @@ -574,9 +592,10 @@ category.items = 物品 category.crafting = 需求 category.shooting = 射擊 category.optional = 可選的強化 + setting.landscape.name = 鎖定水平畫面 setting.shadows.name = 陰影 -setting.blockreplace.name = Automatic Block Suggestions +setting.blockreplace.name = 方塊建造建議 setting.linear.name = 線性過濾 setting.hints.name = 提示 setting.animatedwater.name = 水動畫 @@ -599,8 +618,8 @@ setting.difficulty.insane = 瘋狂 setting.difficulty.name = 難度: setting.screenshake.name = 畫面抖動 setting.effects.name = 顯示特效 -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = 顯示被破壞的方塊 +setting.conveyorpathfinding.name = 自動輸送帶放置規劃 setting.sensitivity.name = 控制器靈敏度 setting.saveinterval.name = 自動存檔間隔 setting.seconds = {0}秒 @@ -681,6 +700,7 @@ mode.pvp.description = 和其他玩家競爭、戰鬥。 mode.attack.name = 進攻 mode.attack.description = 沒有波次,目標是摧毀敵人的基地。 mode.custom = 自訂規則 + rules.infiniteresources = 無限資源 rules.wavetimer = 波次時間 rules.waves = 波次 @@ -707,6 +727,7 @@ rules.title.resourcesbuilding = 資源與建築 rules.title.player = 玩家 rules.title.enemy = 敵人 rules.title.unit = 單位 + content.item.name = 物品 content.liquid.name = 液體 content.unit.name = 單位 @@ -732,6 +753,7 @@ liquid.water.name = 水 liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 + mech.alpha-mech.name = 阿爾法 mech.alpha-mech.weapon = 重型機關槍 mech.alpha-mech.ability = 自修復 @@ -879,6 +901,7 @@ block.coal-centrifuge.name = 煤炭離心機 block.power-node.name = 能量節點 block.power-node-large.name = 大型能量節點 block.surge-tower.name = 波動塔 +block.diode.name = 二極體 block.battery.name = 電池 block.battery-large.name = 大型電池 block.combustion-generator.name = 燃燒發電機 @@ -1106,6 +1129,7 @@ block.phase-conduit.description = 高級的液體運輸方塊。使用能量將 block.power-node.description = 將能量傳輸到相連的節點。該節點將從任何相鄰方塊接收能量或向任何相鄰方塊供應能量。 block.power-node-large.description = 具有更大範圍和更多連接的高級電源節點。 block.surge-tower.description = 具有兩個可用連接的超遠程能量節點。 +block.diode.description = 電池中的電力在這個方塊中只能有一個固定的流向,並且只有在另一側的能量較少時才會通過。 block.battery.description = 有能量剩餘時存儲電力並在能量短缺時提供能量。 block.battery-large.description = 比普通電池存儲更多的能量。 block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。 @@ -1165,3 +1189,4 @@ block.omega-mech-pad.description = 改裝現在的船隻,換成龐大、具有 block.javelin-ship-pad.description = 改裝現在的船隻,換成具有閃電武器、強大而快速的攔截機。\n站在上面雙擊機坪以使用它。 block.trident-ship-pad.description = 改裝現在的船隻,換成具有相當不錯裝甲的重型轟炸機。\n站在上面雙擊機坪以使用它。 block.glaive-ship-pad.description = 改裝現在的船隻,換成具有重裝甲的砲艇。\n站在上面雙擊機坪以使用它。 + diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 597b31e6f2..74ea9433c9 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -1010,6 +1010,7 @@ public class Blocks implements ContentList{ pulseConduit = new Conduit("pulse-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.titanium, 2, Items.metaglass, 1)); liquidCapacity = 16f; + liquidPressure = 1.025f; health = 90; }}; diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java index fa94b6b2f2..8b68a403e2 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -186,7 +186,7 @@ public class WaveInfoDialog extends FloatingDialog{ }).width(80f); a.add(" + "); - a.addField(Strings.fixed(Math.max((Mathf.isZero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { + a.addField(Strings.fixed(Math.max((Mathf.zero(group.unitScaling) ? 0 : 1f / group.unitScaling), 0), 2), TextFieldFilter.floatsOnly, text -> { if(Strings.canParsePositiveFloat(text)){ group.unitScaling = 1f / Strings.parseFloat(text); updateWaves(); diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 35205daa42..a4c59b4d53 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -34,39 +34,36 @@ public interface BuilderTrait extends Entity, TeamTrait{ default void updateBuilding(){ float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : placeDistance; Unit unit = (Unit)this; + //remove already completed build requests removal.clear(); - for(BuildRequest req : buildQueue()){ - removal.add(req); - } + removal.addAll(buildQueue()); - buildQueue().clear(); + Structs.filter(buildQueue(), req -> { + Tile tile = world.tile(req.x, req.y); + return tile == null || (req.breaking && tile.block() == Blocks.air) || (!req.breaking && (tile.rotation() == req.rotation || !req.block.rotate) && tile.block() == req.block); + }); - for(BuildRequest request : removal){ - Tile tile = world.tile(request.x, request.y); + TileEntity core = unit.getClosestCore(); - if(!(tile == null || (request.breaking && tile.block() == Blocks.air) || - (!request.breaking && (tile.rotation() == request.rotation || !request.block.rotate) && tile.block() == request.block))){ - buildQueue().addLast(request); + //nothing to build. + if(buildRequest() == null) return; + + //find the next build request + if(buildQueue().size > 1){ + int total = 0; + BuildRequest req; + while((dst((req = buildRequest()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < buildQueue().size){ + buildQueue().removeFirst(); + buildQueue().addLast(req); + total++; } } BuildRequest current = buildRequest(); - if(current == null){ - return; - } - Tile tile = world.tile(current.x, current.y); - if(dst(tile) > finalPlaceDst){ - if(buildQueue().size > 1){ - buildQueue().removeFirst(); - buildQueue().addLast(current); - } - return; - } - if(!(tile.block() instanceof BuildBlock)){ if(!current.initialized && canCreateBlocks() && !current.breaking && Build.validPlace(getTeam(), current.x, current.y, current.block, current.rotation)){ Call.beginPlace(getTeam(), current.x, current.y, current.block, current.rotation); @@ -78,8 +75,6 @@ public interface BuilderTrait extends Entity, TeamTrait{ } } - TileEntity core = unit.getClosestCore(); - if(tile.entity instanceof BuildEntity && !current.initialized){ Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, unit.getTeam(), this, current.breaking))); current.initialized = true; @@ -111,9 +106,17 @@ public interface BuilderTrait extends Entity, TeamTrait{ } } + current.stuck = Mathf.equal(current.progress, entity.progress); current.progress = entity.progress; } + /** @return whether this request should be skipped, in favor of the next one. */ + default boolean shouldSkip(BuildRequest request, @Nullable TileEntity core){ + //requests that you have at least *started* are considered + if(state.rules.infiniteResources || request.breaking || !request.initialized) return false; + return request.stuck && !core.items.has(request.block.requirements); + } + /** Returns the queue for storing build requests. */ Queue buildQueue(); @@ -287,8 +290,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ /** Last progress.*/ public float progress; - /** Whether construction has started for this request.*/ - public boolean initialized, worldContext = true; + /** Whether construction has started for this request, and other special variables.*/ + public boolean initialized, worldContext = true, stuck; /** Visual scale. Used only for rendering.*/ public float animScale = 0f; diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 5fa2ea9aae..3438eac854 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -87,6 +87,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ return Time.delta() * timeScale; } + /** Base efficiency. If this entity has non-buffered power, returns the power %, otherwise returns 1. */ + public float efficiency(){ + return power != null && !block.consumes.getPower().buffered ? power.status : 1f; + } + /** Call when nothing is happening to the entity. This increments the internal sleep timer. */ public void sleep(){ sleepTime += Time.delta(); diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 567a4a706f..ac56c86b6e 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -27,7 +27,8 @@ public class EventType{ drown, exclusionDeath, suicideBomb, - openWiki + openWiki, + teamCoreDamage } public static class WinEvent{} diff --git a/core/src/io/anuke/mindustry/game/LoopControl.java b/core/src/io/anuke/mindustry/game/LoopControl.java index 8a60711ece..e69d3bd260 100644 --- a/core/src/io/anuke/mindustry/game/LoopControl.java +++ b/core/src/io/anuke/mindustry/game/LoopControl.java @@ -30,7 +30,7 @@ public class LoopControl{ data.curVolume = Mathf.lerpDelta(data.curVolume, data.volume * avol, 0.2f); boolean play = data.curVolume > 0.01f; - float pan = Mathf.isZero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); + float pan = Mathf.zero(data.total, 0.0001f) ? 0f : sound.calcPan(data.sum.x / data.total, data.sum.y / data.total); if(data.soundID <= 0){ if(play){ data.soundID = sound.loop(data.curVolume, 1f, pan); diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index e8b242223d..286e2d62e0 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -14,6 +14,7 @@ import io.anuke.arc.util.reflect.Field; import io.anuke.arc.util.reflect.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; +import io.anuke.arc.util.serialization.Jval.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.TechTree.*; @@ -182,7 +183,7 @@ public class ContentParser{ }else if(child.name.equals("liquid")){ block.consumes.add((Consume)parser.readValue(ConsumeLiquid.class, child)); }else if(child.name.equals("power")){ - if(child.isDouble()){ + if(child.isNumber()){ block.consumes.power(child.asFloat()); }else{ block.consumes.add((Consume)parser.readValue(ConsumePower.class, child)); @@ -342,10 +343,7 @@ public class ContentParser{ init(); } - //add comments starting with //, but ignore links - json = json.replace("http://", "http:~~").replace("https://", "https:~~").replaceAll("//.*?\n","\n").replace("http:~~", "http://").replace("https:~~", "https://"); - - JsonValue value = parser.fromJson(null, json); + JsonValue value = parser.fromJson(null, Jval.read(json).toString(Jformat.plain)); if(!parsers.containsKey(type)){ throw new SerializationException("No parsers for content type '" + type + "'"); } diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 2d3c51a6c7..59347e01ab 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -354,7 +354,7 @@ public class Mods implements Loadable{ FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); if(folder.exists()){ for(FileHandle file : folder.list()){ - if(file.extension().equals("json")){ + if(file.extension().equals("json") || file.extension().equals("hjson") || file.extension().equals("js")){ runs.add(new LoadRun(type, file, mod)); } } diff --git a/core/src/io/anuke/mindustry/ui/Bar.java b/core/src/io/anuke/mindustry/ui/Bar.java index da4fa7eaf8..cc9e87b84b 100644 --- a/core/src/io/anuke/mindustry/ui/Bar.java +++ b/core/src/io/anuke/mindustry/ui/Bar.java @@ -63,7 +63,7 @@ public class Bar extends Element{ if(fraction == null) return; float computed = Mathf.clamp(fraction.get()); - if(!Mathf.isEqual(lastValue, computed)){ + if(!Mathf.equal(lastValue, computed)){ blink = 1f; lastValue = computed; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index b786bc3fe4..35e9d25878 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -271,7 +271,7 @@ public class JoinDialog extends FloatingDialog{ Cell cell = ((Table)pane.getParent()).getCell(button); - if(!Mathf.isEqual(cell.minWidth(), pw)){ + if(!Mathf.equal(cell.minWidth(), pw)){ cell.width(pw); cell.padLeft(pad); pane.getParent().invalidateHierarchy(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index f351fd133a..fcf5a882a2 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -360,7 +360,11 @@ public class SettingsMenuDialog extends SettingsDialog{ keyDown(key -> { if(key == KeyCode.ESCAPE || key == KeyCode.BACK){ - hide(); + if(prefs.getChildren().first() != menu){ + back(); + }else{ + hide(); + } } }); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 0f96947f54..6afd96619b 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -42,10 +42,6 @@ public class HudFragment extends Fragment{ private boolean shown = true; private float dsize = 47.2f; - private float coreAttackTime; - private float lastCoreHP; - private Team lastTeam; - private float coreAttackOpacity = 0f; private long lastToast; public void build(Group parent){ @@ -284,44 +280,29 @@ public class HudFragment extends Fragment{ parent.fill(t -> { t.touchable(Touchable.disabled); float notifDuration = 240f; + float[] coreAttackTime = {0}; + float[] coreAttackOpacity = {0}; - Events.on(StateChangeEvent.class, event -> { - if(event.to == State.menu || event.from == State.menu){ - coreAttackTime = 0f; - lastCoreHP = Float.NaN; - } + Events.on(Trigger.teamCoreDamage, () -> { + coreAttackTime[0] = notifDuration; }); t.top().visible(() -> { if(state.is(State.menu) || state.teams.get(player.getTeam()).cores.size == 0 || state.teams.get(player.getTeam()).cores.first().entity == null){ - coreAttackTime = 0f; + coreAttackTime[0] = 0f; return false; } - float curr = state.teams.get(player.getTeam()).cores.first().entity.health; - - if(lastTeam != player.getTeam()){ - lastCoreHP = curr; - lastTeam = player.getTeam(); - return false; - } - - if(!Float.isNaN(lastCoreHP) && curr < lastCoreHP){ - coreAttackTime = notifDuration; - } - lastCoreHP = curr; - - t.getColor().a = coreAttackOpacity; - if(coreAttackTime > 0){ - coreAttackOpacity = Mathf.lerpDelta(coreAttackOpacity, 1f, 0.1f); + t.getColor().a = coreAttackOpacity[0]; + if(coreAttackTime[0] > 0){ + coreAttackOpacity[0] = Mathf.lerpDelta(coreAttackOpacity[0], 1f, 0.1f); }else{ - coreAttackOpacity = Mathf.lerpDelta(coreAttackOpacity, 0f, 0.1f); + coreAttackOpacity[0] = Mathf.lerpDelta(coreAttackOpacity[0], 0f, 0.1f); } - coreAttackTime -= Time.delta(); - lastTeam = player.getTeam(); + coreAttackTime[0] -= Time.delta(); - return coreAttackOpacity > 0; + return coreAttackOpacity[0] > 0; }); t.table(Tex.button, top -> top.add("$coreattack").pad(2) .update(label -> label.getColor().set(Color.orange).lerp(Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)))).touchable(Touchable.disabled); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 9eca2e4611..8e733dab1f 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -207,7 +207,8 @@ public class Block extends BlockStorage{ if(tile == null || tile.entity == null || tile.entity.power == null) return out; for(Tile other : tile.entity.proximity()){ - if(other != null && other.entity != null && other.entity.power != null && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) + if(other != null && other.entity != null && other.entity.power != null + && !(consumesPower && other.block().consumesPower && !outputsPower && !other.block().outputsPower) && !tile.entity.power.links.contains(other.pos())){ out.add(other); } @@ -221,11 +222,7 @@ public class Block extends BlockStorage{ } protected float getProgressIncrease(TileEntity entity, float baseTime){ - float progressIncrease = 1f / baseTime * entity.delta(); - if(hasPower){ - progressIncrease *= entity.power.satisfaction; // Reduced increase in case of low power - } - return progressIncrease; + return 1f / baseTime * entity.delta() * entity.efficiency(); } /** @return whether this block should play its active sound.*/ @@ -532,8 +529,8 @@ public class Block extends BlockStorage{ boolean buffered = cons.buffered; float capacity = cons.capacity; - bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.satisfaction * capacity) ? "" : (int)(entity.power.satisfaction * capacity)) : - Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.isZero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.satisfaction)); + bars.add("power", entity -> new Bar(() -> buffered ? Core.bundle.format("bar.poweramount", Float.isNaN(entity.power.status * capacity) ? "" : (int)(entity.power.status * capacity)) : + Core.bundle.get("bar.power"), () -> Pal.powerBar, () -> Mathf.zero(cons.requestedPower(entity)) && entity.power.graph.getPowerProduced() + entity.power.graph.getBatteryStored() > 0f ? 1f : entity.power.status)); } if(hasItems && configurable){ @@ -594,7 +591,7 @@ public class Block extends BlockStorage{ } if(consumes.hasPower() && consumes.getPower().buffered){ - power += tile.entity.power.satisfaction * consumes.getPower().capacity; + power += tile.entity.power.status * consumes.getPower().capacity; } if(hasLiquids){ diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/io/anuke/mindustry/world/BlockStorage.java index 15d83ec7f3..0200406408 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/io/anuke/mindustry/world/BlockStorage.java @@ -28,6 +28,7 @@ public abstract class BlockStorage extends UnlockableContent{ public int itemCapacity = 10; public float liquidCapacity = 10f; + public float liquidPressure = 1f; public final BlockStats stats = new BlockStats(); public final BlockBars bars = new BlockBars(); @@ -154,7 +155,7 @@ public abstract class BlockStorage extends UnlockableContent{ if(next.block().acceptLiquid(next, tile, liquid, 0f)){ float ofract = next.entity.liquids.get(liquid) / next.block().liquidCapacity; - float fract = tile.entity.liquids.get(liquid) / liquidCapacity; + float fract = tile.entity.liquids.get(liquid) / liquidCapacity * liquidPressure; float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (liquidCapacity), tile.entity.liquids.get(liquid)); flow = Math.min(flow, next.block().liquidCapacity - next.entity.liquids.get(liquid) - 0.001f); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index 52977033f3..0ef91424a3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -108,12 +108,12 @@ public class ForceProjector extends Block{ Effects.effect(Fx.reactorsmoke, tile.drawx() + Mathf.range(tilesize / 2f), tile.drawy() + Mathf.range(tilesize / 2f)); } - entity.warmup = Mathf.lerpDelta(entity.warmup, entity.power.satisfaction, 0.1f); + entity.warmup = Mathf.lerpDelta(entity.warmup, entity.efficiency(), 0.1f); /* - if(entity.power.satisfaction < relativePowerDraw){ + if(entity.power.status < relativePowerDraw){ entity.warmup = Mathf.lerpDelta(entity.warmup, 0f, 0.15f); - entity.power.satisfaction = 0f; + entity.power.status = 0f; if(entity.warmup <= 0.09f){ entity.broken = true; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 30c261e0e1..57488c659a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -70,7 +70,7 @@ public class MendProjector extends Block{ entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f); - if(entity.cons.optionalValid() && entity.timer.get(timerUse, useTime) && entity.power.satisfaction > 0){ + if(entity.cons.optionalValid() && entity.timer.get(timerUse, useTime) && entity.efficiency() > 0){ entity.cons.trigger(); } @@ -90,7 +90,7 @@ public class MendProjector extends Block{ if(other == null) continue; if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ - other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat * phaseBoost) / 100f * entity.power.satisfaction); + other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat * phaseBoost) / 100f * entity.efficiency()); Effects.effect(Fx.healBlockFull, Tmp.c1.set(color).lerp(phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); healed.add(other.pos()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index a9177fa1c7..2b571e04dc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -74,13 +74,13 @@ public class OverdriveProjector extends Block{ entity.phaseHeat = Mathf.lerpDelta(entity.phaseHeat, Mathf.num(entity.cons.optionalValid()), 0.1f); - if(entity.timer.get(timerUse, useTime) && entity.power.satisfaction > 0){ + if(entity.timer.get(timerUse, useTime) && entity.efficiency() > 0){ entity.cons.trigger(); } if(entity.charge >= reload){ float realRange = range + entity.phaseHeat * phaseRangeBoost; - float realBoost = (speedBoost + entity.phaseHeat * speedBoostPhase) * entity.power.satisfaction; + float realBoost = (speedBoost + entity.phaseHeat * speedBoostPhase) * entity.efficiency(); entity.charge = 0f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java index 2150fdac4d..7e4c54ace4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -47,6 +47,6 @@ public class PowerTurret extends CooledTurret{ @Override protected float baseReloadSpeed(Tile tile){ - return tile.isEnemyCheat() ? 1f : tile.entity.power.satisfaction; + return tile.isEnemyCheat() ? 1f : tile.entity.power.status; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index 4c6aae0be6..9a909700e5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -200,7 +200,7 @@ public class Conveyor extends Block implements Autotiler{ if(maxmove > minmove){ pos.y += maxmove; - if(Mathf.isEqual(pos.x, 0, 0.1f)){ + if(Mathf.equal(pos.x, 0, 0.1f)){ pos.x = 0f; } pos.x = Mathf.lerpDelta(pos.x, 0, 0.1f); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index f30fa0433f..a5ed073e6d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -196,7 +196,7 @@ public class ItemBridge extends Block{ entity.uptime = 0f; }else{ - if(entity.cons.valid() && (!hasPower || Mathf.isZero(1f - entity.power.satisfaction))){ + if(entity.cons.valid() && Mathf.zero(1f - entity.efficiency())){ entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, 0.04f); }else{ entity.uptime = Mathf.lerpDelta(entity.uptime, 0f, 0.02f); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java index d282321114..b676950594 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/LiquidBridge.java @@ -32,7 +32,7 @@ public class LiquidBridge extends ItemBridge{ if(entity.cons.valid()){ float alpha = 0.04f; if(hasPower){ - alpha *= entity.power.satisfaction; // Exceed boot time unless power is at max. + alpha *= entity.efficiency(); // Exceed boot time unless power is at max. } entity.uptime = Mathf.lerpDelta(entity.uptime, 1f, alpha); }else{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index 04a8af5b9b..61caaa5fae 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -77,7 +77,7 @@ public class MassDriver extends Block{ //reload regardless of state if(entity.reload > 0f){ - entity.reload = Mathf.clamp(entity.reload - entity.delta() / reloadTime * entity.power.satisfaction); + entity.reload = Mathf.clamp(entity.reload - entity.delta() / reloadTime * entity.efficiency()); } //cleanup waiting shooters that are not valid @@ -113,7 +113,7 @@ public class MassDriver extends Block{ } //align to shooter rotation - entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(entity.currentShooter()), rotateSpeed * entity.power.satisfaction); + entity.rotation = Mathf.slerpDelta(entity.rotation, tile.angleTo(entity.currentShooter()), rotateSpeed * entity.efficiency()); }else if(entity.state == DriverState.shooting){ //if there's nothing to shoot at OR someone wants to shoot at this thing, bail if(!hasLink || (!entity.waitingShooters.isEmpty() && (itemCapacity - entity.items.total() >= minDistribute))){ @@ -133,7 +133,7 @@ public class MassDriver extends Block{ if(entity.reload <= 0.0001f){ //align to target location - entity.rotation = Mathf.slerpDelta(entity.rotation, targetRotation, rotateSpeed * entity.power.satisfaction); + entity.rotation = Mathf.slerpDelta(entity.rotation, targetRotation, rotateSpeed * entity.efficiency()); //fire when it's the first in the queue and angles are ready. if(other.currentShooter() == tile && diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java index 82fd6dc1b3..03ef45e1d0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -71,11 +71,11 @@ public class ImpactReactor extends PowerGenerator{ public void update(Tile tile){ FusionReactorEntity entity = tile.entity(); - if(entity.cons.valid() && entity.power.satisfaction >= 0.99f){ + if(entity.cons.valid() && entity.power.status >= 0.99f){ boolean prevOut = getPowerProduction(tile) <= consumes.getPower().requestedPower(entity); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, warmupSpeed); - if(Mathf.isEqual(entity.warmup, 1f, 0.001f)){ + if(Mathf.equal(entity.warmup, 1f, 0.001f)){ entity.warmup = 1f; } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index e4cbf26c65..07ebe96040 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -47,9 +47,9 @@ public class PowerGraph{ } public float getSatisfaction(){ - if(Mathf.isZero(lastPowerProduced)){ + if(Mathf.zero(lastPowerProduced)){ return 0f; - }else if(Mathf.isZero(lastPowerNeeded)){ + }else if(Mathf.zero(lastPowerNeeded)){ return 1f; } return Mathf.clamp(lastPowerProduced / lastPowerNeeded); @@ -83,7 +83,7 @@ public class PowerGraph{ for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ - totalAccumulator += battery.entity.power.satisfaction * consumes.getPower().capacity; + totalAccumulator += battery.entity.power.status * consumes.getPower().capacity; } } return totalAccumulator; @@ -94,7 +94,7 @@ public class PowerGraph{ for(Tile battery : batteries){ if(battery.block().consumes.hasPower()){ ConsumePower power = battery.block().consumes.getPower(); - totalCapacity += (1f - battery.entity.power.satisfaction) * power.capacity; + totalCapacity += (1f - battery.entity.power.status) * power.capacity; } } return totalCapacity; @@ -112,14 +112,14 @@ public class PowerGraph{ public float useBatteries(float needed){ float stored = getBatteryStored(); - if(Mathf.isEqual(stored, 0f)) return 0f; + if(Mathf.equal(stored, 0f)) return 0f; float used = Math.min(stored, needed); float consumedPowerPercentage = Math.min(1.0f, needed / stored); for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ - battery.entity.power.satisfaction *= (1f-consumedPowerPercentage); + battery.entity.power.status *= (1f-consumedPowerPercentage); } } return used; @@ -129,14 +129,14 @@ public class PowerGraph{ float capacity = getBatteryCapacity(); //how much of the missing in each battery % is charged float chargedPercent = Math.min(excess/capacity, 1f); - if(Mathf.isEqual(capacity, 0f)) return 0f; + if(Mathf.equal(capacity, 0f)) return 0f; for(Tile battery : batteries){ Consumers consumes = battery.block().consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.capacity > 0f){ - battery.entity.power.satisfaction += (1f-battery.entity.power.satisfaction) * chargedPercent; + battery.entity.power.status += (1f-battery.entity.power.status) * chargedPercent; } } } @@ -145,26 +145,26 @@ public class PowerGraph{ public void distributePower(float needed, float produced){ //distribute even if not needed. this is because some might be requiring power but not using it; it updates consumers - float coverage = Mathf.isZero(needed) && Mathf.isZero(produced) ? 0f : Mathf.isZero(needed) ? 1f : Math.min(1, produced / needed); + float coverage = Mathf.zero(needed) && Mathf.zero(produced) ? 0f : Mathf.zero(needed) ? 1f : Math.min(1, produced / needed); for(Tile consumer : consumers){ Consumers consumes = consumer.block().consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.buffered){ - if(!Mathf.isZero(consumePower.capacity)){ + if(!Mathf.zero(consumePower.capacity)){ // Add an equal percentage of power to all buffers, based on the global power coverage in this graph float maximumRate = consumePower.requestedPower(consumer.entity) * coverage * consumer.entity.delta(); - consumer.entity.power.satisfaction = Mathf.clamp(consumer.entity.power.satisfaction + maximumRate / consumePower.capacity); + consumer.entity.power.status = Mathf.clamp(consumer.entity.power.status + maximumRate / consumePower.capacity); } }else{ //valid consumers get power as usual if(otherConsumersAreValid(consumer, consumePower)){ - consumer.entity.power.satisfaction = coverage; + consumer.entity.power.status = coverage; }else{ //invalid consumers get an estimate, if they were to activate - consumer.entity.power.satisfaction = Math.min(1, produced / (needed + consumePower.usage * consumer.entity.delta())); + consumer.entity.power.status = Math.min(1, produced / (needed + consumePower.usage * consumer.entity.delta())); //just in case - if(Float.isNaN(consumer.entity.power.satisfaction)){ - consumer.entity.power.satisfaction = 0f; + if(Float.isNaN(consumer.entity.power.status)){ + consumer.entity.power.status = 0f; } } } @@ -176,9 +176,9 @@ public class PowerGraph{ if(Core.graphics.getFrameId() == lastFrameUpdated){ return; }else if(!consumers.isEmpty() && consumers.first().isEnemyCheat()){ - //when cheating, just set satisfaction to 1 + //when cheating, just set status to 1 for(Tile tile : consumers){ - tile.entity.power.satisfaction = 1f; + tile.entity.power.status = 1f; } return; @@ -198,7 +198,7 @@ public class PowerGraph{ return; } - if(!Mathf.isEqual(powerNeeded, powerProduced)){ + if(!Mathf.equal(powerNeeded, powerProduced)){ if(powerNeeded > powerProduced){ powerProduced += useBatteries(powerNeeded - powerProduced); }else if(powerProduced > powerNeeded){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 2103f4d58e..6a5d1e9c11 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -19,6 +19,8 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; public class PowerNode extends PowerBlock{ + protected static boolean returnValue = false; + protected ObjectSet graphs = new ObjectSet<>(); protected Vector2 t1 = new Vector2(), t2 = new Vector2(); protected TextureRegion laser, laserEnd; @@ -305,7 +307,7 @@ public class PowerNode extends PowerBlock{ public boolean overlaps(@Nullable Tile src, @Nullable Tile other){ if(src == null || other == null) return true; - return overlaps(src.drawx(), src.drawy(), other, laserRange * tilesize); + return Intersector.overlaps(Tmp.cr1.set(src.worldx() + offset(), src.worldy() + offset(), laserRange * tilesize), Tmp.r1.setSize(size * tilesize).setCenter(other.worldx() + offset(), other.worldy() + offset())); } protected void drawLaser(Tile tile, Tile target){ @@ -339,11 +341,9 @@ public class PowerNode extends PowerBlock{ } public static boolean insulated(int x, int y, int x2, int y2){ - final Boolean[] bool = {false}; - insulators(x, y, x2, y2, cause -> { - bool[0] = true; - }); - return bool[0]; + returnValue = false; + insulators(x, y, x2, y2, cause -> returnValue = true); + return returnValue; } public static void insulators(int x, int y, int x2, int y2, Cons iterator){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index ab9af6ea9e..d3756dbd35 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -257,9 +257,7 @@ public class Drill extends Block{ speed = liquidBoostIntensity; } - if(hasPower){ - speed *= entity.power.satisfaction; // Drill slower when not at full power - } + speed *= entity.efficiency(); // Drill slower when not at full power entity.lastDrillSpeed = (speed * entity.dominantItems * entity.warmup) / (drillTime + hardnessDrillMultiplier * entity.dominantItem.hardness); entity.warmup = Mathf.lerpDelta(entity.warmup, speed, warmupSpeed); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index 632fe30b7d..3e77f8f666 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -79,7 +79,7 @@ public class Fracker extends SolidPump{ } super.update(tile); - entity.accumulator += entity.delta() * entity.power.satisfaction; + entity.accumulator += entity.delta() * entity.efficiency(); }else{ tryDumpLiquid(tile, result); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java index 7c9da8619d..6fa9477e69 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java @@ -38,10 +38,8 @@ public class LiquidConverter extends GenericCrafter{ ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); if(tile.entity.cons.valid()){ - float use = Math.min(cl.amount * entity.delta(), liquidCapacity - entity.liquids.get(outputLiquid.liquid)); - if(hasPower){ - use *= entity.power.satisfaction; // Produce less liquid if power is not maxed - } + float use = Math.min(cl.amount * entity.delta(), liquidCapacity - entity.liquids.get(outputLiquid.liquid)) * entity.efficiency(); + useContent(tile, outputLiquid.liquid); entity.progress += use / cl.amount / craftTime; entity.liquids.add(outputLiquid.liquid, use); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java index a2e989d81c..9b91d8b98f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -119,10 +119,7 @@ public class Pump extends LiquidBlock{ } if(tile.entity.cons.valid() && liquidDrop != null){ - float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size); - if(hasPower){ - maxPump *= tile.entity.power.satisfaction; // Produce slower if not at full power - } + float maxPump = Math.min(liquidCapacity - tile.entity.liquids.total(), tiles * pumpAmount * tile.entity.delta() / size / size) * tile.entity.efficiency(); tile.entity.liquids.add(liquidDrop, maxPump); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index 9f5c2bcc96..efe34f5dfb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -101,7 +101,7 @@ public class SolidPump extends Pump{ fraction += entity.boost; if(tile.entity.cons.valid() && typeLiquid(tile) < liquidCapacity - 0.001f){ - float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.power.satisfaction); + float maxPump = Math.min(liquidCapacity - typeLiquid(tile), pumpAmount * entity.delta() * fraction * entity.efficiency()); tile.entity.liquids.add(result, maxPump); entity.warmup = Mathf.lerpDelta(entity.warmup, 1f, 0.02f); if(Mathf.chance(entity.delta() * updateEffectChance)) diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 09552c2bef..b5d7188d02 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -130,6 +130,14 @@ public class CoreBlock extends StorageBlock{ return tile.entity instanceof StorageBlockEntity; } + @Override + public float handleDamage(Tile tile, float amount){ + if(player != null && tile.getTeam() == player.getTeam()){ + Events.fire(Trigger.teamCoreDamage); + } + return amount; + } + @Override public boolean canBreak(Tile tile){ return false; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index 28c700caee..917f2748d6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -100,7 +100,7 @@ public class RepairPoint extends Block{ if(entity.target != null && (entity.target.isDead() || entity.target.dst(tile) > repairRadius || entity.target.health >= entity.target.maxHealth())){ entity.target = null; }else if(entity.target != null && entity.cons.valid()){ - entity.target.health += repairSpeed * Time.delta() * entity.strength * entity.power.satisfaction; + entity.target.health += repairSpeed * Time.delta() * entity.strength * entity.efficiency(); entity.target.clampHealth(); entity.rotation = Mathf.slerpDelta(entity.rotation, entity.angleTo(entity.target), 0.5f); targetIsBeingRepaired = true; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 1090f84015..2747093746 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -159,8 +159,8 @@ public class UnitFactory extends Block{ } if(entity.cons.valid() || tile.isEnemyCheat()){ - entity.time += entity.delta() * entity.speedScl * Vars.state.rules.unitBuildSpeedMultiplier * entity.power.satisfaction; - entity.buildTime += entity.delta() * entity.power.satisfaction * Vars.state.rules.unitBuildSpeedMultiplier; + entity.time += entity.delta() * entity.speedScl * Vars.state.rules.unitBuildSpeedMultiplier * entity.efficiency(); + entity.buildTime += entity.delta() * entity.efficiency() * Vars.state.rules.unitBuildSpeedMultiplier; entity.speedScl = Mathf.lerpDelta(entity.speedScl, 1f, 0.05f); }else{ entity.speedScl = Mathf.lerpDelta(entity.speedScl, 0f, 0.05f); diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java index dcdc1fd487..3343332fc4 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumePower.java @@ -42,7 +42,7 @@ public class ConsumePower extends Consume{ @Override public void update(TileEntity entity){ - // Nothing to do since PowerGraph directly updates entity.power.satisfaction + // Nothing to do since PowerGraph directly updates entity.power.status } @Override @@ -50,7 +50,7 @@ public class ConsumePower extends Consume{ if(buffered){ return true; }else{ - return entity.power.satisfaction > 0f; + return entity.power.status > 0f; } } @@ -71,7 +71,7 @@ public class ConsumePower extends Consume{ public float requestedPower(TileEntity entity){ if(entity.tile.entity == null) return 0f; if(buffered){ - return (1f-entity.power.satisfaction)*capacity; + return (1f-entity.power.status)*capacity; }else{ try{ return usage * Mathf.num(entity.block.shouldConsume(entity.tile)); diff --git a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java index 86f51320b6..c531fabe45 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -41,9 +41,9 @@ public class AmmoListValue implements StatValue{ sep(bt, Core.bundle.format("bullet.splashdamage", (int)type.splashDamage, Strings.fixed(type.splashDamageRadius / tilesize, 1))); } - if(!Mathf.isEqual(type.ammoMultiplier, 1f)) + if(!Mathf.equal(type.ammoMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.multiplier", (int)type.ammoMultiplier)); - if(!Mathf.isEqual(type.reloadMultiplier, 1f)) + if(!Mathf.equal(type.reloadMultiplier, 1f)) sep(bt, Core.bundle.format("bullet.reload", Strings.fixed(type.reloadMultiplier, 1))); if(type.knockback > 0){ diff --git a/core/src/io/anuke/mindustry/world/modules/PowerModule.java b/core/src/io/anuke/mindustry/world/modules/PowerModule.java index ad82a5aedb..ad1a958fb7 100644 --- a/core/src/io/anuke/mindustry/world/modules/PowerModule.java +++ b/core/src/io/anuke/mindustry/world/modules/PowerModule.java @@ -13,7 +13,7 @@ public class PowerModule extends BlockModule{ * Blocks will work at a reduced efficiency if this is not equal to 1.0f. * In case of buffered consumers, this is the percentage of power stored in relation to the maximum capacity. */ - public float satisfaction = 0.0f; + public float status = 0.0f; public PowerGraph graph = new PowerGraph(); public IntArray links = new IntArray(); @@ -23,7 +23,7 @@ public class PowerModule extends BlockModule{ for(int i = 0; i < links.size; i++){ stream.writeInt(links.get(i)); } - stream.writeFloat(satisfaction); + stream.writeFloat(status); } @Override @@ -32,7 +32,7 @@ public class PowerModule extends BlockModule{ for(int i = 0; i < amount; i++){ links.add(stream.readInt()); } - satisfaction = stream.readFloat(); - if(Float.isNaN(satisfaction) || Float.isInfinite(satisfaction)) satisfaction = 0f; + status = stream.readFloat(); + if(Float.isNaN(status) || Float.isInfinite(status)) status = 0f; } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 1ce411d804..1bea20db40 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -35,7 +35,6 @@ import java.util.*; import static io.anuke.mindustry.Vars.*; - public class DesktopLauncher extends ClientLauncher{ public final static String discordID = "610508934456934412"; diff --git a/gradle.properties b/gradle.properties index d5884a59a0..c5fbf4075c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=900a4966bf9b05272c8b0c258dc534540c0628fb +archash=733de7c64e56ecaaec16275889c3f01399cfe38b diff --git a/tests/src/test/java/power/DirectConsumerTests.java b/tests/src/test/java/power/DirectConsumerTests.java index 7fdc9ef612..89ed331c8b 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -50,6 +50,6 @@ public class DirectConsumerTests extends PowerTestFixture{ consumerTile.entity.update(); graph.update(); - assertEquals(expectedSatisfaction, consumerTile.entity.power.satisfaction); + assertEquals(expectedSatisfaction, consumerTile.entity.power.status); } } diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index a4c0c78608..77f5b67570 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest; * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. - * Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but satisfaction should not! + * Any expected power amount (produced, consumed, buffered) should be affected by FakeThreadHandler.fakeDelta but status should not! */ public class ItemLiquidGeneratorTests extends PowerTestFixture{ diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index 3c6e20e288..6b253e4f29 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -16,7 +16,7 @@ import static org.junit.jupiter.api.DynamicTest.dynamicTest; * All tests are run with a fixed delta of 0.5 so delta considerations can be tested as well. * Additionally, each PowerGraph::update() call will have its own thread frame, i.e. the method will never be called twice within the same frame. * Both of these constraints are handled by FakeThreadHandler within PowerTestFixture. - * Any power amount (produced, consumed, buffered) should be affected by Time.delta() but satisfaction should not! + * Any power amount (produced, consumed, buffered) should be affected by Time.delta() but status should not! */ public class PowerTests extends PowerTestFixture{ @@ -29,9 +29,9 @@ public class PowerTests extends PowerTestFixture{ class PowerGraphTests{ /** - * Tests the satisfaction of a single consumer after a single update of the power graph which contains a single producer. + * Tests the status of a single consumer after a single update of the power graph which contains a single producer. *

- * Assumption: When the consumer requests zero power, satisfaction does not change. Default is 0.0f. + * Assumption: When the consumer requests zero power, status does not change. Default is 0.0f. */ @TestFactory DynamicTest[] directConsumerSatisfactionIsAsExpected(){ @@ -61,13 +61,13 @@ public class PowerTests extends PowerTestFixture{ assertEquals(producedPower * Time.delta(), powerGraph.getPowerProduced(), Mathf.FLOAT_ROUNDING_ERROR); assertEquals(requiredPower * Time.delta(), powerGraph.getPowerNeeded(), Mathf.FLOAT_ROUNDING_ERROR); - // Update and check for the expected power satisfaction of the consumer + // Update and check for the expected power status of the consumer powerGraph.update(); - assertEquals(expectedSatisfaction, directConsumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); + assertEquals(expectedSatisfaction, directConsumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); } /** - * Tests the satisfaction of a single direct consumer after a single update of the power graph which contains a single producer and a single battery. + * Tests the status of a single direct consumer after a single update of the power graph which contains a single producer and a single battery. * The used battery is created with a maximum capacity of 100 and receives ten power per tick. */ @TestFactory @@ -101,14 +101,14 @@ public class PowerTests extends PowerTestFixture{ } float maxCapacity = 100f; Tile batteryTile = createFakeTile(0, 2, createFakeBattery(maxCapacity)); - batteryTile.entity.power.satisfaction = initialBatteryCapacity / maxCapacity; + batteryTile.entity.power.status = initialBatteryCapacity / maxCapacity; powerGraph.add(batteryTile); powerGraph.update(); - assertEquals(expectedBatteryCapacity / maxCapacity, batteryTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Expected battery satisfaction did not match"); + assertEquals(expectedBatteryCapacity / maxCapacity, batteryTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Expected battery status did not match"); if(directConsumerTile != null){ - assertEquals(expectedSatisfaction, directConsumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); + assertEquals(expectedSatisfaction, directConsumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR, parameterDescription + ": Satisfaction of direct consumer did not match"); } } @@ -124,13 +124,13 @@ public class PowerTests extends PowerTestFixture{ powerGraph.add(consumerTile); powerGraph.update(); - assertEquals(1.0f, consumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR); + assertEquals(1.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR); powerGraph.remove(producerTile); powerGraph.add(consumerTile); powerGraph.update(); - assertEquals(0.0f, consumerTile.entity.power.satisfaction, Mathf.FLOAT_ROUNDING_ERROR); + assertEquals(0.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR); if(consumerTile.block().consumes.hasPower()){ ConsumePower consumePower = consumerTile.block().consumes.getPower(); assertFalse(consumePower.valid(consumerTile.entity()));