Merge remote-tracking branch 'origin/mech-rework' into mech-rework
# Conflicts: # gradle.properties
BIN
core/assets-raw/sprites/blocks/distribution/inverted-sorter.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
@@ -49,6 +49,7 @@ customgame = Custom Game
|
||||
newgame = New Game
|
||||
none = <none>
|
||||
minimap = Minimap
|
||||
position = Position
|
||||
close = Close
|
||||
website = Website
|
||||
quit = Quit
|
||||
@@ -593,6 +594,7 @@ setting.fps.name = Show FPS
|
||||
setting.vsync.name = VSync
|
||||
setting.pixelate.name = Pixelate[lightgray] (disables animations)
|
||||
setting.minimap.name = Show Minimap
|
||||
setting.position.name = Show Player Position
|
||||
setting.musicvol.name = Music Volume
|
||||
setting.ambientvol.name = Ambient Volume
|
||||
setting.mutemusic.name = Mute Music
|
||||
@@ -604,7 +606,7 @@ setting.publichost.name = Public Game Visibility
|
||||
setting.chatopacity.name = Chat Opacity
|
||||
setting.lasersopacity.name = Power Laser Opacity
|
||||
setting.playerchat.name = Display Player Bubble Chat
|
||||
public.confirm = Do you want to make your game public?\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility.
|
||||
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.beta = Note that beta versions of the game cannot make public lobbies.
|
||||
uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] seconds...
|
||||
uiscale.cancel = Cancel & Exit
|
||||
@@ -845,6 +847,7 @@ block.junction.name = Junction
|
||||
block.router.name = Router
|
||||
block.distributor.name = Distributor
|
||||
block.sorter.name = Sorter
|
||||
block.inverted-sorter.name = Inverted Sorter
|
||||
block.message.name = Message
|
||||
block.overflow-gate.name = Overflow Gate
|
||||
block.silicon-smelter.name = Silicon Smelter
|
||||
@@ -1066,6 +1069,7 @@ block.junction.description = Acts as a bridge for two crossing conveyor belts. U
|
||||
block.bridge-conveyor.description = Advanced item transport block. Allows transporting items over up to 3 tiles of any terrain or building.
|
||||
block.phase-conveyor.description = Advanced item transport block. Uses power to teleport items to a connected phase conveyor over several tiles.
|
||||
block.sorter.description = Sorts items. If an item matches the selection, it is allowed to pass. Otherwise, the item is outputted to the left and right.
|
||||
block.inverted-sorter.descriptions = Processes items like a standard sorter, but outputs selected items to the sides instead.
|
||||
block.router.description = Accepts items, then outputs them to up to 3 other directions equally. Useful for splitting the materials from one source to multiple targets.\n\n[scarlet]Never use next to production inputs, as they will get clogged by output.[]
|
||||
block.distributor.description = An advanced router. Splits items to up to 7 other directions equally.
|
||||
block.overflow-gate.description = A combination splitter and router. Only outputs to the left and right if the front path is blocked.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GRAY](Nel caso non te ne sia accorto, la traduzione del gioco non è completa.\n Chi di dovere sta lavorando più velocemente possibile per completarla! Un aiutino non sarebbe male!)
|
||||
credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
||||
credits = Crediti
|
||||
contributors = Traduttori e Contributori
|
||||
discord = Entra nel server discord di mindustry!
|
||||
@@ -10,7 +10,7 @@ link.trello.description = Scheda ufficiale trello per funzionalità pianificate
|
||||
link.itch.io.description = pagina di itch.io con download per PC e versione web
|
||||
link.google-play.description = Elenco di Google Play Store
|
||||
link.wiki.description = wiki ufficiale di Mindustry
|
||||
linkfail = Impossibile aprire il link! L'URL è stato copiato nella tua bacheca.
|
||||
linkfail = Impossibile aprire il link! L'URL è stato copiato.
|
||||
screenshot = Screenshot salvato a {0}
|
||||
screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera.
|
||||
gameover = Il nucleo è stato distrutto.
|
||||
@@ -25,7 +25,7 @@ stat.wave = Ondate sconfitte:[accent] {0}
|
||||
stat.enemiesDestroyed = Nemici distrutti:[accent] {0}
|
||||
stat.built = Costruzioni erette:[accent] {0}
|
||||
stat.destroyed = Costruzioni distrutte:[accent] {0}
|
||||
stat.deconstructed = Costruzioni smontate:[accent] {0}
|
||||
stat.deconstructed = Costruzioni smantellate:[accent] {0}
|
||||
stat.delivered = Riorse lanciate:
|
||||
stat.rank = Livello finale: [accent]{0}
|
||||
launcheditems = [accent]Oggetti lanciati
|
||||
@@ -48,18 +48,18 @@ minimap = Minimappa
|
||||
close = Chiuso
|
||||
website = Website
|
||||
quit = Esci
|
||||
save.quit = Save & Quit
|
||||
save.quit = Salva ed esci
|
||||
maps = Mappe
|
||||
maps.browse = Browse Maps
|
||||
maps.browse = Consulta Mappe
|
||||
continue = Continua
|
||||
maps.none = [LIGHT_GRAY]Nessuna mappa trovata!
|
||||
invalid = Invalid
|
||||
preparingconfig = Preparing Config
|
||||
preparingcontent = Preparing Content
|
||||
uploadingcontent = Uploading Content
|
||||
uploadingpreviewfile = Uploading Preview File
|
||||
committingchanges = Comitting Changes
|
||||
done = Done
|
||||
invalid = Invalido
|
||||
preparingconfig = Preparo la configurazione
|
||||
preparingcontent = Preparo il contenuto
|
||||
uploadingcontent = Carico il contenuto
|
||||
uploadingpreviewfile = Carico file di anteprima
|
||||
committingchanges = Applico le modifiche
|
||||
done = Fatto
|
||||
about.button = Info
|
||||
name = Nome:
|
||||
noname = Scegli un [accent] nome[] prima di unirti.
|
||||
@@ -74,31 +74,31 @@ players = {0} giocatori online
|
||||
players.single = {0} giocatori online
|
||||
server.closing = [accent]Chiusura server ...
|
||||
server.kicked.kick = Sei stato cacciato dal server!
|
||||
server.kicked.whitelist = You are not whitelisted here.
|
||||
server.kicked.whitelist = Non sei presente in questa whitelist.
|
||||
server.kicked.serverClose = Server chiuso.
|
||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||
server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Buona giornata.
|
||||
server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco!
|
||||
server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare!
|
||||
server.kicked.banned = Sei bannato da questo server.
|
||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||
server.kicked.playerLimit = This server is full. Wait for an empty slot.
|
||||
server.kicked.typeMismatch = Questo server non è comparibile con la tua build.
|
||||
server.kicked.playerLimit = Questo server è pieno. Attendi che si liberi un posto.
|
||||
server.kicked.recentKick = Sei stato cacciato di recente.\nAspetta prima di riconnetterti.
|
||||
server.kicked.nameInUse = C'è già qualcuno con il tuo nome\nsu questo server.
|
||||
server.kicked.nameInUse = C'è già qualcuno con il tuo nome su questo server.
|
||||
server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere.
|
||||
server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account.
|
||||
server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito.
|
||||
server.kicked.gameover = Game over!
|
||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
||||
host.info = Il pulsante [accent]hos [] ospita un server sulle porte [scarlet]6567[] e [scarlet]656.[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il proprio server nel proprio elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall.
|
||||
host.info = Il pulsante [accent]host [] ospita un server sulla porte [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il proprio server nel proprio elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall.
|
||||
join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\n Sono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco di server globali automatici; se si desidera connettersi a qualcuno tramite IP, è necessario chiedere all'host il proprio IP.
|
||||
hostserver = Host Server
|
||||
invitefriends = Invite Friends
|
||||
hostserver.mobile = Host\nServer
|
||||
hostserver = Ospita Server
|
||||
invitefriends = Invita amici
|
||||
hostserver.mobile = Ospita\nServer
|
||||
host = Host
|
||||
hosting = [accent] Apertura del server ...
|
||||
hosts.refresh = Aggiorna
|
||||
hosts.discovering = Ricerca partite LAN
|
||||
hosts.discovering.any = Discovering games
|
||||
hosts.discovering.any = Ricerca partite
|
||||
server.refreshing = Aggiornamento del server
|
||||
hosts.none = [lightgray]Nessuna partita LAN trovata!
|
||||
host.invalid = [scarlet]Impossibile connettersi all'host.
|
||||
@@ -122,7 +122,7 @@ server.version = [lightgray]Versione: {0}
|
||||
server.custombuild = [yellow] Costruzione personalizzata
|
||||
confirmban = Sei sicuro di voler bandire questo giocatore?
|
||||
confirmkick = Sei sicuro di voler espellere questo giocatore?
|
||||
confirmvotekick = Are you sure you want to vote-kick this player?
|
||||
confirmvotekick = Sei sicuro di voler votare per l'espulsione di questo giocatore?
|
||||
confirmunban = Sei sicuro di voler riammettere questo giocatore?
|
||||
confirmadmin = Sei sicuro di voler rendere questo giocatore un amministratore?
|
||||
confirmunadmin = Sei sicuro di voler rimuovere lo stato di amministratore da questo giocatore?
|
||||
@@ -133,7 +133,7 @@ disconnect.error = Connection error.
|
||||
disconnect.closed = Connection closed.
|
||||
disconnect.timeout = Timed out.
|
||||
disconnect.data = Il mondo non si vuole caricare, mi dispiace!
|
||||
cantconnect = Unable to join game ([accent]{0}[]).
|
||||
cantconnect = Impossibile unirsi al server ([accent]{0}[]).
|
||||
connecting = [accent]Connessione in corso ...
|
||||
connecting.data = [accent]Caricamento dei dati del mondo ...
|
||||
server.port = Porta:
|
||||
@@ -145,7 +145,7 @@ save.new = Nuovo Salvataggio
|
||||
save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio?
|
||||
overwrite = Sovrascrivi
|
||||
save.none = Nessun salvataggio trovato!
|
||||
saveload = [Accent]Salvataggio ...
|
||||
saveload = [accent]Salvataggio ...
|
||||
savefail = [crimson]Salvataggio del gioco NON riuscito!
|
||||
save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio?
|
||||
save.delete = Elimina
|
||||
@@ -159,7 +159,7 @@ save.rename = Rinomina
|
||||
save.rename.text = Nuovo nome:
|
||||
selectslot = Seleziona un salvataggio.
|
||||
slot = [accent]Slot {0}
|
||||
editmessage = Edit Message
|
||||
editmessage = Modifica messaggio
|
||||
save.corrupted = [orang]Salvataggio corrotto o non valido!
|
||||
empty = <Vuoto>
|
||||
on = On
|
||||
@@ -173,7 +173,7 @@ save.playtime = Tempo di gioco: {0}
|
||||
warning = Attenzione
|
||||
confirm = Conferma
|
||||
delete = Elimina
|
||||
view.workshop = View In Workshop
|
||||
view.workshop = Vedi nel Workshop
|
||||
ok = OK
|
||||
open = Apri
|
||||
customize = Personalizza
|
||||
@@ -183,13 +183,13 @@ copylink = Copia link
|
||||
back = Indietro
|
||||
data.export = Esporta Salvataggio
|
||||
data.import = Importa Salvataggio
|
||||
data.exported = Data exported.
|
||||
data.invalid = This isn't valid game data.
|
||||
data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately.
|
||||
data.exported = Dati esportati.
|
||||
data.invalid = Questi non sono dati di gioco validi.
|
||||
data.import.confirm = Importare dati di gioco esterni eliminerà[scarlet] tutti[] i tuoi progressi attuali.\n[accent]L'operazione è irreversibile![]\n\nUna volta importati i dati, il gioco si chiuderà immediatamente.
|
||||
classic.export = Esporta dati classici
|
||||
classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vorresti esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app?
|
||||
quit.confirm = Sei sicuro di voler uscire?
|
||||
quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Impostazioni->Gioco->Ripeti il tutorial.[]
|
||||
quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Gioca > Tutorial.[]
|
||||
loading = [accent]Caricamento in corso ...
|
||||
saving = [accent]Salvando ...
|
||||
wave = [accent]Ondata {0}
|
||||
@@ -210,11 +210,11 @@ map.nospawn = Questa mappa non possiede un nucleo in cui spawnare! Aggiungine un
|
||||
map.nospawn.pvp = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare.
|
||||
map.nospawn.attack = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare.
|
||||
map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido.
|
||||
map.publish.error = Error publishing map: {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!
|
||||
map.publish.error = Errore durante la pubblicazione della mappa:\n{0}
|
||||
map.publish.confirm = Vuoi pubblicare questa mappa?\n\n[lightgray]Assicurati di aver accettato il Workshop EULA, o le tue mappe non saranno visibili!
|
||||
eula = Steam EULA
|
||||
map.publish = Map published.
|
||||
map.publishing = [accent]Publishing map...
|
||||
map.publish = Mappa pubblicata.
|
||||
map.publishing = [accent]Pubblico la mappa...
|
||||
editor.brush = Pennello
|
||||
editor.openin = Apri nell'editor
|
||||
editor.oregen = Generazione dei minerali
|
||||
@@ -222,12 +222,12 @@ editor.oregen.info = Generazione dei minerali:
|
||||
editor.mapinfo = Informazioni mappa
|
||||
editor.author = Autore:
|
||||
editor.description = Descrizione:
|
||||
editor.nodescription = A map must have a description of at least 4 characters before being published.
|
||||
editor.nodescription = Una mappa deve avere una descrizione di almeno 4 caratteri per poter essere pubblicata.
|
||||
editor.waves = Ondate:
|
||||
editor.rules = Regole:
|
||||
editor.generation = Generazione:
|
||||
editor.ingame = Modifica in gioco
|
||||
editor.publish.workshop = Publish On Workshop
|
||||
editor.publish.workshop = Pubblica sul Workshop
|
||||
editor.newmap = Nuova mappa
|
||||
workshop = Workshop
|
||||
waves.title = Ondate
|
||||
@@ -246,7 +246,7 @@ waves.invalid = Onde dagli appunti non valide.
|
||||
waves.copied = Onde copiate.
|
||||
waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita.
|
||||
editor.default = [LIGHT_GRAY]<Predefinito>
|
||||
details = Details...
|
||||
details = Dettagli...
|
||||
edit = Modifica...
|
||||
editor.name = Nome:
|
||||
editor.spawn = Piazza un'unità
|
||||
@@ -256,7 +256,7 @@ editor.errorload = Errore nel caricamento di:\n[accent]{0}
|
||||
editor.errorsave = Errore nel salvataggio di:\n[accent]{0}
|
||||
editor.errorimage = Quella è un'immagine, non una mappa. Non cambiare estensioni sperando che funzioni.\n\n Se vuoi importare una mappa vecchia clicca su "importa una mappa vecchia" nell'editor.
|
||||
editor.errorlegacy = La mappa è troppo vecchia ed usa un formato che non è più supportato.
|
||||
editor.errornot = This is not a map file.
|
||||
editor.errornot = Questo file non è una mappa.
|
||||
editor.errorheader = Questo file della mappa è invalido o corrotto.
|
||||
editor.errorname = Questa mappa è senza nome.
|
||||
editor.update = Aggiorna
|
||||
@@ -280,7 +280,7 @@ editor.importimage.description = Importa immagine esterna terreno
|
||||
editor.export = Esportazione...
|
||||
editor.exportfile = Esporta file
|
||||
editor.exportfile.description = Esporta file mappa
|
||||
editor.exportimage = Esporta immagine terreno
|
||||
editor.exportimage = Esporta immagine
|
||||
editor.exportimage.description = Esporta file immagine mappa
|
||||
editor.loadimage = Carica\nimmagine
|
||||
editor.saveimage = Salva\nImmagine
|
||||
@@ -289,7 +289,7 @@ editor.resizemap = Ridimensiona la mappa
|
||||
editor.mapname = Nome Mappa:
|
||||
editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente.
|
||||
editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
|
||||
editor.exists = A map with this name already exists.
|
||||
editor.exists = Esiste già una mappa con questo nome.
|
||||
editor.selectmap = Seleziona una mappa da caricare:
|
||||
toolmode.replace = Rimpiazzare
|
||||
toolmode.replace.description = Disegna solo su blocchi solidi.
|
||||
@@ -369,7 +369,7 @@ launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate
|
||||
uncover = Svelare
|
||||
configure = Configura l'equipaggiamento
|
||||
configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento.
|
||||
configure.invalid = Amount must be a number between 0 and {0}.
|
||||
configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}.
|
||||
zone.unlocked = [LIGHT_GRAY]{0} sbloccata.
|
||||
zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti.
|
||||
zone.config.complete = Ondata {0} raggiunta:\nEquipaggiamento personalizzato sbloccato.
|
||||
@@ -420,7 +420,7 @@ zone.crags.description = <inserisci descrizione>
|
||||
settings.language = Lingua
|
||||
settings.data = Importa/Esporta salvataggio
|
||||
settings.reset = Resetta Alle Impostazioni Predefinite
|
||||
settings.rebind = Reimposta
|
||||
settings.rebind = Modifica
|
||||
settings.controls = Controlli
|
||||
settings.game = Gioco
|
||||
settings.sound = Suoni
|
||||
@@ -490,10 +490,10 @@ bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray]
|
||||
bullet.incendiary = [stat]incendiario
|
||||
bullet.homing = [stat]autoguidato
|
||||
bullet.shock = [stat]stordente
|
||||
bullet.frag = [stat]frammentazione
|
||||
bullet.frag = [stat]a frammentazione
|
||||
bullet.knockback = [stat]{0}[lightgray] contraccolpo
|
||||
bullet.freezing = [stat]congelamento
|
||||
bullet.tarred = [stat]asfaltata
|
||||
bullet.freezing = [stat]congelante
|
||||
bullet.tarred = [stat]viscoso
|
||||
bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni
|
||||
bullet.reload = [stat]{0}[lightgray]x ricarica
|
||||
unit.blocks = blocchi
|
||||
@@ -523,18 +523,18 @@ setting.animatedshields.name = Scudi animati
|
||||
setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[]
|
||||
setting.indicators.name = Indicatori Alleati
|
||||
setting.autotarget.name = Mira automatica
|
||||
setting.keyboard.name = Controlli Mouse+Tastiera
|
||||
setting.keyboard.name = Tastiera
|
||||
setting.touchscreen.name = Touchscreen Controls
|
||||
setting.fpscap.name = Limite FPS
|
||||
setting.fpscap.none = Niente
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[]
|
||||
setting.swapdiagonal.name = Posizionamento sempre diagonale
|
||||
setting.difficulty.training = formazione
|
||||
setting.difficulty.easy = facile
|
||||
setting.difficulty.normal = medio
|
||||
setting.difficulty.hard = difficile
|
||||
setting.difficulty.insane = impossibile
|
||||
setting.difficulty.training = Allenamento
|
||||
setting.difficulty.easy = Facile
|
||||
setting.difficulty.normal = Medio
|
||||
setting.difficulty.hard = Difficile
|
||||
setting.difficulty.insane = Impossibile
|
||||
setting.difficulty.name = Difficoltà:
|
||||
setting.screenshake.name = Movimento dello schermo
|
||||
setting.effects.name = Visualizza effetti
|
||||
@@ -553,8 +553,8 @@ setting.mutemusic.name = Silenzia musica
|
||||
setting.sfxvol.name = Volume Effetti
|
||||
setting.mutesound.name = Togli suoni
|
||||
setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente
|
||||
setting.savecreate.name = Auto-Create Saves
|
||||
setting.publichost.name = Public Game Visibility
|
||||
setting.savecreate.name = Autosalvataggio
|
||||
setting.publichost.name = Gioco visibile pubblicamente
|
||||
setting.chatopacity.name = Opacità chat
|
||||
setting.lasersopacity.name = Power Laser Opacity
|
||||
setting.playerchat.name = Mostra Chat in-game
|
||||
@@ -567,33 +567,33 @@ category.general.name = Generale
|
||||
category.view.name = Visualizzazione
|
||||
category.multiplayer.name = Multigiocatore
|
||||
command.attack = Attacca
|
||||
command.rally = Rally
|
||||
command.retreat = Torna indietro
|
||||
command.rally = Guardia
|
||||
command.retreat = Ritirata
|
||||
keybind.gridMode.name = Seleziona blocco
|
||||
keybind.gridModeShift.name = Seleziona categoria
|
||||
keybind.press = Premi un tasto...
|
||||
keybind.press.axis = Premi un'asse o un tasto...
|
||||
keybind.screenshot.name = Screenshot della mappa
|
||||
keybind.move_x.name = Sposta_x
|
||||
keybind.move_y.name = Sposta_y
|
||||
keybind.fullscreen.name = Toggle Fullscreen
|
||||
keybind.select.name = seleziona
|
||||
keybind.move_x.name = Muovi orizzontale
|
||||
keybind.move_y.name = Muovi verticale
|
||||
keybind.fullscreen.name = Schermo Intero
|
||||
keybind.select.name = Seleziona
|
||||
keybind.diagonal_placement.name = Posizionamento diagonale
|
||||
keybind.pick.name = Scegli Blocco
|
||||
keybind.break_block.name = Rompi blocco
|
||||
keybind.deselect.name = Deseleziona
|
||||
keybind.shoot.name = spara
|
||||
keybind.zoom_hold.name = attiva zoom
|
||||
keybind.zoom.name = esegui zoom
|
||||
keybind.menu.name = menu
|
||||
keybind.pause.name = pausa
|
||||
keybind.shoot.name = Spara
|
||||
keybind.zoom_hold.name = Attiva zoom
|
||||
keybind.zoom.name = Esegui zoom
|
||||
keybind.menu.name = Apri Menu
|
||||
keybind.pause.name = Pausa
|
||||
keybind.minimap.name = Minimappa
|
||||
keybind.dash.name = Scatto
|
||||
keybind.chat.name = Chat
|
||||
keybind.player_list.name = lista_giocatori
|
||||
keybind.console.name = console
|
||||
keybind.player_list.name = Lista dei Giocatori
|
||||
keybind.console.name = Console
|
||||
keybind.rotate.name = Ruotare
|
||||
keybind.toggle_menus.name = Abilita menù
|
||||
keybind.toggle_menus.name = Mostra/Nascondi HUD
|
||||
keybind.chat_history_prev.name = Scorri chat vero l'alto
|
||||
keybind.chat_history_next.name = Scorri chatt verso il basso
|
||||
keybind.chat_scroll.name = Scorri chat
|
||||
@@ -606,7 +606,7 @@ mode.sandbox.name = Creativa
|
||||
mode.sandbox.description = Risorse infinite e nessun timer per le ondate.
|
||||
mode.pvp.name = PvP
|
||||
mode.pvp.description = Lotta contro altri giocatori.
|
||||
mode.attack.name = Attacco
|
||||
mode.attack.name = Schermaglia
|
||||
mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate
|
||||
mode.custom = Regole personalizzate
|
||||
rules.infiniteresources = Risorse infinite
|
||||
@@ -614,7 +614,7 @@ rules.wavetimer = Timer ondate
|
||||
rules.waves = Ondate
|
||||
rules.attack = Modalità attacco
|
||||
rules.enemyCheat = Infinite Risorse AI
|
||||
rules.unitdrops = Drops Unità
|
||||
rules.unitdrops = Generazione Unità
|
||||
rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità
|
||||
rules.unithealthmultiplier = Moltiplicatore vita unità
|
||||
rules.playerhealthmultiplier = Moltiplicatore vita giocatore
|
||||
@@ -626,7 +626,7 @@ rules.wavespacing = Tempo fra ondate:[LIGHT_GRAY] (secondi)
|
||||
rules.buildcostmultiplier = Moltiplicatore costo costruzione
|
||||
rules.buildspeedmultiplier = Moltiplicatore velocità costruzione
|
||||
rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce
|
||||
rules.dropzoneradius = Raggio di drop:[LIGHT_GRAY] (blocchi)
|
||||
rules.dropzoneradius = Raggio di generazione:[LIGHT_GRAY] (blocchi)
|
||||
rules.respawns = Massimo di rigenerazioni per ondata
|
||||
rules.limitedRespawns = Limite rigenerazioni
|
||||
rules.title.waves = Ondate
|
||||
@@ -764,8 +764,8 @@ block.dark-panel-5.name = Pannello scuro 5
|
||||
block.dark-panel-6.name = Pannello scuro 6
|
||||
block.dark-metal.name = Metallo Scuro
|
||||
block.ignarock.name = Roccia Ignea
|
||||
block.hotrock.name = Roccia bollente
|
||||
block.magmarock.name = Roccia magmatica
|
||||
block.hotrock.name = Roccia Bollente
|
||||
block.magmarock.name = Roccia Magmatica
|
||||
block.cliffs.name = Scogliere
|
||||
block.copper-wall.name = Muro di rame
|
||||
block.copper-wall-large.name = Muro grande di rame
|
||||
@@ -783,9 +783,9 @@ block.scatter.name = Cannone a dispersione
|
||||
block.hail.name = Bombardiere
|
||||
block.lancer.name = Lanciere
|
||||
block.conveyor.name = Nastro trasportatore
|
||||
block.titanium-conveyor.name = Nastro trasportatore avanzato
|
||||
block.armored-conveyor.name = Armored Conveyor
|
||||
block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors.
|
||||
block.titanium-conveyor.name = Nastro avanzato
|
||||
block.armored-conveyor.name = Nastro corazzato
|
||||
block.armored-conveyor.description = Trasporta gli oggetti alla stessa velocità del nastro avanzato, ma è più resistente. Accetta input dai lati solo da altri nastri.
|
||||
block.junction.name = Incrocio
|
||||
block.router.name = Distributore
|
||||
block.distributor.name = Distributore Grande
|
||||
@@ -820,8 +820,8 @@ block.delta-mech-pad.name = Piattaforma del Mech Delta
|
||||
block.javelin-ship-pad.name = Piattaforma della Nave Giavellotto
|
||||
block.trident-ship-pad.name = Piattaforma della Nave Tridente
|
||||
block.glaive-ship-pad.name = Piattaforma della Nave Glaive
|
||||
block.omega-mech-pad.name = Piattaforma della Nave Omega
|
||||
block.tau-mech-pad.name = Piattaforma della Nave Tau
|
||||
block.omega-mech-pad.name = Piattaforma del Mech Omega
|
||||
block.tau-mech-pad.name = Piattaforma del Mech Tau
|
||||
block.conduit.name = Condotta
|
||||
block.mechanical-pump.name = Pompa meccanica
|
||||
block.item-source.name = Fonte infinita (oggetti)
|
||||
@@ -875,10 +875,10 @@ block.surge-wall-large.name = Muro di Sovratensione Grande
|
||||
block.cyclone.name = Ciclone
|
||||
block.fuse.name = Frantume
|
||||
block.shock-mine.name = Mina Stordente
|
||||
block.overdrive-projector.name = Generatore di Campo di Overclock
|
||||
block.overdrive-projector.name = Generatore di Campo di Overdrive
|
||||
block.force-projector.name = Generatore di Campo di Forza
|
||||
block.arc.name = Arco Elettrico
|
||||
block.rtg-generator.name = Generatore Termico ai Radioisotopi
|
||||
block.rtg-generator.name = Generatore RTG
|
||||
block.spectre.name = Spettro
|
||||
block.meltdown.name = Fusione
|
||||
block.container.name = Contenitore
|
||||
@@ -907,25 +907,25 @@ unit.eradicator.name = Estirpatore
|
||||
unit.lich.name = Lich
|
||||
unit.reaper.name = Mietitore
|
||||
tutorial.next = [lightgray]<Clicca per continuare>
|
||||
tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia [accent] scavando rame[]. Clicca un minerale di rame vicino al tuo nucleo per farlo.\n\n[accent]{0}/{1} rame
|
||||
tutorial.drill = Minare manualmente.\n[accent]Le trivelle []possono scavare automaticamente\nPiazzane una su un minerale di rame.
|
||||
tutorial.drill.mobile = L'estrazione manuale è inefficiente. \n[accent] Le trivelle [] possono estrarre automaticamente. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento.
|
||||
tutorial.blockinfo = Ogni blocco ha statistiche diverse. Ogni trivella può estrarre solo determinati minerali. \n Per controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel menu di creazione. []\n\n[accent] Accedi ora alle statistiche della trivella meccanica. []
|
||||
tutorial.conveyor = [accent] I nastri trasportatori [] sono usati per trasportare oggetti al nocciolo. \n Crea una linea di nastri dalla trivella al nocciolo.
|
||||
tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo nucleo per farlo.\n\n[accent]{0}/{1} rame
|
||||
tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame.
|
||||
tutorial.drill.mobile = Ora crea una trivella. \n[accent] Le trivelle []scavano da sole e sono più efficienti. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento.
|
||||
tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. []
|
||||
tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al nucleo. \nCrea una linea di nastri dalla trivella al nucleo.
|
||||
tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati
|
||||
tutorial.turret = Strutture difensive devono essere costruite per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta a due vicino alla tua base.
|
||||
tutorial.drillturret = Torrette a due richiedono[accent] munizioni di rame[] per sparare.\n Duo turrets require[accent] copper ammo []to shoot.\nPosiziona una trivella vicino alla torretta per rifornirlo di rame estratto.
|
||||
tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi spazio per mettere in pausa.
|
||||
tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base.
|
||||
tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto.
|
||||
tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent]Premi spazio per mettere in pausa.
|
||||
tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa.
|
||||
tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa.
|
||||
tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa.
|
||||
tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent] Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n\n[accent] Distruggi tutti i blocchi di scarto a sinistra del tuo core usando la selezione dell'area .
|
||||
tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a romperlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\n Premi il pulsante con il segno di spunta per confermare la rottura. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo nucleo usando la selezione dell'area.
|
||||
tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi. \n Per fare ciò, [accent] tocca un blocco [] con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPosti multipli possono essere ritirati da [accent] toccando e tenendo premuto []. \n\n[accent] Prelevare un po' di rame dal nucleo. []
|
||||
tutorial.deposit = Deposita gli oggetti in blocchi trascinandoli dalla tua nave al blocco di destinazione. \n\n[accent] Riporta il rame nel nucleo. []
|
||||
tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina. \n\n Difendi il tuo nucleo per 2 ondate. Costruisci più torrette.
|
||||
tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il nucleo per due ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette e trivelle. Scava più rame
|
||||
tutorial.launch = Una volta raggiunta un'onda specifica, sei in grado di [accent] decollare con il nucleo [], lasciando indietro le tue difese ed [accent] ottenendo tutte le risorse nel tuo nucleo. [] \n Queste risorse possono quindi essere utilizzate per ricercare nuove tecnologie.\n\n [accent] Premi il pulsante di avvio.
|
||||
tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo core usando la selezione dell'area .
|
||||
tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo nucleo usando la selezione dell'area.
|
||||
tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal nucleo. []
|
||||
tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel nucleo. []
|
||||
tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse.
|
||||
tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette.
|
||||
tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial.
|
||||
item.copper.description = Un utile materiale, usato dappertutto
|
||||
item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto.
|
||||
item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento.
|
||||
|
||||
@@ -48,7 +48,7 @@ minimap = ミニマップ
|
||||
close = 閉じる
|
||||
website = ウェブサイト
|
||||
quit = 終了
|
||||
save.quit = Save & Quit
|
||||
save.quit = セーブして終了する
|
||||
maps = マップ
|
||||
maps.browse = マップを閲覧する
|
||||
continue = 続ける
|
||||
@@ -340,7 +340,7 @@ width = 幅:
|
||||
height = 高さ:
|
||||
menu = メニュー
|
||||
play = プレイ
|
||||
campaign = 遠征
|
||||
campaign = プレイ
|
||||
load = 読み込む
|
||||
save = 保存
|
||||
fps = FPS: {0}
|
||||
@@ -354,18 +354,18 @@ editor = エディター
|
||||
mapeditor = マップエディター
|
||||
donate = 寄付
|
||||
abandon = 撤退
|
||||
abandon.text = このゾーンとすべての資源が敵に奪われます。
|
||||
abandon.text = このゾーンのすべての資源が敵に奪われます。
|
||||
locked = ロック
|
||||
complete = [lightgray]達成済み:
|
||||
zone.requirement = ゾーン {1} でウェーブ {0} を達成
|
||||
resume = 再開ゾーン:\n[lightgray]{0}
|
||||
bestwave = [lightgray]最高ウェーブ: {0}
|
||||
launch = < 離脱 >
|
||||
launch.title = 離脱成功
|
||||
launch.next = [lightgray]次は ウェーブ {0} で離脱可能です。
|
||||
launch.unable2 = [scarlet]離脱できません。[]
|
||||
launch.confirm = すべての資源をコアに搬入し、離脱します。\nもうこの基地には戻ってくることはできません。
|
||||
launch.skip.confirm = スキップすると、次の離脱可能なウェーブまで離脱できません。
|
||||
launch = < 発射 >
|
||||
launch.title = 発射成功
|
||||
launch.next = [lightgray]次は ウェーブ {0} で発射可能です。
|
||||
launch.unable2 = [scarlet]発射できません。[]
|
||||
launch.confirm = すべての資源をコアに搬入し、発射します。\nもうこの基地には戻ってくることはできません。
|
||||
launch.skip.confirm = スキップすると、次の発射可能なウェーブまで発射できません。
|
||||
uncover = 開放
|
||||
configure = 積み荷の設定
|
||||
configure.locked = [lightgray]ウェーブ {0} を達成すると積み荷を設定できるようになります。
|
||||
@@ -375,14 +375,14 @@ zone.requirement.complete = ウェーブ {0} を達成:\n{1} の開放条件を
|
||||
zone.config.complete = ウェーブ {0} を達成:\n積み荷の設定が解除されました。
|
||||
zone.resources = 発見した資源:
|
||||
zone.objective = [lightgray]目標: [accent]{0}
|
||||
zone.objective.survival = 生き残る
|
||||
zone.objective.survival = 敵からコアを守り切る
|
||||
zone.objective.attack = 敵のコアを破壊する
|
||||
add = 追加...
|
||||
boss.health = ボスのHP
|
||||
connectfail = [crimson]サーバーへ接続できませんでした:\n\n[accent]{0}
|
||||
error.unreachable = サーバーに到達できません。\nアドレスは正しいですか?
|
||||
error.invalidaddress = 無効なアドレスです。
|
||||
error.timedout = タイムアウトしました!\nホストがポート開放されているかを確認してください。また、このアドレスは無効なアドレスではありません!
|
||||
error.timedout = タイムアウトしました!\nホストがポート開放されているかを確認してください。
|
||||
error.mismatch = パケットエラー:\n恐らくクライアント/サーバーのバージョンが一致していません。\nゲームとサーバーが最新版のMindustryかどうかを確認してください!
|
||||
error.alreadyconnected = すでに接続されています。
|
||||
error.mapnotfound = マップファイルが見つかりません!
|
||||
|
||||
@@ -16,11 +16,14 @@ screenshot.invalid = 맵이 너무 커서 스크린샷을 찍을 메모리가
|
||||
gameover = 게임 오버
|
||||
gameover.pvp = [accent]{0}[] 팀이 승리했습니다!
|
||||
highscore = [accent]최고점수 달성!
|
||||
|
||||
load.sound = 소리
|
||||
load.map = 맵
|
||||
load.image = 사진
|
||||
load.content = 컨텐츠
|
||||
load.system = 시스템
|
||||
load.mod = 모드
|
||||
|
||||
stat.wave = 버틴 단계 수 : [accent]{0}
|
||||
stat.enemiesDestroyed = 파괴한 적 수 : [accent]{0}
|
||||
stat.built = 건설한 건물 수 : [accent]{0}
|
||||
@@ -28,7 +31,9 @@ stat.destroyed = 파괴된 건물 수 : [accent]{0}
|
||||
stat.deconstructed = 파괴한 건물 수 : [accent]{0}
|
||||
stat.delivered = 획득한 자원 :
|
||||
stat.rank = 최종 점수: [accent]{0}
|
||||
|
||||
launcheditems = [accent]창고
|
||||
launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 획득합니다.
|
||||
map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까?
|
||||
level.highscore = 최고 점수 : [accent]{0}
|
||||
level.select = 맵 선택
|
||||
@@ -40,7 +45,6 @@ database = 코어 기록보관소
|
||||
savegame = 게임 저장
|
||||
loadgame = 게임 불러오기
|
||||
joingame = 서버 접속
|
||||
addplayers = 플레이어 추가/제거
|
||||
customgame = 사용자 정의 게임
|
||||
newgame = 새 게임
|
||||
none = <없음>
|
||||
@@ -60,16 +64,35 @@ uploadingcontent = 컨텐츠 업로드
|
||||
uploadingpreviewfile = 미리보기 파일 업로드
|
||||
committingchanges = 바뀐 점 적용
|
||||
done = 완료
|
||||
|
||||
mods.alphainfo = 현재의 모드는 첫 번째 버전이며, 그리고[scarlet] 버그가 매우 많음을 명심하십시오[].\n만약 버그를 발견할경우 Mindustry 깃허브 또는 디스코드로 제보해주세요.
|
||||
mods.alpha = [scarlet](Alpha)
|
||||
mods = 모드
|
||||
mods.none = [LIGHT_GRAY]모드가 발견되지 않았습니다!
|
||||
mods.guide = 모드 가이드
|
||||
mods.report = 버그 신고
|
||||
mod.enabled = [lightgray]활성화
|
||||
mod.disabled = [scarlet]비활성화
|
||||
mod.disable = 비활성화
|
||||
mod.enable = 활성화
|
||||
mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종료합니다.
|
||||
mod.reloadrequired = [scarlet]새로고침 요구됨
|
||||
mod.import = 모드 추가
|
||||
mod.import.github = 깃허브 모드 추가
|
||||
mod.remove.confirm = 모드가 삭제되었습니다.
|
||||
mod.author = [LIGHT_GRAY]제작자:[] {0}
|
||||
mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 것을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0}
|
||||
|
||||
about.button = 정보
|
||||
name = 이름 :
|
||||
noname = 먼저 [accent] 유저 이름[] 을 설정하세요.
|
||||
filename = 파일 이름 :
|
||||
unlocked = 새 건물 잠금 해제됨
|
||||
unlocked = 대상 정보 기록됨
|
||||
completed = [accent]연구됨
|
||||
techtree = 연구 기록
|
||||
research.list = [LIGHT_GRAY]연구:
|
||||
research.list = [LIGHT_GRAY]연구 :
|
||||
research = 연구
|
||||
researched = [LIGHT_GRAY]{0}연구됨.
|
||||
researched = [LIGHT_GRAY]{0}연구 완료.
|
||||
players = 현재 {0}명 접속중
|
||||
players.single = 현재 {0}명만 있음.
|
||||
server.closing = [accent]서버 닫는중...
|
||||
@@ -129,7 +152,7 @@ confirmunadmin = 이 플레이어를 일반 유저로 만들겠습니까?
|
||||
joingame.title = 게임 참가
|
||||
joingame.ip = 주소:
|
||||
disconnect = 서버와 연결이 해제되었습니다.
|
||||
disconnect.error = Connection error.
|
||||
disconnect.error = 연결 .
|
||||
disconnect.closed = 연결이 끊어졌습니다..
|
||||
disconnect.timeout = 연결 시간 한계 도달..
|
||||
disconnect.data = 월드 데이터 로딩 실패..
|
||||
@@ -140,7 +163,6 @@ server.port = 포트:
|
||||
server.addressinuse = 주소가 이미 사용중입니다!
|
||||
server.invalidport = 포트가 올바르지 않습니다!
|
||||
server.error = [accent]{0}[crimson]서버를 여는데 오류가 발생했습니다.
|
||||
save.old = 이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
|
||||
save.new = 새로 저장
|
||||
save.overwrite = 이 저장 슬롯을 덮어씌우겠습니까?
|
||||
overwrite = 덮어쓰기
|
||||
@@ -160,21 +182,22 @@ save.rename.text = 새 이름:
|
||||
selectslot = 저장슬롯을 선택하십시오.
|
||||
slot = [accent]{0}번째 슬롯
|
||||
editmessage = 글 수정하기
|
||||
save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다! 만약 게임을 업데이트 했다면 이것은 아마 저장 형식 변경일 것이고, 이것은 버그가 [scarlet]아닙니다[].
|
||||
save.corrupted = [accent]세이브 파일이 손상되었거나 잘못된 파일입니다!
|
||||
empty = <비어있음>
|
||||
on = 켜기
|
||||
off = 끄기
|
||||
save.autosave = 자동저장: {0}
|
||||
save.map = 맵: {0}
|
||||
save.wave = 웨이브 {0}
|
||||
on = 활성화
|
||||
off = 비활성화
|
||||
save.autosave = 자동저장 : {0}
|
||||
save.map = 맵 : {0}
|
||||
save.wave = {0} 단계
|
||||
save.mode = 게임모드 : {0}
|
||||
save.date = 마지막 저장날짜: {0}
|
||||
save.playtime = 플레이시간: {0}
|
||||
save.date = 마지막 저장일 : {0}
|
||||
save.playtime = 플레이타임 : {0}
|
||||
warning = 경고.
|
||||
confirm = 확인
|
||||
delete = 삭제
|
||||
view.workshop = 워크샵에서 보기
|
||||
ok = OK
|
||||
workshop.listing = 워크샵 목록 편집하기
|
||||
ok = 확인
|
||||
open = 열기
|
||||
customize = 맞춤설정
|
||||
cancel = 취소
|
||||
@@ -191,7 +214,11 @@ classic.export.text = Mindustry 클래식 (v3.5 build 40)의 세이브파일 또
|
||||
quit.confirm = 정말로 종료하시겠습니까?
|
||||
quit.confirm.tutorial = 튜토리얼을 종료하시겠습니까?\n튜토리얼은 [accent]설정 -> 게임 -> 튜토리얼[]에서 다시 해보실 수 있습니다.
|
||||
loading = [accent]불러오는중...
|
||||
reloading = [accent]모드 새로고침하는중...
|
||||
saving = [accent]저장중...
|
||||
cancelbuilding = [accent][[{0}][] 를 눌러 설계도 초기화
|
||||
pausebuilding = [accent][[{0}][] 를 눌러 설계모드 진입
|
||||
resumebuilding = [scarlet][[{0}][] 를 눌러 건설 시작
|
||||
wave = [accent]웨이브 {0}
|
||||
wave.waiting = [green]{0}초[]후 웨이브 시작
|
||||
wave.waveInProgress = [LIGHT_GRAY]웨이브 진행중
|
||||
@@ -211,7 +238,12 @@ map.nospawn.pvp = 이 맵에는 적팀 코어가 없습니다! 에디터에서 [
|
||||
map.nospawn.attack = 이 맵에는 플레이어가 공격할 수 있는 적의 코어가 없습니다! 에디터에서 [ROYAL] 빨강색 팀[] 코어를 맵에 추가하세요.
|
||||
map.invalid = 파일이 잘못되었거나 손상되어 맵을 열 수 없습니다.
|
||||
map.publish.error = 맵 업로드 오류 : {0}
|
||||
map.update = 맵 업데이트
|
||||
map.load.error = 워크샵 작업 오류 : {0}
|
||||
map.missing = 해당 맵은 삭제되거나 옮겨졌습니다.\n[lightgray]워크샵 목록은 자동으로 동기화되지 않습니다.
|
||||
map.publish.confirm = 맵을 업로드 하시겠습니까?\n\n[lightgray]먼저 워크샵 EULA에 동의하시지 않으면 맵이 표시되지 않습니다!
|
||||
map.menu = 원하는 맵을 선택하세요.
|
||||
map.changelog = 바뀐 점 (선택성):
|
||||
eula = 스팀 EULA
|
||||
map.publish = 맵 업로드 완료!
|
||||
map.publishing = [accent]맵 업로드 중...
|
||||
@@ -291,6 +323,7 @@ editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게
|
||||
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
|
||||
editor.exists = 같은 이름의 맵이 이미 존재합니다.
|
||||
editor.selectmap = 불러올 맵 선택:
|
||||
|
||||
toolmode.replace = 재배치
|
||||
toolmode.replace.description = 블록을 배치합니다.
|
||||
toolmode.replaceall = 모두 재배치
|
||||
@@ -305,6 +338,7 @@ toolmode.fillteams = 팀 채우기
|
||||
toolmode.fillteams.description = 블록 대신 팀 건물로 채웁니다.
|
||||
toolmode.drawteams = 팀 그리기
|
||||
toolmode.drawteams.description = 블록 대신 팀 건물을 배치합니다.
|
||||
|
||||
filters.empty = [LIGHT_GRAY]필터가 없습니다!! 아래 버튼을 눌러 추가하세요.
|
||||
filter.distort = 왜곡
|
||||
filter.noise = 맵 전체에 타일 혹은 블럭 뿌리기
|
||||
@@ -336,16 +370,16 @@ filter.option.floor2 = 2번째 바닥
|
||||
filter.option.threshold2 = 2번째 한계점
|
||||
filter.option.radius = 반경
|
||||
filter.option.percentile = 백분위수
|
||||
width = 넓이:
|
||||
height = 높이:
|
||||
|
||||
width = 넓이 :
|
||||
height = 높이 :
|
||||
menu = 메뉴
|
||||
play = 플레이
|
||||
campaign = 캠페인
|
||||
load = 불러오기
|
||||
save = 저장
|
||||
fps = FPS: {0}
|
||||
tps = TPS: {0}
|
||||
ping = Ping: {0}ms
|
||||
fps = FPS : {0}
|
||||
ping = Ping : 초당 {0}
|
||||
language.restart = 언어를 변경하려면 게임을 다시시작 해 주세요.
|
||||
settings = 설정
|
||||
tutorial = 게임 방법
|
||||
@@ -353,32 +387,38 @@ tutorial.retake = 튜토리얼
|
||||
editor = 편집기
|
||||
mapeditor = 맵 편집기
|
||||
donate = 기부
|
||||
|
||||
abandon = 포기
|
||||
abandon.text = 이 구역의 모든 자원이 적에게 빼앗길 것입니다.
|
||||
locked = 잠김
|
||||
complete = [LIGHT_GRAY]완료:
|
||||
complete = [LIGHT_GRAY]완료 :
|
||||
zone.requirement = 지역 {1} 에서 단계 {0} 달성
|
||||
resume = 지역 계속 플레이:\n[LIGHT_GRAY]{0}
|
||||
bestwave = [LIGHT_GRAY]최고 점수: {0}
|
||||
requirement.core = Destroy Enemy Core in {0}
|
||||
requirement.unlock = Unlock {0}
|
||||
resume = 현재 진행 중인 지역 :\n[LIGHT_GRAY]{0}
|
||||
bestwave = [LIGHT_GRAY]최고 점수 : {0}
|
||||
launch = < 출격 >
|
||||
launch.title = 출격 성공
|
||||
launch.next = [LIGHT_GRAY]다음 출격기회는 {0} 단계에서 나타납니다.
|
||||
launch.unable2 = [scarlet]출격할 수 없습니다.[]
|
||||
launch.confirm = 출격하게 되면 모든 자원이 코어로 들어갑니다.\n또한 성공하기 전까지 기지로 돌아갈 수 없습니다.
|
||||
launch.confirm = 출격하게 되면 코어에 저장된 모든 자원이 창고로 들어갑니다.\n또한 출격한 지역에는 아무것도 남지 않습니다.
|
||||
launch.skip.confirm = 만약 지금 출격하시지 않고 스킵하신다면, 다음 출격 단계까지 기다려야 합니다.
|
||||
uncover = 구역 개방
|
||||
uncover = 지역 개방
|
||||
configure = 코어 시작자원 설정
|
||||
configure.locked = {0} 단계에서 시작자원 설정 잠금이 해제됩니다.
|
||||
bannedblocks = 금지된 블럭들
|
||||
addall = 모두 추가
|
||||
configure.locked = 단계를 지역 {0}에서 달성할 시 시작자원 설정이 해금됩니다.
|
||||
configure.invalid = 해당 0 과 {0} 사이여야 합니다.
|
||||
zone.unlocked = [LIGHT_GRAY] 잠금 해제되었습니다!
|
||||
zone.requirement.complete = 단계 {0} 달성:\n{1} 지역 요구사항이 충족되었습니다!
|
||||
zone.config.complete = 단계 {0} 달성:\n시작자원 설정 기능이 해금되었습니다!
|
||||
zone.resources = 자원이 감지되었습니다 :
|
||||
zone.objective = [lightgray]게임 모드: [accent]{0}
|
||||
zone.resources = 감지된 자원 목록 :
|
||||
zone.objective = [lightgray]게임 모드 : [accent]{0}
|
||||
zone.objective.survival = 생존
|
||||
zone.objective.attack = 적 코어 파괴
|
||||
add = 추가...
|
||||
boss.health = 보스 체력
|
||||
|
||||
connectfail = [crimson]{0}[accent] 서버에 연결하지 못했습니다.[]
|
||||
error.unreachable = 서버에 연결하지 못했습니다.\n서버 주소가 정확히 입력되었나요?
|
||||
error.invalidaddress = 잘못된 주소입니다.
|
||||
@@ -389,6 +429,7 @@ error.mapnotfound = 맵 파일을 찾을 수 없습니다!
|
||||
error.io = 네트워크 I/O 오류.
|
||||
error.any = 알 수 없는 네트워크 오류.
|
||||
error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다.
|
||||
|
||||
zone.groundZero.name = 전초기지
|
||||
zone.desertWastes.name = 쓰레기 사막
|
||||
zone.craters.name = 크레이터
|
||||
@@ -403,6 +444,7 @@ zone.saltFlats.name = 소금 사막
|
||||
zone.impact0078.name = Impact 0078
|
||||
zone.crags.name = 협곡
|
||||
zone.fungalPass.name = 포자 지대
|
||||
|
||||
zone.groundZero.description = 이 장소는 다시 시작하기에 최적의 환경을 지닌 장소입니다. 적은 수준의 위협이 있으며 자원의 양은 적습니다.\n가능한 한 많은 양의 구리와 납을 수집하십시오.\n출격합시다!
|
||||
zone.frozenForest.description = 이 지역도 산과 가까운 지역입니다 포자들이 흩뿌려져 있으며 극한의 추위도 포자룰 막을 수 있을거 같지 않습니다.\n전력을 통해서 모험을 시작하십시오 화력 발전소를 짓고 수리드론을 사용하는 법을 배우십시오.
|
||||
zone.desertWastes.description = 이 황무지는 끝을 알수 없을 정도로 광활합니다 그리고 십자가 형태의 버려진 구조물이 존재합니다.\n석탄이 존재하며 이를 화력발전에 쓰거나 흑연정제에 쓰십시오.\n\n[lightgray]이 지역에서의 착륙장소는 확실하지 않습니다.
|
||||
@@ -417,6 +459,7 @@ zone.nuclearComplex.description = 과거 토륨의 생산, 연구와 처리를
|
||||
zone.fungalPass.description = 고산지대과 포자지대 사이의 지역입니다. 소규모의 적 정찰기지가 있으니 디거와 크롤러를 이용해 적의 코어를 파괴하십시오.
|
||||
zone.impact0078.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||
zone.crags.description = [ROYAL]죄송합니다. 아직 설명이 준비되지 않았습니다.
|
||||
|
||||
settings.language = 언어
|
||||
settings.data = 게임 데이터
|
||||
settings.reset = 설정 초기화
|
||||
@@ -471,20 +514,22 @@ blocks.inaccuracy = 오차각
|
||||
blocks.shots = 발포 횟수
|
||||
blocks.reload = 재장전
|
||||
blocks.ammo = 탄약
|
||||
|
||||
bar.drilltierreq = 더 좋은 드릴이 요구됨
|
||||
bar.drillspeed = 채광 속도 : {0}/s
|
||||
bar.efficiency = 효율성 : {0}%
|
||||
bar.powerbalance = 전력 : {0}/s
|
||||
bar.powerstored = 에너지 저장량 : {0}/{1}
|
||||
bar.powerstored = 총 전력 저장량 : {0}/{1}
|
||||
bar.poweramount = 전력 저장량 : {0}
|
||||
bar.poweroutput = 전력 생산량 : {0}/s
|
||||
bar.items = 최대 120개중 {0}개 중
|
||||
bar.items = 자원량 : {0}
|
||||
bar.capacity = 저장공간 : {0}
|
||||
bar.liquid = 액체
|
||||
bar.heat = 발열
|
||||
bar.power = 전력
|
||||
bar.progress = 생산 진행도
|
||||
bar.spawned = 최대 {1}기 중 {0}기 생산됨
|
||||
|
||||
bullet.damage = [stat]{0}[lightgray] 데미지
|
||||
bullet.splashdamage = [stat]{0}[lightgray] 범위 데미지 ~[stat] {1}[lightgray] 타일
|
||||
bullet.incendiary = [stat]방화
|
||||
@@ -496,6 +541,7 @@ bullet.freezing = [stat]동결
|
||||
bullet.tarred = [stat]타르
|
||||
bullet.multiplier = [stat]{0}[lightgray]x 탄약 소모율
|
||||
bullet.reload = [stat]{0}[lightgray]x 사격 속도
|
||||
|
||||
unit.blocks = 블록
|
||||
unit.powersecond = 전력/초
|
||||
unit.liquidsecond = 액체/초
|
||||
@@ -545,6 +591,7 @@ setting.fullscreen.name = 전체 화면
|
||||
setting.borderlesswindow.name = 테두리 없는 창모드[LIGHT_GRAY] (재시작이 필요할 수 있습니다)
|
||||
setting.fps.name = FPS 표시
|
||||
setting.vsync.name = VSync 활성화
|
||||
setting.lasers.name = 전력 노드 레이저 표시
|
||||
setting.pixelate.name = 픽셀화[LIGHT_GRAY] (애니메이션 효과가 꺼집니다)
|
||||
setting.minimap.name = 미니맵 보기
|
||||
setting.musicvol.name = 음악 크기
|
||||
@@ -556,9 +603,9 @@ setting.crashreport.name = 오류 보고서 보내기
|
||||
setting.savecreate.name = 자동 저장 활성화
|
||||
setting.publichost.name = 공용 서버 보이기
|
||||
setting.chatopacity.name = 채팅 투명도
|
||||
setting.lasersopacity.name = Power Laser Opacity
|
||||
setting.playerchat.name = 인게임 채팅 표시
|
||||
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet]Reverting and exiting in[accent] {0}[] settings...
|
||||
setting.playerchat.name = 채팅 말풍선 표시
|
||||
public.confirm = 게임을 공개하시겠습니까?\n[lightgray]설정 - 게임 - 게임 서버 공개에서 다시 설정하실 수 있습니다.
|
||||
uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 스케일을 확인하세요.\n[scarlet][accent] {0}[]초 후에 예전 설정으로 되돌리고 게임을 종료합니다...
|
||||
uiscale.cancel = 취소 & 나가기
|
||||
setting.bloom.name = 발광 효과
|
||||
keybind.title = 조작키 설정
|
||||
@@ -593,22 +640,25 @@ keybind.chat.name = 채팅
|
||||
keybind.player_list.name = 플레이어 목록
|
||||
keybind.console.name = 콘솔
|
||||
keybind.rotate.name = 회전
|
||||
keybind.rotateplaced.name = 기존 회전 (고정)
|
||||
keybind.toggle_menus.name = 메뉴 보이기/숨기기
|
||||
keybind.chat_history_prev.name = 이전 채팅기록
|
||||
keybind.chat_history_next.name = 다음 채팅기록
|
||||
keybind.chat_scroll.name = 채팅 스크롤
|
||||
keybind.drop_unit.name = 유닛 드롭
|
||||
keybind.drop_unit.name = 유닛 처치시 자원획득
|
||||
keybind.zoom_minimap.name = 미니맵 확대
|
||||
mode.help.title = 모드 도움말
|
||||
mode.help.title = 게임모드 도움말
|
||||
mode.survival.name = 생존
|
||||
mode.survival.description = 이것은 일반 모드입니다. 제한된 자원을 가지고 자동으로 다음 단계가 시작됩니다.
|
||||
mode.sandbox.name = 샌드박스
|
||||
mode.sandbox.description = 무한한 자원을 가지고 자유롭게 다음 단계를 시작할 수 있습니다.
|
||||
mode.editor.name = 편집기
|
||||
mode.pvp.name = PvP
|
||||
mode.pvp.description = 실제 플레이어와 PvP를 합니다. 맵에 적어도 2개의 다른 색상 코어가 있어야 합니다.
|
||||
mode.attack.name = 공격
|
||||
mode.attack.description = 적 기지를 파괴하세요. 맵에 빨간팀 코어가 있어야 플레이 가능합니다.
|
||||
mode.custom = 사용자 정의 규칙
|
||||
|
||||
rules.infiniteresources = 무한 자원
|
||||
rules.wavetimer = 웨이브 타이머
|
||||
rules.waves = 웨이브
|
||||
@@ -635,6 +685,7 @@ rules.title.resourcesbuilding = 자원 & 건축
|
||||
rules.title.player = 플레이어들
|
||||
rules.title.enemy = 적
|
||||
rules.title.unit = 유닛
|
||||
|
||||
content.item.name = 아이템
|
||||
content.liquid.name = 액체
|
||||
content.unit.name = 유닛
|
||||
@@ -696,6 +747,7 @@ mech.buildspeed = [LIGHT_GRAY]건설 속도: {0}%
|
||||
liquid.heatcapacity = [LIGHT_GRAY]발열 용량: {0}
|
||||
liquid.viscosity = [LIGHT_GRAY]점도: {0}
|
||||
liquid.temperature = [LIGHT_GRAY]온도: {0}
|
||||
|
||||
block.sand-boulder.name = 사암
|
||||
block.grass.name = 잔디
|
||||
block.salt.name = 소금
|
||||
@@ -926,6 +978,7 @@ tutorial.deposit = 자원을 다시 블록에 넣을수도 있습니다.\n\n[acc
|
||||
tutorial.waves = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 향해 클릭하여 공격할 수 있습니다. 또한, 구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계 동안 코어를 보호하세요.[]
|
||||
tutorial.waves.mobile = [LIGHT_GRAY]적[]이 접근합니다.\n당신의 기체는 적을 자동조준하지만, 원하는 적을 클릭하여 공격하고 싶은 대상을 바꿀 수 있습니다.\n구리를 더 캐내고 포탑을 더 지어서 방어를 강화하세요.\n\n[accent]2단계동안 코어를 방어하세요.[]
|
||||
tutorial.launch = 특정 단계에 도달하면 [accent]출격[]이 가능합니다.\n[accent]출격[]을 하게되면 해당 지역의 코어에 들어있는 자원들을 캠페인의 자원 창고로 보내지만, 해당 지역의 [accent]모든 것들[]은 날라가게 되니 주의하세요.
|
||||
|
||||
item.copper.description = 모든 종류의 블록에서 광범위하게 사용되는 자원입니다.
|
||||
item.lead.description = 쉽게 구할 수 있으며, 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다.
|
||||
item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다.\n\n[royal]액체를 활용하기 위한 필수품입니다.
|
||||
@@ -1033,7 +1086,7 @@ block.combustion-generator.description = 인화성 물질을 태워 소량의
|
||||
block.thermal-generator.description = 건설가능한 열이 있는 타일 위에 건설하면 전력을 생산합니다.\n\n[ROYAL]용암 웅덩이 혹은 열기지대에서 무한정 열을 발산합니다.
|
||||
block.turbine-generator.description = 화력 발전기보다 효율적이지만, 액체가 추가적으로 필요합니다.\n\n[ROYAL]일반 타일에서 물추출기 1개로 2개가 가동가능합니다.
|
||||
block.differential-generator.description = 냉각수와 파이라타이트의 온도 차를 이용해 안정적으로 원자로에 버금가는 양의 전기를 생산합니다.
|
||||
block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 현상 구조체를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다.
|
||||
block.rtg-generator.description = 방사성동위원소 열전기 발전기\n토륨또는 메타를 사용하며, 냉각이 필요없는 발전을 하지만 토륨 원자로에 비해 발전량이 매우 적습니다.
|
||||
block.solar-panel.description = 태양광으로 극소량의 전기을 생산합니다.
|
||||
block.solar-panel-large.description = 일반 태양 전지판보다 훨씬 발전량이 많지만, 건축비도 훨씬 비쌉니다.
|
||||
block.thorium-reactor.description = 토륨을 이용해 막대한 양의 전기를 생산합니다. 지속적인 냉각이 필요하며 냉각제의 양이 부족하면 크게 폭발합니다.\n\n[royal]폭발로 인한 피해를 버틸 수 있는 건물은 없습니다.
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]
|
||||
credits.text = Gemaakt door [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] -
|
||||
credits = Credits
|
||||
contributors = Vertalers en Medewerkers
|
||||
discord = Word lid van de Mindustry Discord!
|
||||
link.discord.description = De officiële Mindustry discord chatroom
|
||||
link.github.description = Game broncode
|
||||
link.changelog.description = List of update changes
|
||||
link.changelog.description = Lijst van Updates
|
||||
link.dev-builds.description = Onstabiele ontwikkeling builds
|
||||
link.trello.description = Officiële trello-bord voor geplande functies
|
||||
link.itch.io.description = itch.io pagina met pc-downloads en webversie
|
||||
@@ -12,15 +12,15 @@ link.google-play.description = Google Play store vermelding
|
||||
link.wiki.description = Officiële Mindustry wiki
|
||||
linkfail = Kan link niet openen!\nDe URL is gekopieerd naar je klembord
|
||||
screenshot = Schermafbeeling opgeslagen in {0}
|
||||
screenshot.invalid = Map too large, potentially not enough memory for screenshot.
|
||||
gameover = Game Over
|
||||
screenshot.invalid = Map is te groot, Mogelijk niet genoeg ruimte op apparaat.
|
||||
gameover = Spel afgelopen
|
||||
gameover.pvp = het[accent] {0}[] team heeft gewonnen!
|
||||
highscore = [accent]Nieuw topscore!
|
||||
load.sound = Sounds
|
||||
load.map = Maps
|
||||
load.image = Images
|
||||
load.content = Content
|
||||
load.system = System
|
||||
load.sound = Geluid
|
||||
load.map = Mappen
|
||||
load.image = Afbeeldingen
|
||||
load.content = inhoud
|
||||
load.system = Systeem
|
||||
stat.wave = Waves Verslagen:[accent] {0}
|
||||
stat.enemiesDestroyed = Vijanden Vernietigd:[accent] {0}
|
||||
stat.built = Gebouwen Gebouwd:[accent] {0}
|
||||
@@ -28,69 +28,58 @@ stat.destroyed = Gebouwen Vernietigd:[accent] {0}
|
||||
stat.deconstructed = Gebouwen Gesloopt:[accent] {0}
|
||||
stat.delivered = Middelen Gelanceerd:
|
||||
stat.rank = Eindrang: [accent]{0}
|
||||
launcheditems = [accent]Launched Items
|
||||
launcheditems = [accent]Gelanceerde items
|
||||
map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"?
|
||||
level.highscore = Topscore: [accent]{0}
|
||||
level.select = Selecteer Level
|
||||
level.mode = Spelmodus:
|
||||
showagain = Don't show again next session
|
||||
coreattack = < Core is under attack! >
|
||||
showagain = Niet Laten zien in de volgende sessie
|
||||
coreattack = < Core wordt aangevallen! >
|
||||
nearpoint = [[ [scarlet]LEAVE DROP POINT IMMEDIATELY[] ]\nannihilation imminent
|
||||
database = Core Database
|
||||
savegame = Save Game
|
||||
loadgame = Load Game
|
||||
joingame = Join Game
|
||||
savegame = Opslaan
|
||||
loadgame = Laden
|
||||
joingame = Treed toe
|
||||
addplayers = Add/Remove Players
|
||||
customgame = Custom Game
|
||||
newgame = New Game
|
||||
customgame = Aangepast spel
|
||||
newgame = Nieuw spel
|
||||
none = <none>
|
||||
minimap = Minimap
|
||||
close = Close
|
||||
close = Aflsuiten
|
||||
website = Website
|
||||
quit = Quit
|
||||
save.quit = Save & Quit
|
||||
maps = Maps
|
||||
maps.browse = Browse Maps
|
||||
continue = Continue
|
||||
maps.none = [LIGHT_GRAY]No maps found!
|
||||
invalid = Invalid
|
||||
preparingconfig = Preparing Config
|
||||
preparingcontent = Preparing Content
|
||||
uploadingcontent = Uploading Content
|
||||
uploadingpreviewfile = Uploading Preview File
|
||||
committingchanges = Comitting Changes
|
||||
done = Done
|
||||
about.button = About
|
||||
name = Name:
|
||||
noname = Pick a[accent] player name[] first.
|
||||
filename = File Name:
|
||||
quit = Stoppen
|
||||
maps = Mappen
|
||||
continue = Ga door
|
||||
maps.none = [LIGHT_GRAY]Geen map gevonden!
|
||||
about.button = Over
|
||||
name = Naam:
|
||||
noname = Maak eerst een[accent] Speler naam[].
|
||||
filename = Bestandsnaam:
|
||||
unlocked = New content unlocked!
|
||||
completed = [accent]Completed
|
||||
techtree = Tech Tree
|
||||
research.list = [LIGHT_GRAY]Research:
|
||||
research = Research
|
||||
researched = [LIGHT_GRAY]{0} researched.
|
||||
players = {0} players online
|
||||
players.single = {0} player online
|
||||
server.closing = [accent]Closing server...
|
||||
server.kicked.kick = You have been kicked from the server!
|
||||
server.kicked.whitelist = You are not whitelisted here.
|
||||
server.kicked.serverClose = Server closed.
|
||||
server.kicked.vote = You have been vote-kicked. Goodbye.
|
||||
server.kicked.clientOutdated = Outdated client! Update your game!
|
||||
server.kicked.serverOutdated = Outdated server! Ask the host to update!
|
||||
server.kicked.banned = You are banned on this server.
|
||||
server.kicked.typeMismatch = This server is not compatible with your build type.
|
||||
server.kicked.playerLimit = This server is full. Wait for an empty slot.
|
||||
server.kicked.recentKick = You have been kicked recently.\nWait before connecting again.
|
||||
server.kicked.nameInUse = There is someone with that name\nalready on this server.
|
||||
server.kicked.nameEmpty = Your chosen name is invalid.
|
||||
server.kicked.idInUse = You are already on this server! Connecting with two accounts is not permitted.
|
||||
server.kicked.customClient = This server does not support custom builds. Download an official version.
|
||||
server.kicked.gameover = Game over!
|
||||
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
|
||||
host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
|
||||
join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[LIGHT_GRAY]Note: There is no automatic global server list; if you want to connect to someone by IP, you would need to ask the host for their IP.
|
||||
completed = [accent]Voltooid
|
||||
techtree = Tech boom
|
||||
research.list = [LIGHT_GRAY]Onderzoek:
|
||||
research = Onderzoek
|
||||
researched = [LIGHT_GRAY]{0} Onderzocht.
|
||||
players = {0} Spelers online
|
||||
players.single = {0} Speler online
|
||||
server.closing = [accent]Server aan het sluiten...
|
||||
server.kicked.kick = Je bent verwijderd van deze sessie.
|
||||
server.kicked.serverClose = Server afgesloten...
|
||||
server.kicked.vote = Je bent ge vote-kicked. Tot ziens.
|
||||
server.kicked.clientOutdated = Verouderde versie! Update jouw spel!
|
||||
server.kicked.serverOutdated = Verouderde server! Vraag de host om te upgraden!
|
||||
server.kicked.banned = Je bent verbannen van deze server.
|
||||
server.kicked.typeMismatch = Deze server is niet compitabel met jouw bouwtype.
|
||||
server.kicked.recentKick = Je bent reeds verwijderd.\nWacht voordat je opnieuw verbindt.
|
||||
server.kicked.nameInUse = Er is al iemand met die naam\nop deze server.
|
||||
server.kicked.nameEmpty = Je gekozen naam is niet geldig.
|
||||
server.kicked.idInUse = Je bent al verbonden met deze server! Verbinden met 2 accounts is verboden.
|
||||
server.kicked.customClient = Deze server ondersteunt geen aangepaste spellen . Download de officiele versie.
|
||||
server.kicked.gameover = Spel afgelopen
|
||||
server.versions = Jouw versie:[accent] {0}[]\nServer versie:[accent] {1}[]
|
||||
host.info = De [accent]host[] knop hosts `een server op port [scarlet]6567[]. \nIedereen op hetzelfde [LIGHT_GRAY]wifi or locaal netwerk[] zou jouw server in hun serverlijst moeten zien.\n\nAls je wilt dan vrienden vanaf overal kunnen meedoen via IP, [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Note: IAls iemand moeilijkheden heeft met het meedoen aan jouw spel, kijk of je Mindustry in je firewall instellingen toegang hebt gegeven to jouw locaal netwerk.
|
||||
join.info = Hier kan je een [accent]server IP[] invoeren om te verbinden, of om[accent]locale netwerken[] te vinden.\nBeide LAN en WAN multiplayer is ondersteund.\n\n[LIGHT_GRAY]Note: Er is geen automatische globale serverlijst; Als je met iemands IP wil verbinden, Zou je moeten vragen om hun IP.
|
||||
hostserver = Host Game
|
||||
invitefriends = Invite Friends
|
||||
hostserver.mobile = Host\nGame
|
||||
|
||||
@@ -45,6 +45,7 @@ customgame = 自定义游戏
|
||||
newgame = 新游戏
|
||||
none = <无>
|
||||
minimap = 小地图
|
||||
position = 位置
|
||||
close = 关闭
|
||||
website = 官网
|
||||
quit = 退出
|
||||
@@ -547,6 +548,7 @@ setting.fps.name = 显示 FPS
|
||||
setting.vsync.name = 垂直同步
|
||||
setting.pixelate.name = 像素画面 [LIGHT_GRAY](禁用动画)
|
||||
setting.minimap.name = 显示小地图
|
||||
setting.position.name = 显示玩家坐标
|
||||
setting.musicvol.name = 音乐音量
|
||||
setting.ambientvol.name = 环境体积
|
||||
setting.mutemusic.name = 静音
|
||||
|
||||
@@ -78,4 +78,5 @@ itskatt
|
||||
Agent-Laevain
|
||||
AzariasB
|
||||
amrsoll
|
||||
ねらひかだ
|
||||
Draco
|
||||
|
||||
|
Before Width: | Height: | Size: 725 B After Width: | Height: | Size: 727 B |
|
Before Width: | Height: | Size: 712 KiB After Width: | Height: | Size: 712 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 893 KiB |
|
Before Width: | Height: | Size: 892 KiB After Width: | Height: | Size: 134 KiB |
@@ -164,6 +164,10 @@ public class BlockIndexer{
|
||||
}
|
||||
|
||||
public TileEntity findTile(Team team, float x, float y, float range, Predicate<Tile> pred){
|
||||
return findTile(team, x, y, range, pred, false);
|
||||
}
|
||||
|
||||
public TileEntity findTile(Team team, float x, float y, float range, Predicate<Tile> pred, boolean usePriority){
|
||||
TileEntity closest = null;
|
||||
float dst = 0;
|
||||
|
||||
@@ -184,7 +188,7 @@ public class BlockIndexer{
|
||||
TileEntity e = other.entity;
|
||||
|
||||
float ndst = Mathf.dst(x, y, e.x, e.y);
|
||||
if(ndst < range && (closest == null || ndst < dst)){
|
||||
if(ndst < range && (closest == null || ndst < dst || (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){
|
||||
dst = ndst;
|
||||
closest = e;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import io.anuke.arc.util.*;
|
||||
import io.anuke.mindustry.*;
|
||||
import io.anuke.mindustry.entities.*;
|
||||
import io.anuke.mindustry.entities.bullet.*;
|
||||
import io.anuke.mindustry.entities.type.Bullet;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.gen.*;
|
||||
import io.anuke.mindustry.graphics.*;
|
||||
@@ -29,8 +29,6 @@ import io.anuke.mindustry.world.consumers.*;
|
||||
import io.anuke.mindustry.world.meta.*;
|
||||
import io.anuke.mindustry.world.modules.*;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class Blocks implements ContentList{
|
||||
public static Block
|
||||
|
||||
@@ -58,7 +56,7 @@ public class Blocks implements ContentList{
|
||||
phaseWall, phaseWallLarge, surgeWall, surgeWallLarge, mender, mendProjector, overdriveProjector, forceProjector, shockMine,
|
||||
|
||||
//transport
|
||||
conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, router, overflowGate, massDriver,
|
||||
conveyor, titaniumConveyor, armoredConveyor, distributor, junction, itemBridge, phaseConveyor, sorter, invertedSorter, router, overflowGate, massDriver,
|
||||
|
||||
//liquids
|
||||
mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit,
|
||||
@@ -716,23 +714,23 @@ public class Blocks implements ContentList{
|
||||
//region sandbox
|
||||
|
||||
powerVoid = new PowerVoid("power-void"){{
|
||||
requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
alwaysUnlocked = true;
|
||||
}};
|
||||
powerSource = new PowerSource("power-source"){{
|
||||
requirements(Category.power, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.power, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
alwaysUnlocked = true;
|
||||
}};
|
||||
itemSource = new ItemSource("item-source"){{
|
||||
requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
alwaysUnlocked = true;
|
||||
}};
|
||||
itemVoid = new ItemVoid("item-void"){{
|
||||
requirements(Category.distribution, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.distribution, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
alwaysUnlocked = true;
|
||||
}};
|
||||
liquidSource = new LiquidSource("liquid-source"){{
|
||||
requirements(Category.liquid, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.liquid, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
alwaysUnlocked = true;
|
||||
}};
|
||||
message = new MessageBlock("message"){{
|
||||
@@ -745,27 +743,27 @@ public class Blocks implements ContentList{
|
||||
int wallHealthMultiplier = 4;
|
||||
|
||||
scrapWall = new Wall("scrap-wall"){{
|
||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
health = 60 * wallHealthMultiplier;
|
||||
variants = 5;
|
||||
}};
|
||||
|
||||
scrapWallLarge = new Wall("scrap-wall-large"){{
|
||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
health = 60 * 4 * wallHealthMultiplier;
|
||||
size = 2;
|
||||
variants = 4;
|
||||
}};
|
||||
|
||||
scrapWallHuge = new Wall("scrap-wall-huge"){{
|
||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
health = 60 * 9 * wallHealthMultiplier;
|
||||
size = 3;
|
||||
variants = 3;
|
||||
}};
|
||||
|
||||
scrapWallGigantic = new Wall("scrap-wall-gigantic"){{
|
||||
requirements(Category.defense, () -> state.rules.infiniteResources, ItemStack.with());
|
||||
requirements(Category.defense, BuildVisibility.sandboxOnly, ItemStack.with());
|
||||
health = 60 * 16 * wallHealthMultiplier;
|
||||
size = 4;
|
||||
}};
|
||||
@@ -935,7 +933,11 @@ public class Blocks implements ContentList{
|
||||
|
||||
sorter = new Sorter("sorter"){{
|
||||
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
||||
}};
|
||||
|
||||
invertedSorter = new Sorter("inverted-sorter"){{
|
||||
requirements(Category.distribution, ItemStack.with(Items.lead, 2, Items.copper, 2));
|
||||
invert = true;
|
||||
}};
|
||||
|
||||
router = new Router("router"){{
|
||||
@@ -1083,11 +1085,12 @@ public class Blocks implements ContentList{
|
||||
size = 2;
|
||||
}};
|
||||
|
||||
differentialGenerator = new SingleTypeGenerator(true, false, "differential-generator"){{
|
||||
differentialGenerator = new SingleTypeGenerator("differential-generator"){{
|
||||
requirements(Category.power, ItemStack.with(Items.copper, 70, Items.titanium, 50, Items.lead, 100, Items.silicon, 65, Items.metaglass, 50));
|
||||
powerProduction = 16f;
|
||||
itemDuration = 120f;
|
||||
hasLiquids = true;
|
||||
hasItems = true;
|
||||
size = 3;
|
||||
|
||||
consumes.item(Items.pyratite).optional(true, false);
|
||||
@@ -1230,7 +1233,7 @@ public class Blocks implements ContentList{
|
||||
//region storage
|
||||
|
||||
coreShard = new CoreBlock("core-shard"){{
|
||||
requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 1000));
|
||||
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000));
|
||||
alwaysUnlocked = true;
|
||||
|
||||
health = 1100;
|
||||
@@ -1239,7 +1242,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
coreFoundation = new CoreBlock("core-foundation"){{
|
||||
requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 1500, Items.silicon, 1000));
|
||||
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 400, Items.silicon, 3000));
|
||||
|
||||
health = 2000;
|
||||
itemCapacity = 9000;
|
||||
@@ -1247,7 +1250,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
coreNucleus = new CoreBlock("core-nucleus"){{
|
||||
requirements(Category.effect, () -> false, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 1000));
|
||||
requirements(Category.effect, BuildVisibility.debugOnly, ItemStack.with(Items.titanium, 4000, Items.silicon, 2000, Items.surgealloy, 3000));
|
||||
|
||||
health = 4000;
|
||||
itemCapacity = 13000;
|
||||
@@ -1272,7 +1275,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
launchPad = new LaunchPad("launch-pad"){{
|
||||
requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.copper, 250, Items.silicon, 75, Items.lead, 100));
|
||||
requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 250, Items.silicon, 75, Items.lead, 100));
|
||||
size = 3;
|
||||
itemCapacity = 100;
|
||||
launchTime = 60f * 16;
|
||||
@@ -1281,7 +1284,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
launchPadLarge = new LaunchPad("launch-pad-large"){{
|
||||
requirements(Category.effect, () -> world.isZone(), ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75));
|
||||
requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.titanium, 200, Items.silicon, 150, Items.lead, 250, Items.plastanium, 75));
|
||||
size = 4;
|
||||
itemCapacity = 250;
|
||||
launchTime = 60f * 14;
|
||||
|
||||
@@ -31,6 +31,7 @@ public class TechTree implements ContentList{
|
||||
|
||||
node(distributor);
|
||||
node(sorter, () -> {
|
||||
node(invertedSorter);
|
||||
node(message);
|
||||
node(overflowGate);
|
||||
});
|
||||
|
||||
@@ -338,6 +338,7 @@ public class UI implements ApplicationListener, Loadable{
|
||||
}
|
||||
|
||||
public void showException(String text, Throwable exc){
|
||||
loadfrag.hide();
|
||||
new Dialog(""){{
|
||||
String message = Strings.getFinalMesage(exc);
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ public class MapResizeDialog extends FloatingDialog{
|
||||
|
||||
buttons.defaults().size(200f, 50f);
|
||||
buttons.addButton("$cancel", this::hide);
|
||||
buttons.addButton("$editor.resize", () -> {
|
||||
buttons.addButton("$ok", () -> {
|
||||
cons.accept(width, height);
|
||||
hide();
|
||||
});
|
||||
|
||||
6
core/src/io/anuke/mindustry/entities/TargetPriority.java
Normal file
@@ -0,0 +1,6 @@
|
||||
package io.anuke.mindustry.entities;
|
||||
|
||||
public enum TargetPriority{
|
||||
base,
|
||||
turret
|
||||
}
|
||||
@@ -87,7 +87,7 @@ public class Units{
|
||||
if(team == Team.derelict) return null;
|
||||
|
||||
for(Team enemy : state.teams.enemiesOf(team)){
|
||||
TileEntity entity = indexer.findTile(enemy, x, y, range, pred);
|
||||
TileEntity entity = indexer.findTile(enemy, x, y, range, pred, true);
|
||||
if(entity != null){
|
||||
return entity;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ import io.anuke.arc.graphics.glutils.*;
|
||||
import io.anuke.arc.math.*;
|
||||
import io.anuke.arc.util.*;
|
||||
import io.anuke.mindustry.content.*;
|
||||
import io.anuke.mindustry.entities.type.base.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.game.EventType.*;
|
||||
import io.anuke.mindustry.game.Teams.*;
|
||||
@@ -29,6 +28,7 @@ public class BlockRenderer implements Disposable{
|
||||
private int lastCamX, lastCamY, lastRangeX, lastRangeY;
|
||||
private int requestidx = 0;
|
||||
private int iterateidx = 0;
|
||||
private float brokenFade = 0f;
|
||||
private FrameBuffer shadows = new FrameBuffer(2, 2);
|
||||
private FrameBuffer fog = new FrameBuffer(2, 2);
|
||||
private Array<Tile> outArray = new Array<>();
|
||||
@@ -124,12 +124,18 @@ public class BlockRenderer implements Disposable{
|
||||
}
|
||||
|
||||
public void drawBroken(){
|
||||
if(unitGroups[player.getTeam().ordinal()].all().contains(p -> p instanceof BuilderDrone)){
|
||||
if(control.input.isPlacing() || control.input.isBreaking()){
|
||||
brokenFade = Mathf.lerpDelta(brokenFade, 1f, 0.1f);
|
||||
}else{
|
||||
brokenFade = Mathf.lerpDelta(brokenFade, 0f, 0.1f);
|
||||
}
|
||||
|
||||
if(brokenFade > 0.001f){
|
||||
for(BrokenBlock block : state.teams.get(player.getTeam()).brokenBlocks){
|
||||
Block b = content.block(block.block);
|
||||
if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue;
|
||||
|
||||
Draw.alpha(0.5f);
|
||||
Draw.alpha(0.53f * brokenFade);
|
||||
Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime(), 6f, 0.2f));
|
||||
Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f);
|
||||
}
|
||||
|
||||
@@ -190,6 +190,11 @@ public class DesktopInput extends InputHandler{
|
||||
cursorType = SystemCursor.arrow;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBreaking(){
|
||||
return mode == breaking;
|
||||
}
|
||||
|
||||
void pollInput(){
|
||||
Tile selected = tileAt(Core.input.mouseX(), Core.input.mouseY());
|
||||
int cursorX = tileX(Core.input.mouseX());
|
||||
|
||||
@@ -523,6 +523,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
return block != null;
|
||||
}
|
||||
|
||||
public boolean isBreaking(){
|
||||
return false;
|
||||
}
|
||||
|
||||
public float mouseAngle(float x, float y){
|
||||
return Core.input.mouseWorld(getMouseX(), getMouseY()).sub(x, y).angle();
|
||||
}
|
||||
|
||||
@@ -348,6 +348,11 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
//endregion
|
||||
//region input events
|
||||
|
||||
@Override
|
||||
public boolean isBreaking(){
|
||||
return mode == breaking;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean touchDown(int screenX, int screenY, int pointer, KeyCode button){
|
||||
if(state.is(State.menu) || player.isDead()) return false;
|
||||
|
||||
@@ -8,12 +8,27 @@ import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.world.*;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class JsonIO{
|
||||
private static CustomJson jsonBase = new CustomJson();
|
||||
private static Json json = new Json(){{
|
||||
apply(this);
|
||||
}};
|
||||
private static Json json = new Json(){
|
||||
{ apply(this); }
|
||||
|
||||
@Override
|
||||
public void writeValue(Object value, Class knownType, Class elementType){
|
||||
if(value instanceof MappableContent){
|
||||
try{
|
||||
getWriter().value(((MappableContent)value).name);
|
||||
}catch(IOException e){
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}else{
|
||||
super.writeValue(value, knownType, elementType);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static String write(Object object){
|
||||
return json.toJson(object, object.getClass());
|
||||
@@ -66,24 +81,6 @@ public class JsonIO{
|
||||
}
|
||||
});
|
||||
|
||||
//TODO extremely hacky and disgusting
|
||||
for(Block block : Vars.content.blocks()){
|
||||
Class type = block.getClass();
|
||||
if(type.isAnonymousClass()) type = type.getSuperclass();
|
||||
|
||||
json.setSerializer(type, new Serializer<Block>(){
|
||||
@Override
|
||||
public void write(Json json, Block object, Class knownType){
|
||||
json.writeValue(object.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block read(Json json, JsonValue jsonData, Class type){
|
||||
return Vars.content.getByName(ContentType.block, jsonData.asString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
json.setSerializer(Block.class, new Serializer<Block>(){
|
||||
@Override
|
||||
public void write(Json json, Block object, Class knownType){
|
||||
@@ -96,26 +93,6 @@ public class JsonIO{
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
json.setSerializer(TeamData.class, new Serializer<TeamData>(){
|
||||
@Override
|
||||
public void write(Json json, TeamData object, Class knownType){
|
||||
json.writeObjectStart();
|
||||
json.writeValue("brokenBlocks", object.brokenBlocks.toArray());
|
||||
json.writeValue("team", object.team.ordinal());
|
||||
json.writeObjectEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TeamData read(Json json, JsonValue jsonData, Class type){
|
||||
long[] blocks = jsonData.get("brokenBlocks").asLongArray();
|
||||
Team team = Team.all[jsonData.getInt("team", 0)];
|
||||
TeamData out = new TeamData(team, EnumSet.of(new Team[]{}));
|
||||
out.brokenBlocks = new LongQueue(blocks);
|
||||
return out;
|
||||
}
|
||||
});*/
|
||||
|
||||
json.setSerializer(ItemStack.class, new Serializer<ItemStack>(){
|
||||
@Override
|
||||
public void write(Json json, ItemStack object, Class knownType){
|
||||
|
||||
@@ -25,6 +25,7 @@ import io.anuke.mindustry.mod.Mods.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.world.*;
|
||||
import io.anuke.mindustry.world.consumers.*;
|
||||
import io.anuke.mindustry.world.meta.*;
|
||||
|
||||
import java.lang.reflect.*;
|
||||
|
||||
@@ -79,6 +80,12 @@ public class ContentParser{
|
||||
private Json parser = new Json(){
|
||||
@Override
|
||||
public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData, Class keyType){
|
||||
T t = internalRead(type, elementType, jsonData, keyType);
|
||||
if(t != null) checkNullFields(t);
|
||||
return t;
|
||||
}
|
||||
|
||||
private <T> T internalRead(Class<T> type, Class elementType, JsonValue jsonData, Class keyType){
|
||||
if(type != null){
|
||||
if(classParsers.containsKey(type)){
|
||||
try{
|
||||
@@ -167,9 +174,9 @@ public class ContentParser{
|
||||
TechTree.create(find(ContentType.block, value.get("research").asString()), block);
|
||||
}
|
||||
|
||||
//make block visible
|
||||
if(value.has("requirements")){
|
||||
block.buildVisibility = () -> true;
|
||||
//make block visible by default if there are requirements and no visibility set
|
||||
if(value.has("requirements") && block.buildVisibility == BuildVisibility.hidden){
|
||||
block.buildVisibility = BuildVisibility.shown;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -289,10 +296,12 @@ public class ContentParser{
|
||||
}
|
||||
|
||||
currentMod = mod;
|
||||
boolean exists = Vars.content.getByName(type, name) != null;
|
||||
Content c = parsers.get(type).parse(mod.name, name, value);
|
||||
c.sourceFile = file;
|
||||
c.mod = mod;
|
||||
checkNulls(c);
|
||||
if(!exists){
|
||||
c.sourceFile = file;
|
||||
c.mod = mod;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
@@ -348,35 +357,21 @@ public class ContentParser{
|
||||
|
||||
private Object fieldOpt(Class<?> type, JsonValue value){
|
||||
try{
|
||||
Object b = type.getField(value.asString()).get(null);
|
||||
if(b == null) return null;
|
||||
return b;
|
||||
return type.getField(value.asString()).get(null);
|
||||
}catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/** Checks all @NonNull fields in this object, recursively.
|
||||
* Throws an exception if any are null.*/
|
||||
private void checkNulls(Object object){
|
||||
checkNulls(object, new ObjectSet<>());
|
||||
}
|
||||
|
||||
private void checkNulls(Object object, ObjectSet<Object> checked){
|
||||
checked.add(object);
|
||||
private void checkNullFields(Object object){
|
||||
if(object instanceof Number || object instanceof String) return;
|
||||
|
||||
parser.getFields(object.getClass()).values().toArray().each(field -> {
|
||||
try{
|
||||
if(field.field.getType().isPrimitive()) return;
|
||||
|
||||
Object obj = field.field.get(object);
|
||||
if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){
|
||||
throw new RuntimeException("Field '" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!");
|
||||
}
|
||||
|
||||
if(obj != null && !checked.contains(obj)){
|
||||
checkNulls(obj, checked);
|
||||
checked.add(obj);
|
||||
throw new RuntimeException("'" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!");
|
||||
}
|
||||
}catch(Exception e){
|
||||
throw new RuntimeException(e);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.anuke.mindustry.ui;
|
||||
|
||||
import io.anuke.arc.Core;
|
||||
import io.anuke.arc.util.Strings;
|
||||
import io.anuke.arc.graphics.Color;
|
||||
import io.anuke.mindustry.graphics.Pal;
|
||||
|
||||
@@ -29,7 +30,7 @@ public class Links{
|
||||
}
|
||||
|
||||
public static class LinkEntry{
|
||||
public final String name, description, link;
|
||||
public final String name, title, description, link;
|
||||
public final Color color;
|
||||
|
||||
public LinkEntry(String name, String link, Color color){
|
||||
@@ -37,6 +38,9 @@ public class Links{
|
||||
this.color = color;
|
||||
this.description = Core.bundle.getNotNull("link." + name + ".description");
|
||||
this.link = link;
|
||||
|
||||
String title = Core.bundle.getOrNull("link." + name + ".title");
|
||||
this.title = title != null ? title : Strings.capitalize(name.replace("-", " "));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public class AboutDialog extends FloatingDialog{
|
||||
}).size(h - 5, h);
|
||||
|
||||
table.table(inset -> {
|
||||
inset.add("[accent]" + Strings.capitalize(link.name.replace("-", " "))).growX().left();
|
||||
inset.add("[accent]" + link.title).growX().left();
|
||||
inset.row();
|
||||
inset.labelWrap(link.description).width(w - 100f).color(Color.lightGray).growX();
|
||||
}).padLeft(8);
|
||||
|
||||
@@ -157,14 +157,14 @@ public class CustomRulesDialog extends FloatingDialog{
|
||||
main.row();
|
||||
|
||||
title("$rules.title.player");
|
||||
number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier);
|
||||
number("$rules.playerhealthmultiplier", f -> rules.playerHealthMultiplier = f, () -> rules.playerHealthMultiplier);
|
||||
number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier);
|
||||
|
||||
title("$rules.title.unit");
|
||||
check("$rules.unitdrops", b -> rules.unitDrops = b, () -> rules.unitDrops, () -> true);
|
||||
number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier);
|
||||
number("$rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier);
|
||||
number("$rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
|
||||
number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier);
|
||||
|
||||
title("$rules.title.enemy");
|
||||
check("$rules.attack", b -> rules.attackMode = b, () -> rules.attackMode);
|
||||
|
||||
@@ -5,9 +5,11 @@ import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.function.*;
|
||||
import io.anuke.arc.graphics.*;
|
||||
import io.anuke.arc.graphics.g2d.*;
|
||||
import io.anuke.arc.input.*;
|
||||
import io.anuke.arc.math.*;
|
||||
import io.anuke.arc.math.geom.*;
|
||||
import io.anuke.arc.scene.*;
|
||||
import io.anuke.arc.scene.event.*;
|
||||
import io.anuke.arc.scene.style.*;
|
||||
import io.anuke.arc.scene.ui.*;
|
||||
import io.anuke.arc.scene.ui.layout.*;
|
||||
@@ -21,7 +23,8 @@ import io.anuke.mindustry.graphics.*;
|
||||
import io.anuke.mindustry.io.SaveIO.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.ui.*;
|
||||
import io.anuke.mindustry.ui.TreeLayout.*;
|
||||
import io.anuke.mindustry.ui.layout.*;
|
||||
import io.anuke.mindustry.ui.layout.TreeLayout.*;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
@@ -30,13 +33,14 @@ public class DeployDialog extends FloatingDialog{
|
||||
private ObjectSet<ZoneNode> nodes = new ObjectSet<>();
|
||||
private ZoneInfoDialog info = new ZoneInfoDialog();
|
||||
private Rectangle bounds = new Rectangle();
|
||||
private View view = new View();
|
||||
|
||||
public DeployDialog(){
|
||||
super("", Styles.fullDialog);
|
||||
|
||||
ZoneNode root = new ZoneNode(Zones.groundZero, null);
|
||||
|
||||
TreeLayout layout = new TreeLayout();
|
||||
BranchTreeLayout layout = new BranchTreeLayout();
|
||||
layout.gapBetweenLevels = layout.gapBetweenNodes = Scl.scl(60f);
|
||||
layout.gapBetweenNodes = Scl.scl(120f);
|
||||
layout.layout(root);
|
||||
@@ -47,6 +51,51 @@ public class DeployDialog extends FloatingDialog{
|
||||
buttons.addImageTextButton("$techtree", Icon.tree, () -> ui.tech.show()).size(230f, 64f);
|
||||
|
||||
shown(this::setup);
|
||||
|
||||
//view input.
|
||||
|
||||
addListener(new InputListener(){
|
||||
@Override
|
||||
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
|
||||
view.setScale(Mathf.clamp(view.getScaleX() - amountY / 40f, 0.25f, 1f));
|
||||
view.setOrigin(Align.center);
|
||||
view.setTransform(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseMoved(InputEvent event, float x, float y){
|
||||
view.requestScroll();
|
||||
return super.mouseMoved(event, x, y);
|
||||
}
|
||||
});
|
||||
|
||||
addListener(new ElementGestureListener(){
|
||||
@Override
|
||||
public void zoom(InputEvent event, float initialDistance, float distance){
|
||||
if(view.lastZoom < 0){
|
||||
view.lastZoom = view.getScaleX();
|
||||
}
|
||||
|
||||
view.setScale(Mathf.clamp(distance / initialDistance * view.lastZoom, 0.25f, 1f));
|
||||
view.setOrigin(Align.center);
|
||||
view.setTransform(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
|
||||
view.lastZoom = view.getScaleX();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){
|
||||
view.panX += deltaX / view.getScaleX();
|
||||
view.panY += deltaY / view.getScaleY();
|
||||
view.moved = true;
|
||||
view.clamp();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
public void setup(){
|
||||
@@ -71,7 +120,7 @@ public class DeployDialog extends FloatingDialog{
|
||||
update(() -> {
|
||||
setOrigin(Align.center);
|
||||
time[0] += Core.graphics.getDeltaTime() * 10f;
|
||||
setTranslation(Mathf.sin(time[0], 60f, 70f) + panX / 30f, Mathf.cos(time[0], 140f, 80f) + (panY + 200) / 30f);
|
||||
setTranslation(Mathf.sin(time[0], 60f, 70f) + view.panX / 30f, Mathf.cos(time[0], 140f, 80f) + (view.panY + 200) / 30f);
|
||||
});
|
||||
}}.setScaling(Scaling.fit));
|
||||
|
||||
@@ -141,7 +190,7 @@ public class DeployDialog extends FloatingDialog{
|
||||
}).width(size).height(50f).padTop(3);
|
||||
}));
|
||||
}else{
|
||||
stack.add(new View());
|
||||
stack.add(view = new View());
|
||||
}
|
||||
|
||||
stack.add(new ItemsDisplay());
|
||||
@@ -158,6 +207,9 @@ public class DeployDialog extends FloatingDialog{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
view.setOrigin(Align.center);
|
||||
view.setTransform(true);
|
||||
}
|
||||
|
||||
boolean hidden(Zone zone){
|
||||
@@ -166,7 +218,11 @@ public class DeployDialog extends FloatingDialog{
|
||||
|
||||
void buildButton(Zone zone, Button button){
|
||||
button.setDisabled(() -> hidden(zone));
|
||||
button.clicked(() -> info.show(zone));
|
||||
button.clicked(() -> {
|
||||
if(!view.moved){
|
||||
info.show(zone);
|
||||
}
|
||||
});
|
||||
|
||||
if(zone.unlocked() && !hidden(zone)){
|
||||
button.labelWrap(zone.localizedName()).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center);
|
||||
@@ -178,10 +234,9 @@ public class DeployDialog extends FloatingDialog{
|
||||
}
|
||||
}
|
||||
|
||||
//should be static variables of View, but that's impossible
|
||||
static float panX = 0, panY = -200;
|
||||
|
||||
class View extends Group{
|
||||
float panX = 0, panY = -200, lastZoom = -1;
|
||||
boolean moved = false;
|
||||
|
||||
{
|
||||
for(ZoneNode node : nodes){
|
||||
@@ -201,11 +256,7 @@ public class DeployDialog extends FloatingDialog{
|
||||
addChild(stack);
|
||||
}
|
||||
|
||||
dragged((x, y) -> {
|
||||
panX += x;
|
||||
panY += y;
|
||||
clamp();
|
||||
});
|
||||
released(() -> moved = false);
|
||||
}
|
||||
|
||||
void clamp(){
|
||||
@@ -221,9 +272,9 @@ public class DeployDialog extends FloatingDialog{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
public void drawChildren(){
|
||||
clamp();
|
||||
float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y;
|
||||
float offsetX = panX + width / 2f, offsetY = panY + height / 2f;
|
||||
|
||||
for(ZoneNode node : nodes){
|
||||
for(ZoneNode child : node.allChildren){
|
||||
@@ -234,7 +285,7 @@ public class DeployDialog extends FloatingDialog{
|
||||
}
|
||||
|
||||
Draw.reset();
|
||||
super.draw();
|
||||
super.drawChildren();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ import io.anuke.arc.*;
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.util.*;
|
||||
import io.anuke.arc.util.io.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.gen.*;
|
||||
import io.anuke.mindustry.graphics.*;
|
||||
import io.anuke.mindustry.mod.Mods.*;
|
||||
@@ -24,9 +23,35 @@ public class ModsDialog extends FloatingDialog{
|
||||
() -> Core.net.openURI(reportIssueURL))
|
||||
.size(250f, 64f);
|
||||
|
||||
buttons.row();
|
||||
|
||||
buttons.addImageTextButton("$mods.guide", Icon.wiki,
|
||||
() -> Core.net.openURI(modGuideURL))
|
||||
.size(280f, 64f);
|
||||
.size(210f, 64f);
|
||||
|
||||
buttons.addImageTextButton("$mod.import.github", Icon.github, () -> {
|
||||
ui.showTextInput("$mod.import.github", "", 64, "Anuken/ExampleMod", text -> {
|
||||
ui.loadfrag.show();
|
||||
Core.net.httpGet("http://api.github.com/repos/" + text + "/zipball/master", loc -> {
|
||||
Core.net.httpGet(loc.getHeader("Location"), result -> {
|
||||
try{
|
||||
Streams.copyStream(result.getResultAsStream(), modDirectory.child(text.replace("/", "") + ".zip").write(false));
|
||||
Core.app.post(() -> {
|
||||
try{
|
||||
mods.reloadContent();
|
||||
setup();
|
||||
ui.loadfrag.hide();
|
||||
}catch(Exception e){
|
||||
ui.showException(e);
|
||||
}
|
||||
});
|
||||
}catch(Exception e){
|
||||
ui.showException(e);
|
||||
}
|
||||
}, t -> Core.app.post(() -> ui.showException(t)));
|
||||
}, t -> Core.app.post(() -> ui.showException(t)));
|
||||
});
|
||||
}).size(250f, 64f);
|
||||
|
||||
shown(this::setup);
|
||||
|
||||
@@ -120,27 +145,5 @@ public class ModsDialog extends FloatingDialog{
|
||||
}
|
||||
});
|
||||
}).margin(12f).width(500f);
|
||||
|
||||
//not well tested currently
|
||||
if(Version.build == -1){
|
||||
cont.row();
|
||||
|
||||
cont.addImageTextButton("$mod.import.github", Icon.github, () -> {
|
||||
ui.showTextInput("$mod.import.github", "", "Anuken/ExampleMod", text -> {
|
||||
Core.net.httpGet("http://api.github.com/repos/" + text + "/zipball/master", loc -> {
|
||||
Core.net.httpGet(loc.getHeader("Location"), result -> {
|
||||
try{
|
||||
Streams.copyStream(result.getResultAsStream(), modDirectory.child(text.replace("/", "") + ".zip").write(false));
|
||||
ui.loadAnd(() -> {
|
||||
mods.reloadContent();
|
||||
});
|
||||
}catch(Exception e){
|
||||
ui.showException(e);
|
||||
}
|
||||
}, ui::showException);
|
||||
}, ui::showException);
|
||||
});
|
||||
}).margin(12f).width(500f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,6 +294,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
||||
graphics.checkPref("effects", true);
|
||||
graphics.checkPref("playerchat", true);
|
||||
graphics.checkPref("minimap", !mobile);
|
||||
graphics.checkPref("position", false);
|
||||
graphics.checkPref("fps", false);
|
||||
graphics.checkPref("indicators", true);
|
||||
graphics.checkPref("animatedwater", false);
|
||||
|
||||
@@ -4,6 +4,7 @@ import io.anuke.arc.*;
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.graphics.*;
|
||||
import io.anuke.arc.graphics.g2d.*;
|
||||
import io.anuke.arc.input.*;
|
||||
import io.anuke.arc.math.*;
|
||||
import io.anuke.arc.math.geom.*;
|
||||
import io.anuke.arc.scene.*;
|
||||
@@ -21,7 +22,8 @@ import io.anuke.mindustry.gen.*;
|
||||
import io.anuke.mindustry.graphics.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.ui.*;
|
||||
import io.anuke.mindustry.ui.TreeLayout.*;
|
||||
import io.anuke.mindustry.ui.layout.*;
|
||||
import io.anuke.mindustry.ui.layout.TreeLayout.*;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
@@ -31,13 +33,14 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
private TechTreeNode root = new TechTreeNode(TechTree.root, null);
|
||||
private Rectangle bounds = new Rectangle();
|
||||
private ItemsDisplay items;
|
||||
private View view;
|
||||
|
||||
public TechTreeDialog(){
|
||||
super("");
|
||||
|
||||
titleTable.remove();
|
||||
margin(0f).marginBottom(8);
|
||||
cont.stack(new View(), items = new ItemsDisplay()).grow();
|
||||
cont.stack(view = new View(), items = new ItemsDisplay()).grow();
|
||||
|
||||
shown(() -> {
|
||||
checkNodes(root);
|
||||
@@ -52,16 +55,57 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
hide();
|
||||
ui.database.show();
|
||||
}).size(210f, 64f);
|
||||
|
||||
//scaling/drag input
|
||||
|
||||
addListener(new InputListener(){
|
||||
@Override
|
||||
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
|
||||
view.setScale(Mathf.clamp(view.getScaleX() - amountY / 40f, 0.25f, 1f));
|
||||
view.setOrigin(Align.center);
|
||||
view.setTransform(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean mouseMoved(InputEvent event, float x, float y){
|
||||
view.requestScroll();
|
||||
return super.mouseMoved(event, x, y);
|
||||
}
|
||||
});
|
||||
|
||||
addListener(new ElementGestureListener(){
|
||||
@Override
|
||||
public void zoom(InputEvent event, float initialDistance, float distance){
|
||||
if(view.lastZoom < 0){
|
||||
view.lastZoom = view.getScaleX();
|
||||
}
|
||||
|
||||
view.setScale(Mathf.clamp(distance / initialDistance * view.lastZoom, 0.25f, 1f));
|
||||
view.setOrigin(Align.center);
|
||||
view.setTransform(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
|
||||
view.lastZoom = view.getScaleX();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){
|
||||
view.panX += deltaX / view.getScaleX();
|
||||
view.panY += deltaY / view.getScaleY();
|
||||
view.moved = true;
|
||||
view.clamp();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void treeLayout(){
|
||||
TreeLayout layout = new TreeLayout();
|
||||
layout.gapBetweenLevels = Scl.scl(60f);
|
||||
layout.gapBetweenNodes = Scl.scl(40f);
|
||||
RadialTreeLayout layout = new RadialTreeLayout();
|
||||
LayoutNode node = new LayoutNode(root, null);
|
||||
layout.layout(node);
|
||||
bounds.set(layout.getBounds());
|
||||
bounds.y += nodeSize*1.5f;
|
||||
//bounds.y += nodeSize*1.5f;
|
||||
copyInfo(node);
|
||||
}
|
||||
|
||||
@@ -110,7 +154,7 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
this.parent = parent;
|
||||
this.width = this.height = nodeSize;
|
||||
if(node.children != null){
|
||||
children = Array.with(node.children).select(n -> n.visible).map(t -> new LayoutNode(t, this)).toArray(LayoutNode.class);
|
||||
children = Array.with(node.children).map(t -> new LayoutNode(t, this)).toArray(LayoutNode.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -134,7 +178,7 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
}
|
||||
|
||||
class View extends Group{
|
||||
float panX = 0, panY = -200;
|
||||
float panX = 0, panY = -200, lastZoom = -1;
|
||||
boolean moved = false;
|
||||
ImageButton hoverNode;
|
||||
Table infoTable = new Table();
|
||||
@@ -146,6 +190,8 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
ImageButton button = new ImageButton(node.node.block.icon(Cicon.medium), Styles.nodei);
|
||||
button.visible(() -> node.visible);
|
||||
button.clicked(() -> {
|
||||
if(moved) return;
|
||||
|
||||
if(mobile){
|
||||
hoverNode = button;
|
||||
rebuild();
|
||||
@@ -182,7 +228,6 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
});
|
||||
button.touchable(() -> !node.visible ? Touchable.disabled : Touchable.enabled);
|
||||
button.setUserObject(node.node);
|
||||
button.tapped(() -> moved = false);
|
||||
button.setSize(nodeSize);
|
||||
button.update(() -> {
|
||||
float offset = (Core.graphics.getHeight() % 2) / 2f;
|
||||
@@ -205,12 +250,9 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
});
|
||||
}
|
||||
|
||||
dragged((x, y) -> {
|
||||
moved = true;
|
||||
panX += x;
|
||||
panY += y;
|
||||
clamp();
|
||||
});
|
||||
setOrigin(Align.center);
|
||||
setTransform(true);
|
||||
released(() -> moved = false);
|
||||
}
|
||||
|
||||
void clamp(){
|
||||
@@ -308,9 +350,9 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
public void drawChildren(){
|
||||
clamp();
|
||||
float offsetX = panX + width / 2f + x, offsetY = panY + height / 2f + y;
|
||||
float offsetX = panX + width / 2f, offsetY = panY + height / 2f;
|
||||
|
||||
for(TechTreeNode node : nodes){
|
||||
if(!node.visible) continue;
|
||||
@@ -324,7 +366,7 @@ public class TechTreeDialog extends FloatingDialog{
|
||||
}
|
||||
|
||||
Draw.reset();
|
||||
super.draw();
|
||||
super.drawChildren();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ public class ZoneInfoDialog extends FloatingDialog{
|
||||
hide();
|
||||
control.playZone(zone);
|
||||
}
|
||||
}).minWidth(150f).margin(13f).padTop(5).disabled(b -> zone.locked() ? !zone.canUnlock() : !data.hasItems(zone.getLaunchCost())).uniformY().get();
|
||||
}).minWidth(200f).margin(13f).padTop(5).disabled(b -> zone.locked() ? !zone.canUnlock() : !data.hasItems(zone.getLaunchCost())).uniformY().get();
|
||||
|
||||
button.row();
|
||||
button.add(iteminfo);
|
||||
|
||||
@@ -19,15 +19,14 @@ import io.anuke.arc.util.*;
|
||||
import io.anuke.mindustry.core.GameState.*;
|
||||
import io.anuke.mindustry.entities.*;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.game.EventType.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.game.EventType.*;
|
||||
import io.anuke.mindustry.gen.*;
|
||||
import io.anuke.mindustry.graphics.*;
|
||||
import io.anuke.mindustry.input.*;
|
||||
import io.anuke.mindustry.net.Packets.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.ui.*;
|
||||
import io.anuke.mindustry.ui.Styles;
|
||||
import io.anuke.mindustry.ui.dialogs.*;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
@@ -249,9 +248,16 @@ public class HudFragment extends Fragment{
|
||||
info.label(() -> ping.get(netClient.getPing())).visible(net::client).left().style(Styles.outlineLabel);
|
||||
}).top().left();
|
||||
});
|
||||
|
||||
//minimap
|
||||
parent.fill(t -> t.top().right().add(new Minimap()).visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial));
|
||||
|
||||
parent.fill(t -> {
|
||||
//minimap
|
||||
t.add(new Minimap().visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial));
|
||||
t.row();
|
||||
//position
|
||||
t.label(() -> world.toTile(player.x) + "," + world.toTile(player.y))
|
||||
.visible(() -> Core.settings.getBool("position") && !state.rules.tutorial);
|
||||
t.top().right();
|
||||
});
|
||||
|
||||
//spawner warning
|
||||
parent.fill(t -> {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package io.anuke.mindustry.ui;
|
||||
package io.anuke.mindustry.ui.layout;
|
||||
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.math.geom.*;
|
||||
@@ -6,7 +6,7 @@ import io.anuke.arc.math.geom.*;
|
||||
/**
|
||||
* Algorithm taken from <a href="https://github.com/abego/treelayout">TreeLayout</a>.
|
||||
*/
|
||||
public class TreeLayout{
|
||||
public class BranchTreeLayout implements TreeLayout{
|
||||
public TreeLocation rootLocation = TreeLocation.top;
|
||||
public TreeAlignment alignment = TreeAlignment.awayFromRoot;
|
||||
public float gapBetweenLevels = 10;
|
||||
@@ -18,6 +18,7 @@ public class TreeLayout{
|
||||
private float boundsTop = Float.MAX_VALUE;
|
||||
private float boundsBottom = Float.MIN_VALUE;
|
||||
|
||||
@Override
|
||||
public void layout(TreeNode root){
|
||||
firstWalk(root, null);
|
||||
calcSizeOfLevels(root, 0);
|
||||
@@ -288,20 +289,4 @@ public class TreeLayout{
|
||||
public enum TreeAlignment{
|
||||
center, towardsRoot, awayFromRoot
|
||||
}
|
||||
|
||||
public static class TreeNode<T extends TreeNode>{
|
||||
public float width, height, x, y;
|
||||
|
||||
//should be initialized by user
|
||||
public T[] children;
|
||||
public T parent;
|
||||
|
||||
private float mode, prelim, change, shift;
|
||||
private int number = -1;
|
||||
private TreeNode thread, ancestor;
|
||||
|
||||
boolean isLeaf(){
|
||||
return children == null || children.length == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
66
core/src/io/anuke/mindustry/ui/layout/RadialTreeLayout.java
Normal file
@@ -0,0 +1,66 @@
|
||||
package io.anuke.mindustry.ui.layout;
|
||||
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.math.*;
|
||||
|
||||
public class RadialTreeLayout implements TreeLayout{
|
||||
private static ObjectSet<TreeNode> visited = new ObjectSet<>();
|
||||
private static Queue<TreeNode> queue = new Queue<>();
|
||||
|
||||
public float startRadius, delta;
|
||||
|
||||
@Override
|
||||
public void layout(TreeNode root){
|
||||
startRadius = root.height * 2.4f;
|
||||
delta = root.height * 2.4f;
|
||||
|
||||
bfs(root, true);
|
||||
radialize(root, 0, 360);
|
||||
}
|
||||
|
||||
void radialize(TreeNode root, float from, float to){
|
||||
int depthOfVertex = root.number;
|
||||
float theta = from;
|
||||
float radius = startRadius + (delta * depthOfVertex);
|
||||
|
||||
int leavesNumber = bfs(root, false);
|
||||
for(TreeNode child : root.children){
|
||||
int lambda = bfs(child, false);
|
||||
float mi = theta + ((float)lambda / leavesNumber * (to - from));
|
||||
|
||||
float x = radius * Mathf.cos((theta + mi) / 2f * Mathf.degRad);
|
||||
float y = radius * Mathf.sin((theta + mi) / 2f * Mathf.degRad);
|
||||
|
||||
child.x = x;
|
||||
child.y = y;
|
||||
|
||||
if(child.children.length > 0) radialize(child, theta, mi);
|
||||
theta = mi;
|
||||
}
|
||||
}
|
||||
|
||||
int bfs(TreeNode node, boolean assign){
|
||||
visited.clear();
|
||||
queue.clear();
|
||||
if(assign) node.number = 0;
|
||||
int leaves = 0;
|
||||
|
||||
visited.add(node);
|
||||
queue.addFirst(node);
|
||||
|
||||
while(!queue.isEmpty()){
|
||||
TreeNode current = queue.removeFirst();
|
||||
if(current.children.length == 0) leaves++;
|
||||
|
||||
for(TreeNode child : current.children){
|
||||
if(assign) child.number = current.number + 1;
|
||||
if(!visited.contains(child)){
|
||||
visited.add(child);
|
||||
queue.addLast(child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return leaves;
|
||||
}
|
||||
}
|
||||
22
core/src/io/anuke/mindustry/ui/layout/TreeLayout.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package io.anuke.mindustry.ui.layout;
|
||||
|
||||
public interface TreeLayout{
|
||||
void layout(TreeNode root);
|
||||
|
||||
class TreeNode<T extends TreeNode>{
|
||||
public float width, height, x, y;
|
||||
|
||||
//should be initialized by user
|
||||
public T[] children;
|
||||
public T parent;
|
||||
|
||||
//internal stuff
|
||||
public float mode, prelim, change, shift;
|
||||
public int number = -1;
|
||||
public TreeNode thread, ancestor;
|
||||
|
||||
public boolean isLeaf(){
|
||||
return children == null || children.length == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,8 +39,6 @@ import static io.anuke.mindustry.Vars.*;
|
||||
public class Block extends BlockStorage{
|
||||
public static final int crackRegions = 8, maxCrackSize = 5;
|
||||
|
||||
private static final BooleanProvider invisible = () -> false;
|
||||
|
||||
/** whether this block has a tile entity that updates */
|
||||
public boolean update;
|
||||
/** whether this block has health and can be destroyed */
|
||||
@@ -83,6 +81,8 @@ public class Block extends BlockStorage{
|
||||
public BlockGroup group = BlockGroup.none;
|
||||
/** List of block flags. Used for AI indexing. */
|
||||
public EnumSet<BlockFlag> flags = EnumSet.of();
|
||||
/** Targeting priority of this block, as seen by enemies.*/
|
||||
public TargetPriority priority = TargetPriority.base;
|
||||
/** Whether the block can be tapped and selected to configure. */
|
||||
public boolean configurable;
|
||||
/** Whether this block consumes touchDown events when tapped. */
|
||||
@@ -122,7 +122,9 @@ public class Block extends BlockStorage{
|
||||
/** Cost of building this block; do not modify directly! */
|
||||
public float buildCost;
|
||||
/** Whether this block is visible and can currently be built. */
|
||||
public BooleanProvider buildVisibility = invisible;
|
||||
public BuildVisibility buildVisibility = BuildVisibility.hidden;
|
||||
/** Multiplier for speed of building this block. */
|
||||
public float buildCostMultiplier = 1f;
|
||||
/** Whether this block has instant transfer.*/
|
||||
public boolean instantTransfer = false;
|
||||
public boolean alwaysUnlocked = false;
|
||||
@@ -153,7 +155,7 @@ public class Block extends BlockStorage{
|
||||
}
|
||||
|
||||
public boolean isBuildable(){
|
||||
return buildVisibility != invisible;
|
||||
return buildVisibility != BuildVisibility.hidden && buildVisibility != BuildVisibility.debugOnly;
|
||||
}
|
||||
|
||||
public boolean isStatic(){
|
||||
@@ -386,6 +388,7 @@ public class Block extends BlockStorage{
|
||||
for(ItemStack stack : requirements){
|
||||
buildCost += stack.amount * stack.item.cost;
|
||||
}
|
||||
buildCost *= buildCostMultiplier;
|
||||
|
||||
if(consumes.has(ConsumeType.power)) hasPower = true;
|
||||
if(consumes.has(ConsumeType.item)) hasItems = true;
|
||||
@@ -803,7 +806,7 @@ public class Block extends BlockStorage{
|
||||
}
|
||||
|
||||
public boolean isVisible(){
|
||||
return buildVisibility.get() && !isHidden();
|
||||
return buildVisibility.visible() && !isHidden();
|
||||
}
|
||||
|
||||
public boolean isFloor(){
|
||||
@@ -820,7 +823,7 @@ public class Block extends BlockStorage{
|
||||
|
||||
@Override
|
||||
public boolean isHidden(){
|
||||
return !buildVisibility.get();
|
||||
return !buildVisibility.visible();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -829,21 +832,21 @@ public class Block extends BlockStorage{
|
||||
}
|
||||
|
||||
protected void requirements(Category cat, ItemStack[] stacks, boolean unlocked){
|
||||
requirements(cat, () -> true, stacks);
|
||||
requirements(cat, BuildVisibility.shown, stacks);
|
||||
this.alwaysUnlocked = unlocked;
|
||||
}
|
||||
|
||||
protected void requirements(Category cat, ItemStack[] stacks){
|
||||
requirements(cat, () -> true, stacks);
|
||||
requirements(cat, BuildVisibility.shown, stacks);
|
||||
}
|
||||
|
||||
/** Sets up requirements. Use only this method to set up requirements. */
|
||||
protected void requirements(Category cat, BooleanProvider visible, ItemStack[] stacks){
|
||||
protected void requirements(Category cat, BuildVisibility visible, ItemStack[] stacks){
|
||||
this.category = cat;
|
||||
this.requirements = stacks;
|
||||
this.buildVisibility = visible;
|
||||
|
||||
Arrays.sort(requirements, (a, b) -> Integer.compare(a.item.id, b.item.id));
|
||||
Arrays.sort(requirements, Structs.comparingInt(i -> i.item.id));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -95,10 +95,9 @@ public class Floor extends Block{
|
||||
}
|
||||
|
||||
if(variants > 0){
|
||||
variantRegions();
|
||||
|
||||
for(int i = 0; i < variantRegions.length; i++){
|
||||
editor.pack("editor-" + ((AtlasRegion)variantRegions[i]).name, Core.atlas.getPixmap((AtlasRegion)variantRegions[i]).crop());
|
||||
for(int i = 0; i < variants; i++){
|
||||
String rname = name + (i + 1);
|
||||
editor.pack("editor-" + rname, Core.atlas.getPixmap(rname).crop());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,10 +211,6 @@ public class Floor extends Block{
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean eq(int i){
|
||||
return (eq & (1 << Mathf.mod(i, 8))) != 0;
|
||||
}
|
||||
|
||||
TextureRegion edge(Floor block, int x, int y){
|
||||
return block.edges()[x][2 - y];
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ public class Wall extends Block{
|
||||
solid = true;
|
||||
destructible = true;
|
||||
group = BlockGroup.walls;
|
||||
buildCostMultiplier = 5f;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -72,6 +72,7 @@ public abstract class Turret extends Block{
|
||||
|
||||
public Turret(String name){
|
||||
super(name);
|
||||
priority = TargetPriority.turret;
|
||||
update = true;
|
||||
solid = true;
|
||||
layer = Layer.turret;
|
||||
|
||||
@@ -232,8 +232,8 @@ public class MassDriver extends Block{
|
||||
int maxTransfer = Math.min(entity.items.get(content.item(i)), ((MassDriver)tile.block()).itemCapacity - totalUsed);
|
||||
data.items[i] = maxTransfer;
|
||||
totalUsed += maxTransfer;
|
||||
entity.items.remove(content.item(i), maxTransfer);
|
||||
}
|
||||
entity.items.clear();
|
||||
|
||||
float angle = tile.angleTo(target);
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import static io.anuke.mindustry.Vars.content;
|
||||
|
||||
public class Sorter extends Block{
|
||||
private static Item lastItem;
|
||||
protected boolean invert;
|
||||
|
||||
public Sorter(String name){
|
||||
super(name);
|
||||
@@ -40,16 +41,6 @@ public class Sorter extends Block{
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@Remote(targets = Loc.both, called = Loc.both, forward = true)
|
||||
public static void setSorterItem(Player player, Tile tile, Item item){
|
||||
if(!Units.canInteract(player, tile)) return;
|
||||
SorterEntity entity = tile.entity();
|
||||
if(entity != null){
|
||||
entity.sortItem = item;
|
||||
}
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public void configured(Tile tile, Player player, int value){
|
||||
tile.<SorterEntity>entity().sortItem = content.item(value);
|
||||
@@ -92,7 +83,7 @@ public class Sorter extends Block{
|
||||
if(dir == -1) return null;
|
||||
Tile to;
|
||||
|
||||
if(item == entity.sortItem){
|
||||
if((item == entity.sortItem) != invert){
|
||||
//prevent 3-chains
|
||||
if(isSame(dest, source) && isSame(dest, dest.getNearby(dir))){
|
||||
return null;
|
||||
@@ -115,12 +106,10 @@ public class Sorter extends Block{
|
||||
}else{
|
||||
if(dest.rotation() == 0){
|
||||
to = a;
|
||||
if(flip)
|
||||
dest.rotation((byte)1);
|
||||
if(flip) dest.rotation((byte)1);
|
||||
}else{
|
||||
to = b;
|
||||
if(flip)
|
||||
dest.rotation((byte)0);
|
||||
if(flip) dest.rotation((byte)0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ import io.anuke.arc.math.*;
|
||||
import io.anuke.arc.util.*;
|
||||
import io.anuke.mindustry.content.*;
|
||||
import io.anuke.mindustry.entities.*;
|
||||
import io.anuke.mindustry.entities.Effects.*;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.world.*;
|
||||
@@ -28,8 +29,8 @@ public class ItemLiquidGenerator extends PowerGenerator{
|
||||
/** Maximum liquid used per frame. */
|
||||
protected float maxLiquidGenerate = 0.4f;
|
||||
|
||||
protected Effects.Effect generateEffect = Fx.generatespark;
|
||||
protected Effects.Effect explodeEffect = Fx.generatespark;
|
||||
protected Effect generateEffect = Fx.generatespark;
|
||||
protected Effect explodeEffect = Fx.generatespark;
|
||||
protected Color heatColor = Color.valueOf("ff9b59");
|
||||
protected TextureRegion topRegion, liquidRegion;
|
||||
protected boolean randomlyExplode = true;
|
||||
|
||||
@@ -5,12 +5,9 @@ import io.anuke.mindustry.type.Liquid;
|
||||
|
||||
public class SingleTypeGenerator extends ItemLiquidGenerator{
|
||||
|
||||
public SingleTypeGenerator(boolean hasItems, boolean hasLiquids, String name){
|
||||
super(hasItems, hasLiquids, name);
|
||||
}
|
||||
|
||||
public SingleTypeGenerator(String name){
|
||||
super(name);
|
||||
defaults = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.world.consumers;
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.function.*;
|
||||
import io.anuke.arc.scene.ui.layout.*;
|
||||
import io.anuke.arc.util.ArcAnnotate.*;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
@@ -14,7 +15,7 @@ import io.anuke.mindustry.world.meta.values.*;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
public class ConsumeItemFilter extends Consume{
|
||||
public final Predicate<Item> filter;
|
||||
public final @NonNull Predicate<Item> filter;
|
||||
|
||||
public ConsumeItemFilter(Predicate<Item> item){
|
||||
this.filter = item;
|
||||
|
||||
@@ -2,6 +2,7 @@ package io.anuke.mindustry.world.consumers;
|
||||
|
||||
import io.anuke.arc.collection.*;
|
||||
import io.anuke.arc.scene.ui.layout.*;
|
||||
import io.anuke.arc.util.ArcAnnotate.*;
|
||||
import io.anuke.mindustry.entities.type.*;
|
||||
import io.anuke.mindustry.game.*;
|
||||
import io.anuke.mindustry.type.*;
|
||||
@@ -10,7 +11,7 @@ import io.anuke.mindustry.world.*;
|
||||
import io.anuke.mindustry.world.meta.*;
|
||||
|
||||
public class ConsumeLiquid extends ConsumeLiquidBase{
|
||||
public final Liquid liquid;
|
||||
public final @NonNull Liquid liquid;
|
||||
|
||||
public ConsumeLiquid(Liquid liquid, float amount){
|
||||
super(amount);
|
||||
|
||||
22
core/src/io/anuke/mindustry/world/meta/BuildVisibility.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package io.anuke.mindustry.world.meta;
|
||||
|
||||
import io.anuke.arc.function.*;
|
||||
import io.anuke.mindustry.*;
|
||||
|
||||
public enum BuildVisibility{
|
||||
hidden(() -> false),
|
||||
shown(() -> true),
|
||||
debugOnly(() -> false),
|
||||
sandboxOnly(() -> Vars.state.rules.infiniteResources),
|
||||
campaignOnly(() -> Vars.world.isZone());
|
||||
|
||||
private final BooleanProvider visible;
|
||||
|
||||
public boolean visible(){
|
||||
return visible.get();
|
||||
}
|
||||
|
||||
BuildVisibility(BooleanProvider visible){
|
||||
this.visible = visible;
|
||||
}
|
||||
}
|
||||