Merge branch 'master' into master

This commit is contained in:
Vanguard
2019-12-18 13:22:37 +03:00
committed by GitHub
259 changed files with 4592 additions and 2495 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -26,6 +26,7 @@ load.image = Images
load.content = Content
load.system = System
load.mod = Mods
load.scripts = Scripts
schematic = Schematic
schematic.add = Save Schematic...
@@ -99,8 +100,11 @@ mod.enabled = [lightgray]Enabled
mod.disabled = [scarlet]Disabled
mod.disable = Disable
mod.delete.error = Unable to delete mod. File may be in use.
mod.requiresversion = [scarlet]Requires game version: [accent]{0}
mod.requiresversion = [scarlet]Requires min game version: [accent]{0}
mod.missingdependencies = [scarlet]Missing dependencies: {0}
mod.erroredcontent = [scarlet]Content Errors
mod.errors = Errors have occurred loading content.
mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing.
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled.
mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes.
@@ -113,6 +117,7 @@ mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again.
mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods.
mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly.
about.button = About
name = Name:
@@ -703,7 +708,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Deselect
keybind.shoot.name = Shoot
keybind.zoom_hold.name = Zoom Hold
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause
@@ -1044,7 +1048,7 @@ unit.eradicator.name = Eradicator
unit.lich.name = Lich
unit.reaper.name = Reaper
tutorial.next = [lightgray]<Tap to continue>
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [accent][[WASD][] to move.\n[accent]Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse[accent] [[WASD][] to move.\n[accent]Scroll[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper
tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\n[accent]Right-click[] to stop building.
tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement.

View File

@@ -23,7 +23,7 @@ load.map = Mapy
load.image = Obrázky
load.content = Obsah
load.system = System
load.mod = Mods
load.mod = Módy
schematic = Schematic
schematic.add = Save Schematic...
schematics = Schematics
@@ -108,7 +108,7 @@ about.button = O hře
name = Jméno:
noname = Nejdřív si vyber[accent] herní jméno[].
filename = Jméno složky:
unlocked = Nový blok odemknut!
unlocked = Nový blok odemčen!
completed = [accent]Dokončeno
techtree = Technologie
research.list = [LIGHT_GRAY]Výzkum:
@@ -235,7 +235,7 @@ classic.export.text = [accent]Mindustry[] právě mělo významně velkou aktual
quit.confirm = Jsi si jistý že chceš ukončit ?
quit.confirm.tutorial = Jste si vážně jist?\nTutoriál se dá znovu spustit v[accent] Nastavení->Hra->Spusť Tutoriál.[]
loading = [accent]Načítám...
reloading = [accent]Reloading Mods...
reloading = [accent]načítám módy ...
saving = [accent]Ukládám...
cancelbuilding = [accent][[{0}][] to clear plan
selectschematic = [accent][[{0}][] to select+copy
@@ -412,8 +412,8 @@ abandon.text = Tato zóna a všechny její zdroje připadnou nepříteli.
locked = Zamčeno
complete = [LIGHT_GRAY]Hotovo:
requirement.wave = Reach Wave {0} in {1}
requirement.core = Destroy Enemy Core in {0}
requirement.unlock = Unlock {0}
requirement.core = znič nepřátelskou základnu v {0}
requirement.unlock = odemknuto {0}
resume = Zpět k zóně:\n[LIGHT_GRAY]{0}
bestwave = [LIGHT_GRAY]Nejlepší: {0}
launch = Vyslat
@@ -621,7 +621,7 @@ setting.savecreate.name = Auto-Create Saves
setting.publichost.name = Public Game Visibility
setting.chatopacity.name = Chat Opacity
setting.lasersopacity.name = Power Laser Opacity
setting.playerchat.name = Display In-Game Chat
setting.playerchat.name = Displej v herním četu
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}[] settings...
@@ -652,12 +652,11 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Odznačit
keybind.shoot.name = Střílet
keybind.zoom_hold.name = Přiblížení-podržení
keybind.zoom.name = přiblížení
keybind.menu.name = Hlavní nabídka
keybind.pause.name = pauza
keybind.pause_building.name = Pause/Resume Building
keybind.minimap.name = Minimap
keybind.minimap.name = Minimapa
keybind.dash.name = Sprint
keybind.chat.name = Chat
keybind.player_list.name = Seznam hráčů
@@ -672,41 +671,41 @@ keybind.drop_unit.name = Zahodit jednotku
keybind.zoom_minimap.name = Přiblížit minimapu
mode.help.title = Popis módů
mode.survival.name = Survival
mode.survival.description = The normal mode. Limited resources and automatic incoming waves.
mode.survival.description = Normální mód .Limitované suroviny a automatické přepínání vln.
mode.sandbox.name = Sandbox
mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel.
mode.editor.name = Editor
mode.pvp.name = PvP
mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti.
mode.attack.name = Útok
mode.attack.description = No waves, with the goal to destroy the enemy base.
mode.attack.description = Bez vln znič nepř@telsou základnu.
mode.custom = Custom Rules
rules.infiniteresources = Infinite Resources
rules.wavetimer = Wave Timer
rules.waves = Waves
rules.infiniteresources = Nekonečno surovin
rules.wavetimer = Časovač vln
rules.waves = Wlny
rules.attack = Attack Mode
rules.enemyCheat = Infinite AI Resources
rules.unitdrops = Unit Drops
rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier
rules.unithealthmultiplier = Unit Health Multiplier
rules.playerhealthmultiplier = Player Health Multiplier
rules.playerdamagemultiplier = Player Damage Multiplier
rules.unitdamagemultiplier = Unit Damage Multiplier
rules.playerhealthmultiplier = Hráčovy životy(multiplejer)
rules.playerdamagemultiplier = Hráčův útok (multiplejer)
rules.unitdamagemultiplier = Demič jedmotek (Multiplejer)
rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles)
rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec)
rules.respawntime = Spaumovací čas:[LIGHT_GRAY] (sec)
rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec)
rules.buildcostmultiplier = Build Cost Multiplier
rules.buildspeedmultiplier = Build Speed Multiplier
rules.waitForWaveToEnd = Waves wait for enemies
rules.waitForWaveToEnd = Vllny čekají na nepřátele
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles)
rules.respawns = Max respawns per wave
rules.limitedRespawns = Limit Respawns
rules.title.waves = Waves
rules.title.waves = Vlny
rules.title.respawns = Respawns
rules.title.resourcesbuilding = Resources & Building
rules.title.player = Players
rules.title.enemy = Enemies
rules.title.unit = Units
rules.title.resourcesbuilding = surovyny & Stavby
rules.title.player = Hráči
rules.title.enemy = Nepřátelé
rules.title.unit = Jednotky
content.item.name = Předměty
content.liquid.name = Tekutiny
content.unit.name = jednotky
@@ -729,7 +728,7 @@ item.pyratite.name = Pyratite
item.metaglass.name = Tvrzené sklo
item.scrap.name = Scrap
liquid.water.name = Voda
liquid.slag.name = Slag
liquid.slag.name = Rostavené železo
liquid.oil.name = Ropa
liquid.cryofluid.name = Cryofluid
mech.alpha-mech.name = Alfa
@@ -759,41 +758,41 @@ item.radioactivity = [LIGHT_GRAY]Radioaktivita: {0}%
unit.health = [LIGHT_GRAY]Životy: {0}
unit.speed = [LIGHT_GRAY]Rychlost: {0}
mech.weapon = [LIGHT_GRAY]Zbraň: {0}
mech.health = [LIGHT_GRAY]Health: {0}
mech.health = [LIGHT_GRAY]Životy: {0}
mech.itemcapacity = [LIGHT_GRAY]Kapacita předmětů: {0}
mech.minespeed = [LIGHT_GRAY]Rychlost těžení: {0}
mech.minepower = [LIGHT_GRAY]Síla těžení: {0}
mech.ability = [LIGHT_GRAY]Schopnost: {0}
mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}%
mech.buildspeed = [LIGHT_GRAY]Rychlost stavění: {0}%
liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0}
liquid.viscosity = [LIGHT_GRAY]Viskozita: {0}
liquid.temperature = [LIGHT_GRAY]Teplota: {0}
block.sand-boulder.name = Sand Boulder
block.grass.name = Grass
block.salt.name = Salt
block.saltrocks.name = Salt Rocks
block.grass.name = Tráva
block.salt.name = sůl
block.saltrocks.name = Solný kámen
block.pebbles.name = Pebbles
block.tendrils.name = Tendrils
block.sandrocks.name = Sand Rocks
block.sandrocks.name = Písečný kámen
block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.snowrock.name = Snow Rock
block.snowrock.name = Sněhový kámen
block.snow-pine.name = Snow Pine
block.shale.name = Shale
block.shale-boulder.name = Shale Boulder
block.moss.name = Moss
block.moss.name = Mech
block.shrubs.name = Shrubs
block.spore-moss.name = Spore Moss
block.shalerocks.name = Shale Rocks
block.scrap-wall.name = Scrap Wall
block.scrap-wall-large.name = Large Scrap Wall
block.scrap-wall-huge.name = Huge Scrap Wall
block.scrap-wall-gigantic.name = Gigantic Scrap Wall
block.scrap-wall.name = Stará zeď
block.scrap-wall-large.name = Velá stará zeď
block.scrap-wall-huge.name = obří stará zeď
block.scrap-wall-gigantic.name = Gigantická stará zeď
block.thruster.name = Thruster
block.kiln.name = Kiln
block.graphite-press.name = Graphite Press
block.multi-press.name = Multi-Press
block.graphite-press.name = Graphitový lis
block.multi-press.name = Všětraný lys
block.constructing = {0} [LIGHT_GRAY](Constructing)
block.spawn.name = Nepřátelský Spawn
block.core-shard.name = Core: Shard
@@ -806,28 +805,28 @@ block.darksand-tainted-water.name = Dark Sand Tainted Water
block.tar.name = Tar
block.stone.name = Kámen
block.sand.name = Písek
block.darksand.name = Dark Sand
block.darksand.name = Černý písek
block.ice.name = Led
block.snow.name = Sníh
block.craters.name = Craters
block.sand-water.name = Sand water
block.darksand-water.name = Dark Sand Water
block.craters.name = Krátery
block.sand-water.name = Písková voda
block.darksand-water.name = Černá písková voda
block.char.name = Char
block.holostone.name = Holo stone
block.ice-snow.name = Ice Snow
block.rocks.name = Rocks
block.icerocks.name = Ice rocks
block.snowrocks.name = Snow Rocks
block.rocks.name = Kameny
block.icerocks.name = Ledové kameny
block.snowrocks.name = Sněhové kameny
block.dunerocks.name = Dune Rocks
block.pine.name = Pine
block.white-tree-dead.name = White Tree Dead
block.white-tree.name = White Tree
block.spore-cluster.name = Spore Cluster
block.metal-floor.name = Metal Floor
block.metal-floor-2.name = Metal Floor 2
block.metal-floor-3.name = Metal Floor 3
block.metal-floor-5.name = Metal Floor 5
block.metal-floor-damaged.name = Metal Floor Damaged
block.metal-floor.name = Železná podlaha
block.metal-floor-2.name = Železná Podlaha
block.metal-floor-3.name = železná Podlaha3
block.metal-floor-5.name = Železná podlaha 5
block.metal-floor-damaged.name = Rozbytáb
block.dark-panel-1.name = Dark Panel 1
block.dark-panel-2.name = Dark Panel 2
block.dark-panel-3.name = Dark Panel 3
@@ -841,10 +840,10 @@ block.magmarock.name = Magma Rock
block.cliffs.name = Cliffs
block.copper-wall.name = Měděná zeď
block.copper-wall-large.name = Velká měděná zeď
block.titanium-wall.name = Titanium Wall
block.titanium-wall-large.name = Large Titanium Wall
block.plastanium-wall.name = Plastanium Wall
block.plastanium-wall-large.name = Large Plastanium Wall
block.titanium-wall.name = Titanium Zeď
block.titanium-wall-large.name = Velká Titanium Zeď
block.plastanium-wall.name = Plastanium Zeď
block.plastanium-wall-large.name = Velká Plastanium Zeď
block.phase-wall.name = Fázová stěna
block.phase-wall-large.name = Velká fázová stěna
block.thorium-wall.name = Thoriová stěna
@@ -918,7 +917,7 @@ block.blast-mixer.name = Výbušninový mixér
block.solar-panel.name = Solární panel
block.solar-panel-large.name = Velký solární panel
block.oil-extractor.name = Ropný Extraktor
block.command-center.name = Command Center
block.command-center.name = Řídící středisko
block.draug-factory.name = Draug Miner Drone Factory
block.spirit-factory.name = Továrna na Spirit Drony
block.phantom-factory.name = Továrna na Fantom Drony
@@ -960,7 +959,7 @@ block.container.name = Kontejnér
block.launch-pad.name = Launch Pad
block.launch-pad-large.name = Large Launch Pad
team.blue.name = modrá
team.crux.name = red
team.crux.name = červená
team.sharded.name = orange
team.orange.name = oranžová
team.derelict.name = derelict
@@ -1004,13 +1003,13 @@ tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core fo
tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button.
item.copper.description = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků.
item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin.
item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage.
item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation.
item.metaglass.description = Vemi důležitá suočást všeho so se týká tekutin
item.graphite.description = Stlačený uhlík nedílná součást většiny infrastruktur
item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin.
item.coal.description = Běžné a snadno dostupné palivo, pochází z Ostravy.
item.titanium.description = Vzácný, velice lehký kov, používá se rozsáhle v trasportu tekutin, vrtech a letounech.
item.thorium.description = Hustý, radioaktivní materiál, používá se jako strukturální podpora a jako nuklearní palivo.
item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals.
item.scrap.description = Staré železo které se dá přepracovat na grafit měď olovo titánium a písek
item.silicon.description = Extrémně užitečný polovodič, aplikuje se v solárních panelech a v komplexní elektronice.
item.plastanium.description = Lehký, kujný materiál, používá se v pokročilém letectví a jako fragmentační střelivo.
item.phase-fabric.description = Skoro beztížná substance používaná v pokročilé elektronice a v sebeopravné technologii.
@@ -1019,7 +1018,7 @@ item.spore-pod.description = Used for conversion into oil, explosives and fuel.
item.blast-compound.description = Těkavá směs používaná v bombácha a výbušninách. Dá se spalovat ale jako palivo se nedoporučuje.
item.pyratite.description = Extrémně vznětlivá substance, používá ve vznětovém střelivu.
liquid.water.description = Nejčastěji se používá ke chlazení a zpracování odpadu.
liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon.
liquid.slag.description = Rostavený scrap pou žívá se k vírobě olova mědi a grafitu.
liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení.
liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení.
mech.alpha-mech.description = Standartní mech. Má slušnou rychlost a poškození; Může vytvořit až 3 drony Pro zvýšenou ofenzivní způsobilost.

View File

@@ -3,7 +3,7 @@ credits = Danksagungen
contributors = Übersetzer und Mitwirkende
discord = Trete dem Mindustry Discord bei!
link.discord.description = Der offizielle Mindustry Discord-Chatroom
link.reddit.description = The Mindustry subreddit
link.reddit.description = Der Mindustry Subreddit
link.github.description = Quellcode des Spiels
link.changelog.description = Liste der Änderungen
link.dev-builds.description = Entwicklungs-Builds (instabil)
@@ -68,7 +68,7 @@ position = Position
close = Schließen
website = Website
quit = Verlassen
save.quit = Save & Quit
save.quit = Speichern & Beenden
maps = Karten
maps.browse = Browse Maps
continue = Weiter
@@ -87,7 +87,7 @@ mods = Mods
mods.none = [LIGHT_GRAY]No mods found!
mods.guide = Modding Guide
mods.report = Report Bug
mods.openfolder = Open Mod Folder
mods.openfolder = Mod Verzeichnis öffnen
mod.enabled = [lightgray]Enabled
mod.disabled = [scarlet]Disabled
mod.disable = Disable
@@ -97,8 +97,8 @@ mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[ligh
mod.enable = Enable
mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Reload Required
mod.import = Import Mod
mod.import.github = Import GitHub Mod
mod.import = Mod importieren
mod.import.github = GitHub Mod importieren
mod.remove.confirm = This mod will be deleted.
mod.author = [LIGHT_GRAY]Author:[] {0}
mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0}
@@ -133,16 +133,16 @@ server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Acc
server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter.
server.kicked.gameover = Game Over!
server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[]
host.info = Der [accent]host[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stell sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat.
join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemand per IP verbinden willst musst du den Host nach seiner IP fragen.
host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du anderen die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat.
join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemandem per IP verbinden willst, musst du den Host nach seiner IP fragen.
hostserver = Server hosten
invitefriends = Invite Friends
hostserver.mobile = Host\nSpiel
host = Host
host = Server hosten
hosting = [accent] Server wird geöffnet ...
hosts.refresh = Aktualisieren
hosts.discovering = Suche nach LAN-Spielen
hosts.discovering.any = Discovering games
hosts.discovering.any = Suche nach Spielen
server.refreshing = Server wird aktualisiert
hosts.none = [lightgray] Keine LAN-Spiele gefunden!
host.invalid = [scarlet] Kann keine Verbindung zum Host herstellen.
@@ -225,15 +225,15 @@ cancel = Abbruch
openlink = Link öffnen
copylink = Kopiere Link
back = Zurück
data.export = Export Data
data.import = Import Data
data.export = Daten exportieren
data.import = Daten importieren
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.
classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
quit.confirm = Willst du wirklich aufhören?
quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[]
quit.confirm.tutorial = Willst du das Tutorial wirklich abbrechen?\nDu kannst es unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen.
loading = [accent]Wird geladen...
reloading = [accent]Reloading Mods...
saving = [accent]Speichere...
@@ -326,14 +326,14 @@ editor.saved = Gespeichert!
editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten Info[] Menu.
editor.save.overwrite = Deine Karte überschreibt eine built-in Karte! Wähle einen anderen Karten Namen im [accent]'Karten info'[] Menu.
editor.import.exists = [scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits!
editor.import = Import...
editor.import = Importieren...
editor.importmap = Importiere Karte
editor.importmap.description = Importiere von einer bestehenden Karte
editor.importfile = Importiere Datei
editor.importfile.description = Importiere aus einer Karten Datei
editor.importimage = Importiere Terrain Bild
editor.importimage.description = Importiere aus einer Terrain Bild Datei
editor.export = Export...
editor.export = Exportieren...
editor.exportfile = Export in Datei
editor.exportfile.description = Exportiere in eine Karten Datei
editor.exportimage = Export in Terrain Bild Datei
@@ -404,7 +404,7 @@ ping = Ping: {0}ms
language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv wird.
settings = Einstellungen
tutorial = Tutorial
tutorial.retake = Re-Take Tutorial
tutorial.retake = Tutorial wiederholen
editor = Editor
mapeditor = Karten Editor
abandon = Aufgeben
@@ -424,8 +424,8 @@ launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kanns
launch.skip.confirm = If you skip now, you will not be able to launch until later waves.
uncover = Freischalten
configure = Startitems festlegen
bannedblocks = Banned Blocks
addall = Add All
bannedblocks = Gesperrte Blöcke
addall = Alle hinzufügen
configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können.
configure.invalid = Amount must be a number between 0 and {0}.
zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet.
@@ -476,26 +476,26 @@ zone.fungalPass.description = A transition area between high mountains and lower
zone.impact0078.description = <Beschreibung hier einfügen>
zone.crags.description = <Beschreibung hier einfügen>
settings.language = Sprache
settings.data = Game Data
settings.data = Spieldaten
settings.reset = Auf Standard zurücksetzen
settings.rebind = Zuweisen
settings.controls = Steuerung
settings.game = Spiel
settings.sound = Audio
settings.graphics = Grafiken
settings.graphics = Grafik
settings.cleardata = Spieldaten zurücksetzen...
settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden!
settings.clearall.confirm = [scarlet]Warnung![]\nDas wird jegliche Spieldaten zurücksetzen inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Nachdem du 'OK' drückst wird alles zurückgesetzt und das Spiel schließt sich automatisch.
paused = Pausiert
clear = Clear
clear = Leeren
banned = [scarlet]Banned
yes = Ja
no = Nein
info.title = [accent]Info
error.title = [crimson] Ein Fehler ist aufgetreten
error.crashtitle = Ein Fehler ist aufgetreten!
blocks.input = Input
blocks.output = Output
blocks.input = Eingang
blocks.output = Ausgang
blocks.booster = Verstärkung
block.unknown = [LIGHT_GRAY]???
blocks.powercapacity = Kapazität
@@ -524,12 +524,12 @@ blocks.boosteffect = Verstärkungseffekt
blocks.maxunits = Max aktive Einheiten
blocks.health = Lebenspunkte
blocks.buildtime = Baudauer
blocks.buildcost = Build Cost
blocks.buildcost = Baukosten
blocks.inaccuracy = Ungenauigkeit
blocks.shots = Schüsse
blocks.reload = Schüsse/Sekunde
blocks.ammo = Munition
bar.drilltierreq = Better Drill Required
bar.drilltierreq = besserer Bohrer benötigt
bar.drillspeed = Bohrgeschwindigkeit: {0}/s
bar.pumpspeed = Pump Speed: {0}/s
bar.efficiency = Effizienz: {0}%
@@ -554,7 +554,7 @@ bullet.knockback = [stat]{0}[lightgray] zurückstoßend
bullet.freezing = [stat]gefrierend
bullet.tarred = [stat]geteert
bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator
bullet.reload = [stat]{0}[lightgray]x neu laden
bullet.reload = [stat]{0}[lightgray]x Feuerrate
unit.blocks = Blöcke
unit.powersecond = Stromeinheiten/Sekunde
unit.liquidsecond = Flüssigkeitseinheiten/Sekunde
@@ -599,25 +599,28 @@ setting.difficulty.insane = Unmöglich
setting.difficulty.name = Schwierigkeit
setting.screenshake.name = Bildschirmwackeln
setting.effects.name = Effekte anzeigen
setting.destroyedblocks.name = Display Destroyed Blocks
setting.conveyorpathfinding.name = Conveyor Placement Pathfinding
setting.destroyedblocks.name = Zerstörte Blöcke anzeigen
setting.conveyorpathfinding.name = Automatische Wegfindung beim Bau von Förderbändern
setting.sensitivity.name = Controller-Empfindlichkeit
setting.saveinterval.name = Autosave Häufigkeit
setting.seconds = {0} Sekunden
setting.blockselecttimeout.name = Block Auswahl Timeout
setting.milliseconds = {0} Millisekunden
setting.fullscreen.name = Vollbild
setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich)
setting.fps.name = Zeige FPS
setting.blockselectkeys.name = Block Shortcuts anzeigen
setting.vsync.name = VSync
setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen)
setting.minimap.name = Zeige die Minimap
setting.position.name = Show Player Position
setting.position.name = Spieler-Position anzeigen
setting.musicvol.name = Musiklautstärke
setting.ambientvol.name = Ambient Volume
setting.mutemusic.name = Musik stummschalten
setting.sfxvol.name = Audioeffekt-Lautstärke
setting.mutesound.name = Audioeffekte stummschalten
setting.crashreport.name = Anonyme Absturzberichte senden
setting.savecreate.name = Auto-Create Saves
setting.savecreate.name = Automatisch Speicherstände anlegen
setting.publichost.name = Public Game Visibility
setting.chatopacity.name = Chat Deckkraft
setting.lasersopacity.name = Power Laser Opacity
@@ -635,24 +638,40 @@ category.multiplayer.name = Mehrspieler
command.attack = Angreifen
command.rally = Rally
command.retreat = Rückzug
placement.blockselectkeys = \n[lightgray]Shortcut: [{0},
keybind.clear_building.name = Clear Building
keybind.press = Drücke eine Taste...
keybind.press.axis = Drücke eine Taste oder bewege eine Achse...
keybind.screenshot.name = Karten Screenshot
keybind.move_x.name = X-Achse
keybind.move_y.name = Y-Achse
keybind.schematic_select.name = Select Region
keybind.schematic_select.name = Bereich auswählen
keybind.schematic_menu.name = Schematic Menu
keybind.schematic_flip_x.name = Flip Schematic X
keybind.schematic_flip_y.name = Flip Schematic Y
keybind.fullscreen.name = Toggle Fullscreen
keybind.category_prev.name = Vorige Kategorie
keybind.category_next.name = Nächste Kategorie
keybind.block_select_left.name = Block-Auswahl nach links
keybind.block_select_right.name = Block-Auswahl nach rechts
keybind.block_select_up.name = Block-Auswahl nach oben
keybind.block_select_down.name = Block-Auswahl nach unten
keybind.block_select_01.name = Kategorie/Block 1 auswählen
keybind.block_select_02.name = Kategorie/Block 2 auswählen
keybind.block_select_03.name = Kategorie/Block 3 auswählen
keybind.block_select_04.name = Kategorie/Block 4 auswählen
keybind.block_select_05.name = Kategorie/Block 5 auswählen
keybind.block_select_06.name = Kategorie/Block 6 auswählen
keybind.block_select_07.name = Kategorie/Block 7 auswählen
keybind.block_select_08.name = Kategorie/Block 8 auswählen
keybind.block_select_09.name = Kategorie/Block 9 auswählen
keybind.block_select_10.name = Kategorie/Block 10 auswählen
keybind.fullscreen.name = Vollbild umschalten
keybind.select.name = Auswählen/Schießen
keybind.diagonal_placement.name = Diagonal platzieren
keybind.pick.name = Block Auswählen
keybind.break_block.name = Block zerstören
keybind.deselect.name = Auswahl aufheben
keybind.shoot.name = Schießen
keybind.zoom_hold.name = Zoom halten
keybind.zoom.name = Zoomen
keybind.menu.name = Menü
keybind.pause.name = Pause
@@ -710,7 +729,7 @@ rules.title.unit = Einheiten
content.item.name = Materialien
content.liquid.name = Flüssigkeiten
content.unit.name = Einheiten
content.block.name = Blocks
content.block.name = Blöcke
content.mech.name = Mechs
item.copper.name = Kupfer
item.lead.name = Blei
@@ -753,6 +772,7 @@ mech.trident-ship.name = Trident
mech.trident-ship.weapon = Bombenschacht
mech.glaive-ship.name = Glaive
mech.glaive-ship.weapon = Flammen-Mehrlader
item.corestorable = [lightgray]Im Kern speicherbar: {0}
item.explosiveness = [LIGHT_GRAY]Explosivität: {0}
item.flammability = [LIGHT_GRAY]Entflammbarkeit: {0}
item.radioactivity = [LIGHT_GRAY]Radioaktivität: {0}

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Destruir Bloque
keybind.deselect.name = Deseleccionar
keybind.shoot.name = Disparar
keybind.zoom_hold.name = Mantener Zoom
keybind.zoom.name = Zoom
keybind.menu.name = Menú
keybind.pause.name = Pausa

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Vali blokk
keybind.break_block.name = Hävita blokk
keybind.deselect.name = Tühista valik
keybind.shoot.name = Tulista
keybind.zoom_hold.name = Suumimise režiim
keybind.zoom.name = Muuda suumi
keybind.menu.name = Menüü
keybind.pause.name = Paus

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Jaso blokea
keybind.break_block.name = Apurtu blokea
keybind.deselect.name = Deshautatu
keybind.shoot.name = Tirokatu
keybind.zoom_hold.name = Zoom mantenduz
keybind.zoom.name = Zoom
keybind.menu.name = Menua
keybind.pause.name = Pausatu

View File

@@ -547,7 +547,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Deselect
keybind.shoot.name = Shoot
keybind.zoom_hold.name = Zoom Hold
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause

View File

@@ -99,6 +99,7 @@ mod.enabled = [lightgray]Activé
mod.disabled = [scarlet]Désactivé
mod.disable = Désactiver
mod.delete.error = Unable to delete mod. File may be in use.
mod.requiresversion = [scarlet]Version du jeu requise : [accent]{0}
mod.missingdependencies = [scarlet]Dépendances manquantes: {0}
mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes:[accent] {1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé.
mod.enable = Activer
@@ -496,6 +497,7 @@ settings.language = Langue
settings.data = Données du Jeu
settings.reset = Valeurs par Défaut
settings.rebind = Réattribuer
settings.resetKey = Réinitialiser
settings.controls = Contrôles
settings.game = Jeu
settings.sound = Son
@@ -589,6 +591,8 @@ unit.persecond = /sec
unit.timesspeed = x vitesse
unit.percent = %
unit.items = objets
unit.thousands = k
unit.millions = mil
category.general = Général
category.power = Énergie
category.liquids = Liquides
@@ -698,7 +702,6 @@ keybind.pick.name = Choisir un bloc
keybind.break_block.name = Supprimer un bloc
keybind.deselect.name = Désélectionner
keybind.shoot.name = Tirer
keybind.zoom_hold.name = Maintenir pour zoomer
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause
@@ -1084,7 +1087,7 @@ mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poign
mech.delta-mech.description = Un mécha rapide, avec une armure légère, conçu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques.
mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence.
mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts.
mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger. Il a néanmoins peu d'attaque et une faible vitesse de minage.
mech.dart-ship.description = Le vaisseau standard. Il est raisonnablement rapide, léger et possède une vitesse de minage rapide. Néanmoins, ses capacités d'attaque sont faibles.
mech.javelin-ship.description = Un vaisseau de frappe éclair qui, bien que lent au départ, peut accélérer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles.
mech.trident-ship.description = Un bombardier lourd, conçu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé.
mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Équipé avec un fusil automatique à munitions incendiaires. Est très maniable.

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Choisir un bloc
keybind.break_block.name = Supprimer un bloc
keybind.deselect.name = Déselectionner
keybind.shoot.name = Tirer
keybind.zoom_hold.name = Tenir le zoom
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Memilih Blok
keybind.break_block.name = Menghancurkan Blok
keybind.deselect.name = Batal Memilih
keybind.shoot.name = Menembak
keybind.zoom_hold.name = Tahan Mode Zoom
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Jeda

File diff suppressed because it is too large Load Diff

View File

@@ -652,7 +652,6 @@ keybind.pick.name = ブロックの選択
keybind.break_block.name = ブロックの破壊
keybind.deselect.name = 選択解除
keybind.shoot.name = ショット
keybind.zoom_hold.name = 長押しズーム
keybind.zoom.name = ズーム
keybind.menu.name = メニュー
keybind.pause.name = ポーズ

View File

@@ -26,6 +26,7 @@ load.image = 사진
load.content = 컨텐츠
load.system = 시스템
load.mod = 모드
load.scripts = 스크립트
schematic = 설계도
schematic.add = 설계도 저장하기
@@ -95,10 +96,11 @@ mods.none = [LIGHT_GRAY]추가한 모드가 없습니다!
mods.guide = 모드 가이드
mods.report = 버그 신고
mods.openfolder = 모드 폴더 열기
mod.enabled = [firebrick]활성화
mod.disabled = [lightgray]비활성화
mod.enabled = [lightgray]활성화
mod.disabled = [scarlet]비활성화
mod.disable = 비활성화
mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다.
mod.requiresversion = [scarlet]게임의 버전이 낮아 모드를 활성화할 수 없습니다!\n[scarlet]요구되는 게임 버전 : [accent]{0}
mod.missingdependencies = [scarlet]의존되는 모드: {0}
mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 :[accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다.
mod.enable = 활성화
@@ -106,11 +108,13 @@ mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종
mod.reloadrequired = [scarlet]새로고침 예정됨
mod.import = 모드 추가
mod.import.github = 깃허브 모드 추가
mod.item.remove = 이것은 모드[accent] '{0}'[]의 자원입니다. 이 자원을 삭제하려면, 이 모드를 제거해야합니다.
mod.remove.confirm = 이 모드를 삭제하시겠습니까?
mod.author = [LIGHT_GRAY]제작자 : [] {0}
mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0}
mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요.
mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오.
mod.scripts.unsupported = 당신의 기기는 모드스크립트를 지원하지 않습니다. 모드의 일부 기능이 작동하지 않을 수 있습니다.
about.button = 정보
name = 이름 :
@@ -496,6 +500,7 @@ settings.language = 언어
settings.data = 게임 데이터
settings.reset = 설정 초기화
settings.rebind = 키 재설정
settings.resetKey = 키 설정
settings.controls = 조작
settings.game = 게임
settings.sound = 소리
@@ -589,6 +594,8 @@ unit.persecond = /초
unit.timesspeed = x 배
unit.percent = %
unit.items = 자원
unit.thousands =
unit.millions = 백만
category.general = 일반
category.power = 전력
category.liquids = 액체
@@ -623,7 +630,7 @@ setting.difficulty.name = 난이도 :
setting.screenshake.name = 화면 흔들기
setting.effects.name = 화면 효과
setting.destroyedblocks.name = 부서진 블럭 표시
setting.conveyorpathfinding.name = 컨베이어 설치 보조 기능
setting.conveyorpathfinding.name = 교차기 자동 설치
setting.sensitivity.name = 컨트롤러 감도
setting.saveinterval.name = 저장 간격
setting.seconds = {0} 초
@@ -644,7 +651,7 @@ setting.sfxvol.name = 효과음 크기
setting.mutesound.name = 소리 끄기
setting.crashreport.name = 익명으로 오류 보고서 자동 전송
setting.savecreate.name = 자동 저장 활성화
setting.publichost.name = 공개 서버 보이기
setting.publichost.name = 스팀 공개 서버 보이기
setting.chatopacity.name = 채팅 투명도
setting.lasersopacity.name = 전력 레이저 밝기
setting.playerchat.name = 채팅 말풍선 표시
@@ -676,10 +683,10 @@ keybind.schematic_flip_x.name = 설계도 X축 뒤집기
keybind.schematic_flip_y.name = 설계도 Y축 뒤집기
keybind.category_prev.name = 이전 목록
keybind.category_next.name = 다음 목록
keybind.block_select_left.name = 블럭 Select Left
keybind.block_select_right.name = 블럭 Select Right
keybind.block_select_up.name = 블럭 Select Up
keybind.block_select_down.name = 블럭 Select Down
keybind.block_select_left.name = 블럭 왼쪽 선택
keybind.block_select_right.name = 블럭 오른쪽 선택
keybind.block_select_up.name = 블럭 위쪽 선택
keybind.block_select_down.name = 블럭 아래쪽 선택
keybind.block_select_01.name = 카테고리/블럭 선택 1
keybind.block_select_02.name = 카테고리/블럭 선택 2
keybind.block_select_03.name = 카테고리/블럭 선택 3
@@ -697,7 +704,6 @@ keybind.pick.name = 블록 선택
keybind.break_block.name = 블록 파괴
keybind.deselect.name = 선택해제
keybind.shoot.name = 사격
keybind.zoom_hold.name = 길게 확대
keybind.zoom.name = 확대
keybind.menu.name = 메뉴
keybind.pause.name = 일시중지
@@ -804,6 +810,7 @@ mech.trident-ship.name = 트라이던트
mech.trident-ship.weapon = 폭탄 저장고
mech.glaive-ship.name = 글레이브
mech.glaive-ship.weapon = 중무장 인화성 소총
item.corestorable = [lightgray]코어 잔여 저장공간: {0}
item.explosiveness = [LIGHT_GRAY]폭발성 : {0}
item.flammability = [LIGHT_GRAY]인화성 : {0}
item.radioactivity = [LIGHT_GRAY]방사능 : {0}
@@ -986,7 +993,7 @@ block.fortress-factory.name = 포트리스 공장
block.revenant-factory.name = 망령 전함 공장
block.repair-point.name = 수리 지점
block.pulse-conduit.name = 펄스 파이프
block.plated-conduit.name = 도금된
block.plated-conduit.name = 도금된 파이프
block.phase-conduit.name = 메타 파이프
block.liquid-router.name = 액체 분배기
block.liquid-tank.name = 물탱크

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Deselect
keybind.shoot.name = Shoot
keybind.zoom_hold.name = Zoom Hold
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause

View File

@@ -10,7 +10,8 @@ link.dev-builds.description = Onstabiele versies
link.trello.description = Officiële Trello voor geplande toevoegingen.
link.itch.io.description = Itch.io pagina met de PC downloads en online versie
link.google-play.description = Mindustry op Google Play
link.wiki.description = Officiël Mindustry wiki
link.f-droid.description = F-Droid catalogus
link.wiki.description = Officiële Mindustry-wiki
linkfail = Openen van link mislukt!\nDe link is gekopiëerd naar je klembord.
screenshot = Locatie screenshot: {0}
screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een screenshot te kunnen maken.
@@ -20,9 +21,9 @@ highscore = [accent]Nieuw record!
copied = Gekopieerd.
load.sound = Geluiden
load.map = Kaarten
load.image = Images
load.content = Content
load.system = System
load.image = Afbeeldingen
load.content = Inhoud
load.system = Systeem
load.mod = Mods
schematic = Blauwdruk
schematic.add = Blauwdruk Opslaan...
@@ -67,22 +68,22 @@ minimap = Kaartje
position = Positie
close = Sluit
website = Website
quit = Verlaat
save.quit = Save & Quit
quit = Verlaten
save.quit = Opslaan & Verlaten
maps = Kaarten
maps.browse = Browse Maps
maps.browse = Bekijk Kaarten
continue = Ga verder
maps.none = [LIGHT_GRAY]Geen kaarten gevonden!
invalid = Invalid
preparingconfig = Config Voorbereiden
preparingcontent = Content Voorbereiden
uploadingcontent = Content Uploaden
invalid = Ongeldig
preparingconfig = Configuratie Voorbereiden
preparingcontent = Inhoud Voorbereiden
uploadingcontent = Inhoud Uploaden
uploadingpreviewfile = Voorbeeldbestand Uploaden
committingchanges = Veranderingen Toepassen
done = Klaar
feature.unsupported = Uw apparaat ondersteunt deze functie niet.
mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord.
mods.alpha = [accent](Alpha)
mods.alphainfo = Mods zijn nog in alfa en [scarlet] kunnen zeer onstabiel zijn[].\nMeld problemen die je ondervindt op de Mindustry Github of Discord.
mods.alpha = [accent](Alfa)
mods = Mods
mods.none = [LIGHT_GRAY]Geen mods gevonden!
mods.guide = Handleiding tot Modding
@@ -93,8 +94,8 @@ mod.disabled = [scarlet]Uitgeschakeld
mod.disable = Schakel uit
mod.delete.error = Kan mod niet verwijderen. Bestand is mogelijk in gebruik.
mod.missingdependencies = [scarlet]Missing dependencies: {0}
mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled.
mod.enable = Enable
mod.nowdisabled = [scarlet]De volgende vereisten ontbreken voor mod '{0}':[accent] {1}\n[lightgray]Deze mods moeten eerst gedownload worden.\nDeze mod wordt automatisch uitgeschakeld.
mod.enable = Schakel in
mod.requiresrestart = The game will now close to apply the mod changes.
mod.reloadrequired = [scarlet]Herladen Vereist
mod.import = Importeer Mod
@@ -102,9 +103,9 @@ mod.import.github = Importeer GitHub Mod
mod.remove.confirm = Deze mod zal worden verwijderd.
mod.author = [LIGHT_GRAY]Auteur:[] {0}
mod.missing = Dit opslagbestand bevat mods die zijn geupdate of recentelijk zijn verwijderd. Uw opslagbestand kan beschadigd geraken. Bent u zeker dat u wil verdergaan?\n[lightgray]Mods:\n{0}
mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again.
mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods.
about.button = Extra info
mod.preview.missing = Voordat je de mod publiceert moet je een afbeelding voor de voorvertoning toevoegen.\nPlaats een afbeelding met de naam[accent] preview.png[] in de modfolder.
mod.folder.missing = Mods kunnen enkel gepubliceerd worden in foldervorm.\nOm een mod in foldervorm te zetten exporteer je het modbestand uit de zipfile en verwijder je de oude zipfile. Herlaad vervolgens je mods of herstart het spel.
about.button = Over
name = Naam:
noname = Kies eerst[accent] een naam[].
filename = Bestandsnaam:
@@ -118,42 +119,42 @@ players = {0} spelers online
players.single = {0} speler online
server.closing = [accent]Server wordt gesloten...
server.kicked.kick = Je bent uit de server gegooid!
server.kicked.whitelist = You are not whitelisted here.
server.kicked.whitelist = Je bent niet toegestaan om met deze server te verbinden. (Whitelist)
server.kicked.serverClose = Server gesloten.
server.kicked.vote = You have been vote-kicked. Goodbye.
server.kicked.vote = Je bent uit de server gegooid na een stemming!
server.kicked.clientOutdated = Verouderde versie! Update Mindustry!
server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten!
server.kicked.banned = Je bent verbannen van deze 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 = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt
server.kicked.typeMismatch = Deze server is niet compatibel met jouw Mindustry build type.
server.kicked.playerLimit = De server is vol, wacht voor een plekje.
server.kicked.recentKick = Je bent zonet van de server gegooid.\nWacht even voor je weer verbindt
server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server.
server.kicked.nameEmpty = Je gekozen naam is ongeldig.
server.kicked.idInUse = Je bent al verbonden met de server! Verbinden met 2 clients tegelijk is verboden.
server.kicked.customClient = Deze server ondersteunt geen aangepaste versies (mods). Download een officiële versie.
server.kicked.gameover = Game over!
server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[]
host.info = Ook De [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen.
server.versions = Jouw versie:[accent] {0}[]\nServerversie:[accent] {1}[]
host.info = Ook de [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen.
join.info = Hier kan je een [accent]server IP[] invullen waarmee je wil verbinden. Je kan hier ook verbinden met servers op je [accent]lokale netwerk[]. LAN en WAN multiplayer wordt ondersteund.\n\n[LIGHT_GRAY]Belangrijk: er is geen automatische globale server lijst; als je met iemand wil verbinden via een IP adres moet je zijn/haar IP adres vragen.
hostserver = Host Game
invitefriends = Invite Friends
hostserver.mobile = Host\nGame
host = Host
hostserver = Open server voor LAN
invitefriends = Nodig vrienden uit.
hostserver.mobile = Open\nServer
host = Open server
hosting = [accent]De server wordt geopend...
hosts.refresh = Herlaad
hosts.discovering = LAN games worden gezocht
hosts.discovering.any = Discovering games
hosts.discovering.any = Games worden gezocht
server.refreshing = De server wordt herladen
hosts.none = [lightgray]Geen games op je lokale netwerk gevonden.
host.invalid = [scarlet]Kan niet verbinden met de host (server).
trace = Zoeken speler
trace.playername = Naam speler: [accent]{0}
trace = Spelersinformatie
trace.playername = Naam: [accent]{0}
trace.ip = IP: [accent]{0}
trace.id = Uniek ID: [accent]{0}
trace.mobile = Mobile Client: [accent]{0}
trace.id = Unieke ID: [accent]{0}
trace.mobile = Mobiele Client: [accent]{0}
trace.modclient = Aangepaste Client: [accent]{0}
invalidid = Ongeldig client ID! Verstuur een bug report!
server.bans = Verbannen
invalidid = Ongeldige client ID! Verstuur een bug report!
server.bans = Verbanningen
server.bans.none = Geen verbannen spelers gevonden!
server.admins = Administrators
server.admins.none = Geen Administrators gevonden!
@@ -164,29 +165,29 @@ server.outdated = [crimson]Verouderde Server![]
server.outdated.client = [crimson]Verouderde Client![]
server.version = [lightgray]Versie: {0} {1}
server.custombuild = [yellow]Aangepaste versie
confirmban = Ben je zeker dat je deze speler wil verbannen?
confirmkick = Ben je zeker dat je deze speler van de server wil gooien?
confirmvotekick = Are you sure you want to vote-kick this player?
confirmunban = Ben je zeker dat je de verbanning ongedaan wil maken?
confirmadmin = Ben je zeker dat je deze speler administrator wil maken?
confirmunadmin = Ben je zeker dat je de Administrator status van deze speler ongedaan wilt maken?
confirmban = Ben je zeker dat je deze speler wilt verbannen?
confirmkick = Ben je zeker dat je deze speler van de server wilt gooien?
confirmvotekick = Ben je zeker dat je een stemming wilt starten om deze speler uit de server to gooien?
confirmunban = Ben je zeker dat je de verbanning wilt opheffen?
confirmadmin = Ben je zeker dat je deze speler administrator wilt maken?
confirmunadmin = Ben je zeker dat je de administratorstatus van deze speler wilt intrekken?
joingame.title = Verbinden met server
joingame.ip = IP adres:
disconnect = Verbinding verbroken.
disconnect.error = Connection error.
disconnect.closed = Connection closed.
disconnect.timeout = Timed out.
disconnect.data = Laden map data mislukt!
cantconnect = Unable to join game ([accent]{0}[]).
disconnect.error = Verbindingsfout.
disconnect.closed = Verbinding afgesloten.
disconnect.timeout = Het duurde te lang voordat de server antwoordde.
disconnect.data = Laden van mapdata mislukt!
cantconnect = Kon niet tot het spel toetreden. ([accent]{0}[]).
connecting = [accent]Verbinden...
connecting.data = [accent]Laden map data...
server.port = Poort:
server.addressinuse = Dit adres wordt al gebruikt!
server.invalidport = Ongeldige poort!
server.error = [crimson]Error hosting server: [accent]{0}
server.error = [crimson]Fout bij het openen van de server: [accent]{0}
save.new = Nieuwe save
save.overwrite = Ben je zeker dat je deze save\nwil overschrijven?
overwrite = Overschrijf
save.overwrite = Ben je zeker dat je deze save\nwilt overschrijven?
overwrite = Vervang
save.none = Geen saves gevonden!
saveload = [accent]Opslaan...
savefail = Opslaan mislukt!
@@ -197,27 +198,27 @@ save.import.invalid = [accent]Deze save is ongeldig!
save.import.fail = [crimson]Save importeren mislukt: [accent]{0}
save.export.fail = [crimson]Save exporteren mislukt: [accent]{0}
save.import = Importeer Save
save.newslot = Save naam:
save.newslot = Naam van de save:
save.rename = Naam wijzigen
save.rename.text = Nieuwe naam:
selectslot = Selecteer een save.
slot = [accent]Slot {0}
slot = [accent]Plaats {0}
editmessage = Edit Message
save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug.
empty = <empty>
save.corrupted = [accent]Het savebestand is corrupt of ongeldig.\nAls je zonet je spel geupdatet hebt is dit waarschijnlijk een verandering in de savestructuur en dus[scarlet] geen[] bug.
empty = <leeg>
on = Aan
off = Uit
save.autosave = Autosave: {0}
save.map = Map: {0}
save.wave = Golf {0}
save.mode = Gamemode: {0}
save.date = Last Saved: {0}
save.mode = Spelmodus: {0}
save.date = Laatste save: {0}
save.playtime = Playtime: {0}
warning = Waarschuwing.
confirm = Bevestig
delete = Verwijder
view.workshop = View In Workshop
workshop.listing = Edit Workshop Listing
view.workshop = Bekijk In Workshop
workshop.listing = Bewerk Workshop-Publicatie
ok = OK
open = Open
customize = Pas aan
@@ -225,40 +226,40 @@ cancel = Annuleer
openlink = Open Link
copylink = Kopiëer Link
back = Terug
data.export = Export Data
data.import = Import Data
data.exported = Data exported.
data.invalid = This isn't valid game data.
data.export = Exporteer Data
data.import = Importeer Data
data.exported = Data geëxporteerd.
data.invalid = Dit is geen geldige speldata.
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.
classic.export = Export Classic Data
classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app?
classic.export = Exporteer Classic-Data
classic.export.text = [accent]Mindustry[] heeft een grote update gehad.\nClassic (v3.5 build 40) save of map data is teruggevonden. Wil je deze data exporteren naar je de home-folder van je telefoon voor gebruik in de Mindustry-Classic app?
quit.confirm = Weet je zeker dat je wilt stoppen?
quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[]
quit.confirm.tutorial = Ben je zeker dat je nu weet wat je doet?\nDe tutorial kan opnieuw gestart worden via[accent] Instellingen->Spel->Herneem Tutorial.[]
loading = [accent]Aan het laden...
reloading = [accent]Reloading Mods...
reloading = [accent]Mods Herladen...
saving = [accent]Aan het opslaan...
cancelbuilding = [accent][[{0}][] to clear plan
selectschematic = [accent][[{0}][] to select+copy
pausebuilding = [accent][[{0}][] to pause building
resumebuilding = [scarlet][[{0}][] to resume building
cancelbuilding = [accent][[{0}][] om het plan te annuleren
selectschematic = [accent][[{0}][] om te selecter+kopieren
pausebuilding = [accent][[{0}][] om het bouwen te pauseren
resumebuilding = [scarlet][[{0}][] om verder te gaan met bouwen
wave = [accent]Golf {0}
wave.waiting = [LIGHT_GRAY]Golf in {0}
wave.waveInProgress = [LIGHT_GRAY]Wave in progress
waiting = [LIGHT_GRAY]Waiting...
waiting.players = Aan het wachten voor spelers...
wave.waveInProgress = [LIGHT_GRAY]Golf bezig
waiting = [LIGHT_GRAY]Wachten...
waiting.players = Aan het wachten op spelers...
wave.enemies = [LIGHT_GRAY]{0} Vijanden Over
wave.enemy = [LIGHT_GRAY]{0} Vijand Over
loadimage = Laad Afbeelding
saveimage = Sla Afbeelding Op
unknown = Onbekend
custom = Custom
builtin = Built-In
custom = Aangepast
builtin = Ingebouwd
map.delete.confirm = Weet je zeker dat je deze kaart wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden!
map.random = [accent]Random Map
map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor.
map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor.
map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor.
map.invalid = Error loading map: corrupted or invalid map file.
map.random = [accent]Willekeurige Map
map.nospawn = Deze map heeft geen cores voor spelers om te spawnen! Voeg een[ROYAL] blauwe[] core toe in de mapbewerker.
map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Voeg een[SCARLET] niet-blauwe[] core toe in de mapbewerker.
map.nospawn.attack = This map does not have any enemy cores for player to attack! Voeg een[SCARLET] rode[] core toe in de mapbewerker.
map.invalid = Fout tijdens het laden van de map: Corrupt of ongeldig mapbestand.
workshop.update = Update Item
workshop.error = Error fetching workshop details: {0}
map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up!
@@ -652,7 +653,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Deselect
keybind.shoot.name = Shoot
keybind.zoom_hold.name = Zoom Hold
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause

View File

@@ -699,7 +699,6 @@ keybind.pick.name = Wybierz Blok
keybind.break_block.name = Zniszcz Blok
keybind.deselect.name = Odznacz
keybind.shoot.name = Strzelanie
keybind.zoom_hold.name = Inicjator przybliżania
keybind.zoom.name = Przybliżanie
keybind.menu.name = Menu
keybind.pause.name = Pauza

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Pegar bloco
keybind.break_block.name = Quebrar bloco
keybind.deselect.name = Deselecionar
keybind.shoot.name = Atirar
keybind.zoom_hold.name = segurar_zoom
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pausar

View File

@@ -700,7 +700,6 @@ keybind.pick.name = Pegar bloco
keybind.break_block.name = Quebrar bloco
keybind.deselect.name = Deselecionar
keybind.shoot.name = Atirar
keybind.zoom_hold.name = segurar Zoom
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pausar

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Deselect
keybind.shoot.name = Shoot
keybind.zoom_hold.name = Zoom Hold
keybind.zoom.name = Zoom
keybind.menu.name = Menu
keybind.pause.name = Pause

File diff suppressed because it is too large Load Diff

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = Eldeki yapiyi birak
keybind.shoot.name = Sik
keybind.zoom_hold.name = Yaklasma basili tutmasi
keybind.zoom.name = Yaklas
keybind.menu.name = Menu
keybind.pause.name = Durdur

View File

@@ -652,7 +652,6 @@ keybind.pick.name = Blok Seç
keybind.break_block.name = Blok Kır
keybind.deselect.name = Seçimleri Kaldır
keybind.shoot.name = Ateş Et
keybind.zoom_hold.name = Zumu Sabit Tutma
keybind.zoom.name = Zum
keybind.menu.name = Menü
keybind.pause.name = Durdur

View File

@@ -25,6 +25,8 @@ load.image = Зображення
load.content = Зміст
load.system = Система
load.mod = Модифікації
load.scripts = Скрипти
schematic = Схема
schematic.add = Зберегти схему…
schematics = Схеми
@@ -104,17 +106,19 @@ mod.disable = Вимкнути
mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується.
mod.requiresversion = [scarlet]Необхідна версія гри: [accent]{0}
mod.missingdependencies = [scarlet]Відсутні залежності: {0}
mod.nowdisabled = [scarlet]Модифікації '{0}' не вистачає залежностей:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буду автоматично вимкнена.
mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена.
mod.enable = Увімкнути
mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій.
mod.reloadrequired = [scarlet]Потрібно перезавантаження
mod.import = Імпортувати модифікацію
mod.import.github = Імпортувати модификацію з Ґітгаб
mod.import.github = Імпортувати модификацію з GitHub
mod.item.remove =Цей предмет є частиною модифікації [accent] '«{0}»[]. Щоб видалити його, видаліть цю модифікацію.
mod.remove.confirm = Цю модифікацію буде видалено.
mod.author = [LIGHT_GRAY]Автор:[] {0}
mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0}
mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модификаціями і спробуйте знову.
mod.folder.missing = Тільки модификації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модификацію у теку, просто розархівуйте цей файлу теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модификації.
mod.scripts.unsupported = Ваш пристрій не підтримує скрипти модифікацій. Деякі модифифікаціх не будуть працювати правильно.
about.button = Про гру
name = Ім’я:
noname = Спочатку придумайте[accent] собі ім’я[].
@@ -692,7 +696,6 @@ keybind.pick.name = Вибрати блок
keybind.break_block.name = Зламати блок
keybind.deselect.name = Скасувати
keybind.shoot.name = Постріл
keybind.zoom_hold.name = Керування масштабом
keybind.zoom.name = Приблизити
keybind.menu.name = Меню
keybind.pause.name = Пауза

View File

@@ -699,7 +699,6 @@ keybind.pick.name = 选择方块
keybind.break_block.name = 破坏方块
keybind.deselect.name = 取消选择
keybind.shoot.name = 射击
keybind.zoom_hold.name = 按住调整缩放
keybind.zoom.name = 缩放
keybind.menu.name = 菜单
keybind.pause.name = 暂停

View File

@@ -26,6 +26,7 @@ load.image = 圖片載入中
load.content = 內容載入中
load.system = 系統載入中
load.mod = 模組載入中
load.scripts = 指令檔載入中
schematic = 藍圖
schematic.add = 儲存藍圖...
@@ -106,6 +107,7 @@ mod.requiresrestart = 遊戲將立即關閉以套用模組變更。
mod.reloadrequired = [scarlet]需要重新載入
mod.import = 匯入模組
mod.import.github = 匯入GitHub模組
mod.item.remove = 此物品是[accent] '{0}'[]模組的一部份。解除安裝模組以移除此物品。
mod.remove.confirm = 該模組將被刪除。
mod.author = [lightgray]作者:[] {0}
mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0}
@@ -678,7 +680,6 @@ keybind.pick.name = 選擇方塊
keybind.break_block.name = 移除方塊
keybind.deselect.name = 取消選取
keybind.shoot.name = 射擊
keybind.zoom_hold.name = 按住縮放
keybind.zoom.name = 縮放
keybind.menu.name = 主選單
keybind.pause.name = 暫停遊戲
@@ -1016,7 +1017,7 @@ unit.fortress.name = 要塞
unit.revenant.name = 復仇鬼
unit.eruptor.name = 爆發者
unit.chaos-array.name = 混沌陣列
unit.eradicator.name = 消除
unit.eradicator.name = 殲滅
unit.lich.name = 巫妖
unit.reaper.name = 收掠者
tutorial.next = [lightgray]<按下以繼續>

Binary file not shown.

19
core/assets/scripts/base.js Executable file
View File

@@ -0,0 +1,19 @@
const log = function(context, obj){
Vars.mods.getScripts().log(context, obj ? String(obj) : "null")
}
const extendContent = function(classType, name, params){
return new JavaAdapter(classType, params, name)
}
const extend = function(classType, params){
return new JavaAdapter(classType, params)
}
const run = method => new java.lang.Runnable(){run: method}
const boolf = method => new Boolf(){get: method}
const boolp = method => new Boolp(){get: method}
const cons = method => new Cons(){get: method}
const prov = method => new Prov(){get: method}
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
const Calls = Packages.io.anuke.mindustry.gen.Call

78
core/assets/scripts/global.js Executable file
View File

@@ -0,0 +1,78 @@
//Generated class. Do not modify.
const log = function(context, obj){
Vars.mods.getScripts().log(context, obj ? String(obj) : "null")
}
const extendContent = function(classType, name, params){
return new JavaAdapter(classType, params, name)
}
const extend = function(classType, params){
return new JavaAdapter(classType, params)
}
const run = method => new java.lang.Runnable(){run: method}
const boolf = method => new Boolf(){get: method}
const boolp = method => new Boolp(){get: method}
const cons = method => new Cons(){get: method}
const prov = method => new Prov(){get: method}
const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer}))
const Calls = Packages.io.anuke.mindustry.gen.Call
importPackage(Packages.io.anuke.arc)
importPackage(Packages.io.anuke.arc.collection)
importPackage(Packages.io.anuke.arc.func)
importPackage(Packages.io.anuke.arc.graphics)
importPackage(Packages.io.anuke.arc.graphics.g2d)
importPackage(Packages.io.anuke.arc.math)
importPackage(Packages.io.anuke.arc.scene)
importPackage(Packages.io.anuke.arc.scene.actions)
importPackage(Packages.io.anuke.arc.scene.event)
importPackage(Packages.io.anuke.arc.scene.style)
importPackage(Packages.io.anuke.arc.scene.ui)
importPackage(Packages.io.anuke.arc.scene.ui.layout)
importPackage(Packages.io.anuke.arc.scene.utils)
importPackage(Packages.io.anuke.arc.util)
importPackage(Packages.io.anuke.mindustry)
importPackage(Packages.io.anuke.mindustry.ai)
importPackage(Packages.io.anuke.mindustry.content)
importPackage(Packages.io.anuke.mindustry.core)
importPackage(Packages.io.anuke.mindustry.ctype)
importPackage(Packages.io.anuke.mindustry.editor)
importPackage(Packages.io.anuke.mindustry.entities)
importPackage(Packages.io.anuke.mindustry.entities.bullet)
importPackage(Packages.io.anuke.mindustry.entities.effect)
importPackage(Packages.io.anuke.mindustry.entities.traits)
importPackage(Packages.io.anuke.mindustry.entities.type)
importPackage(Packages.io.anuke.mindustry.entities.type.base)
importPackage(Packages.io.anuke.mindustry.entities.units)
importPackage(Packages.io.anuke.mindustry.game)
importPackage(Packages.io.anuke.mindustry.gen)
importPackage(Packages.io.anuke.mindustry.graphics)
importPackage(Packages.io.anuke.mindustry.input)
importPackage(Packages.io.anuke.mindustry.maps)
importPackage(Packages.io.anuke.mindustry.maps.filters)
importPackage(Packages.io.anuke.mindustry.maps.generators)
importPackage(Packages.io.anuke.mindustry.maps.zonegen)
importPackage(Packages.io.anuke.mindustry.type)
importPackage(Packages.io.anuke.mindustry.ui)
importPackage(Packages.io.anuke.mindustry.ui.dialogs)
importPackage(Packages.io.anuke.mindustry.ui.fragments)
importPackage(Packages.io.anuke.mindustry.ui.layout)
importPackage(Packages.io.anuke.mindustry.world)
importPackage(Packages.io.anuke.mindustry.world.blocks)
importPackage(Packages.io.anuke.mindustry.world.blocks.defense)
importPackage(Packages.io.anuke.mindustry.world.blocks.defense.turrets)
importPackage(Packages.io.anuke.mindustry.world.blocks.distribution)
importPackage(Packages.io.anuke.mindustry.world.blocks.liquid)
importPackage(Packages.io.anuke.mindustry.world.blocks.logic)
importPackage(Packages.io.anuke.mindustry.world.blocks.power)
importPackage(Packages.io.anuke.mindustry.world.blocks.production)
importPackage(Packages.io.anuke.mindustry.world.blocks.sandbox)
importPackage(Packages.io.anuke.mindustry.world.blocks.storage)
importPackage(Packages.io.anuke.mindustry.world.blocks.units)
importPackage(Packages.io.anuke.mindustry.world.consumers)
importPackage(Packages.io.anuke.mindustry.world.meta)
importPackage(Packages.io.anuke.mindustry.world.meta.values)
importPackage(Packages.io.anuke.mindustry.world.modules)
importPackage(Packages.io.anuke.mindustry.world.producers)

10
core/assets/scripts/wrapper.js Executable file
View File

@@ -0,0 +1,10 @@
modName = "$MOD_NAME$"
!function(){
const scriptName = "$SCRIPT_NAME$"
const print = text => log(scriptName, text);
$CODE$
}();

View File

@@ -32,8 +32,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
@Override
public void setup(){
Vars.loadLogger();
Vars.platform = this;
Log.setUseColors(false);
beginTime = Time.millis();
Time.setDeltaProvider(() -> {
@@ -70,8 +70,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
Sounds.load();
assets.loadRun("contentcreate", Content.class, () -> {
content.createContent();
content.createBaseContent();
content.loadColors();
}, () -> {
mods.loadScripts();
content.createModContent();
});
add(logic = new Logic());
@@ -120,7 +123,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
for(ApplicationListener listener : modules){
listener.init();
}
mods.each(Mod::init);
mods.eachClass(Mod::init);
finished = true;
Events.fire(new ClientLoadEvent());
super.resize(graphics.getWidth(), graphics.getHeight());
@@ -193,7 +196,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
if(assets.getCurrentLoading() != null){
String name = assets.getCurrentLoading().fileName.toLowerCase();
String key = name.contains("content") ? "content" : name.contains("mod") ? "mods" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system";
String key = name.contains("script") ? "scripts" : name.contains("content") ? "content" : name.contains("mod") ? "mods" : name.contains("msav") ||
name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system";
font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - Scl.scl(10f), Align.center);
}
}

View File

@@ -8,6 +8,7 @@ import io.anuke.arc.files.*;
import io.anuke.arc.graphics.*;
import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*;
import io.anuke.arc.util.io.*;
import io.anuke.mindustry.ai.*;
import io.anuke.mindustry.core.*;
import io.anuke.mindustry.entities.*;
@@ -15,6 +16,7 @@ import io.anuke.mindustry.entities.effect.*;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.input.*;
import io.anuke.mindustry.maps.*;
@@ -25,12 +27,14 @@ import io.anuke.mindustry.world.blocks.defense.ForceProjector.*;
import java.nio.charset.*;
import java.util.*;
import static io.anuke.arc.Core.*;
import static io.anuke.arc.Core.settings;
@SuppressWarnings("unchecked")
public class Vars implements Loadable{
/** Whether to load locales.*/
public static boolean loadLocales = true;
/** Whether the logger is loaded. */
public static boolean loadedLogger = false;
/** Maximum schematic size.*/
public static final int maxSchematicSize = 32;
/** All schematic base64 starts with this string.*/
@@ -118,22 +122,24 @@ public class Vars implements Loadable{
public static boolean headless;
/** whether steam is enabled for this game */
public static boolean steam;
/** whether typing into the console is enabled - developers only */
public static boolean enableConsole = false;
/** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */
public static FileHandle dataDirectory;
public static Fi dataDirectory;
/** data subdirectory used for screenshots */
public static FileHandle screenshotDirectory;
public static Fi screenshotDirectory;
/** data subdirectory used for custom mmaps */
public static FileHandle customMapDirectory;
public static Fi customMapDirectory;
/** data subdirectory used for custom mmaps */
public static FileHandle mapPreviewDirectory;
public static Fi mapPreviewDirectory;
/** tmp subdirectory for map conversion */
public static FileHandle tmpDirectory;
public static Fi tmpDirectory;
/** data subdirectory used for saves */
public static FileHandle saveDirectory;
public static Fi saveDirectory;
/** data subdirectory used for mods */
public static FileHandle modDirectory;
public static Fi modDirectory;
/** data subdirectory used for schematics */
public static FileHandle schematicDirectory;
public static Fi schematicDirectory;
/** map file extension */
public static final String mapExtension = "msav";
/** save file extension */
@@ -190,6 +196,7 @@ public class Vars implements Loadable{
public static void init(){
Serialization.init();
DefaultSerializers.typeMappings.put("io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.ctype.ContentType");
if(loadLocales){
//load locales
@@ -268,6 +275,31 @@ public class Vars implements Loadable{
maps.load();
}
public static void loadLogger(){
if(loadedLogger) return;
String[] tags = {"[green][D][]", "[royal][I][]", "[yellow][W][]", "[scarlet][E][]", ""};
String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""};
Array<String> logBuffer = new Array<>();
Log.setLogger((level, text, args) -> {
String result = Log.format(text, args);
System.out.println(Log.format(stags[level.ordinal()] + "&fr " + text, args));
result = tags[level.ordinal()] + " " + result;
if(!headless && (ui == null || ui.scriptfrag == null)){
logBuffer.add(result);
}else if(!headless){
ui.scriptfrag.addMessage(result);
}
});
Events.on(ClientLoadEvent.class, e -> logBuffer.each(ui.scriptfrag::addMessage));
loadedLogger = true;
}
public static void loadSettings(){
Core.settings.setAppName(appName);
@@ -285,7 +317,7 @@ public class Vars implements Loadable{
try{
//try loading external bundle
FileHandle handle = Core.files.local("bundle");
Fi handle = Core.files.local("bundle");
Locale locale = Locale.ENGLISH;
Core.bundle = I18NBundle.createBundle(handle, locale);
@@ -298,7 +330,7 @@ public class Vars implements Loadable{
}catch(Throwable e){
//no external bundle found
FileHandle handle = Core.files.internal("bundles/bundle");
Fi handle = Core.files.internal("bundles/bundle");
Locale locale;
String loc = Core.settings.getString("locale");
if(loc.equals("default")){

View File

@@ -7,7 +7,7 @@ import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.ctype.ContentList;
import io.anuke.mindustry.ctype.*;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.entities.type.*;
@@ -19,8 +19,7 @@ import io.anuke.mindustry.world.blocks.*;
import io.anuke.mindustry.world.blocks.defense.*;
import io.anuke.mindustry.world.blocks.defense.turrets.*;
import io.anuke.mindustry.world.blocks.distribution.*;
import io.anuke.mindustry.world.blocks.liquid.Conduit;
import io.anuke.mindustry.world.blocks.liquid.LiquidTank;
import io.anuke.mindustry.world.blocks.liquid.*;
import io.anuke.mindustry.world.blocks.logic.*;
import io.anuke.mindustry.world.blocks.power.*;
import io.anuke.mindustry.world.blocks.production.*;
@@ -485,7 +484,7 @@ public class Blocks implements ContentList{
drawer = tile -> {
Draw.rect(region, tile.drawx(), tile.drawy());
GenericCrafterEntity entity = tile.entity();
GenericCrafterEntity entity = tile.ent();
Draw.alpha(Mathf.absin(entity.totalProgress, 3f, 0.9f) * entity.warmup);
Draw.rect(reg(topRegion), tile.drawx(), tile.drawy());
@@ -510,7 +509,7 @@ public class Blocks implements ContentList{
drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name), Core.atlas.find(name + "-weave")};
drawer = tile -> {
GenericCrafterEntity entity = tile.entity();
GenericCrafterEntity entity = tile.ent();
Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy());
Draw.rect(reg(weaveRegion), tile.drawx(), tile.drawy(), entity.totalProgress);
@@ -660,7 +659,7 @@ public class Blocks implements ContentList{
drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")};
drawer = tile -> {
GenericCrafterEntity entity = tile.entity();
GenericCrafterEntity entity = tile.ent();
Draw.rect(region, tile.drawx(), tile.drawy());
Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy());
@@ -687,7 +686,7 @@ public class Blocks implements ContentList{
drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator")};
drawer = tile -> {
GenericCrafterEntity entity = tile.entity();
GenericCrafterEntity entity = tile.ent();
Draw.rect(region, tile.drawx(), tile.drawy());
Draw.rect(reg(rotatorRegion), tile.drawx(), tile.drawy(), entity.totalProgress * 2f);
@@ -915,6 +914,7 @@ public class Blocks implements ContentList{
phaseConveyor = new ItemBridge("phase-conveyor"){{
requirements(Category.distribution, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10));
range = 12;
canOverdrive = false;
hasPower = true;
consumes.power(0.30f);
}};
@@ -977,7 +977,7 @@ public class Blocks implements ContentList{
size = 3;
}};
conduit = new io.anuke.mindustry.world.blocks.liquid.Conduit("conduit"){{
conduit = new Conduit("conduit"){{
requirements(Category.liquid, ItemStack.with(Items.metaglass, 1));
health = 45;
}};
@@ -989,14 +989,14 @@ public class Blocks implements ContentList{
health = 90;
}};
platedConduit = new io.anuke.mindustry.world.blocks.liquid.ArmoredConduit("plated-conduit"){{
requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1));
platedConduit = new ArmoredConduit("plated-conduit"){{
requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1, Items.plastanium, 1));
liquidCapacity = 16f;
liquidPressure = 1.025f;
health = 220;
}};
liquidRouter = new io.anuke.mindustry.world.blocks.liquid.LiquidRouter("liquid-router"){{
liquidRouter = new LiquidRouter("liquid-router"){{
requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 2));
liquidCapacity = 20f;
}};
@@ -1008,20 +1008,21 @@ public class Blocks implements ContentList{
health = 500;
}};
liquidJunction = new io.anuke.mindustry.world.blocks.liquid.LiquidJunction("liquid-junction"){{
liquidJunction = new LiquidJunction("liquid-junction"){{
requirements(Category.liquid, ItemStack.with(Items.graphite, 2, Items.metaglass, 2));
}};
bridgeConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge("bridge-conduit"){{
bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{
requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 8));
range = 4;
hasPower = false;
}};
phaseConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidBridge("phase-conduit"){{
phaseConduit = new LiquidBridge("phase-conduit"){{
requirements(Category.liquid, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10));
range = 12;
hasPower = true;
canOverdrive = false;
consumes.power(0.30f);
}};
@@ -1359,7 +1360,7 @@ public class Blocks implements ContentList{
ammo(
Items.graphite, Bullets.artilleryDense,
Items.silicon, Bullets.artilleryHoming,
Items.pyratite, Bullets.artlleryIncendiary
Items.pyratite, Bullets.artilleryIncendiary
);
reload = 60f;
recoil = 2f;
@@ -1539,9 +1540,9 @@ public class Blocks implements ContentList{
ammo(
Items.graphite, Bullets.artilleryDense,
Items.silicon, Bullets.artilleryHoming,
Items.pyratite, Bullets.artlleryIncendiary,
Items.pyratite, Bullets.artilleryIncendiary,
Items.blastCompound, Bullets.artilleryExplosive,
Items.plastanium, Bullets.arilleryPlastic
Items.plastanium, Bullets.artilleryPlastic
);
size = 3;
shots = 4;

View File

@@ -18,7 +18,7 @@ public class Bullets implements ContentList{
public static BulletType
//artillery
artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artlleryIncendiary, artilleryExplosive, artilleryUnit,
artilleryDense, artilleryPlastic, artilleryPlasticFrag, artilleryHoming, artilleryIncendiary, artilleryExplosive, artilleryUnit,
//flak
flakScrap, flakLead, flakPlastic, flakExplosive, flakSurge, flakGlass, glassFrag,
@@ -65,7 +65,7 @@ public class Bullets implements ContentList{
despawnEffect = Fx.none;
}};
arilleryPlastic = new ArtilleryBulletType(3.4f, 0, "shell"){{
artilleryPlastic = new ArtilleryBulletType(3.4f, 0, "shell"){{
hitEffect = Fx.plasticExplosion;
knockback = 1f;
lifetime = 55f;
@@ -91,7 +91,7 @@ public class Bullets implements ContentList{
homingRange = 50f;
}};
artlleryIncendiary = new ArtilleryBulletType(3f, 0, "shell"){{
artilleryIncendiary = new ArtilleryBulletType(3f, 0, "shell"){{
hitEffect = Fx.blastExplosion;
knockback = 0.8f;
lifetime = 60f;

View File

@@ -48,28 +48,24 @@ public class Fx implements ContentList{
Draw.rect(unit.getIconRegion(), e.x, e.y,
unit.getIconRegion().getWidth() * Draw.scl * scl, unit.getIconRegion().getWidth() * Draw.scl * scl, 180f);
Draw.reset();
});
commandSend = new Effect(28, e -> {
Draw.color(Pal.command);
Lines.stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 4f + e.finpow() * 120f);
Draw.color();
});
placeBlock = new Effect(16, e -> {
Draw.color(Pal.accent);
Lines.stroke(3f - e.fin() * 2f);
Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f);
Draw.reset();
});
tapBlock = new Effect(12, e -> {
Draw.color(Pal.accent);
Lines.stroke(3f - e.fin() * 2f);
Lines.circle(e.x, e.y, 4f + (tilesize / 1.5f * e.rotation) * e.fin());
Draw.reset();
});
breakBlock = new Effect(12, e -> {
@@ -80,41 +76,35 @@ public class Fx implements ContentList{
Angles.randLenVectors(e.id, 3 + (int)(e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> {
Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation));
});
Draw.reset();
});
select = new Effect(23, e -> {
Draw.color(Pal.accent);
Lines.stroke(e.fout() * 3f);
Lines.circle(e.x, e.y, 3f + e.fin() * 14f);
Draw.reset();
});
smoke = new Effect(100, e -> {
Draw.color(Color.gray, Pal.darkishGray, e.fin());
float size = 7f - e.fin() * 7f;
Draw.rect("circle", e.x, e.y, size, size);
Draw.reset();
});
magmasmoke = new Effect(110, e -> {
Draw.color(Color.gray);
Fill.circle(e.x, e.y, e.fslope() * 6f);
Draw.reset();
});
spawn = new Effect(30, e -> {
Lines.stroke(2f * e.fout());
Draw.color(Pal.accent);
Lines.poly(e.x, e.y, 4, 5f + e.fin() * 12f);
Draw.reset();
});
padlaunch = new Effect(10, e -> {
Lines.stroke(4f * e.fout());
Draw.color(Pal.accent);
Lines.poly(e.x, e.y, 4, 5f + e.fin() * 60f);
Draw.reset();
});
vtolHover = new Effect(40f, e -> {
@@ -122,7 +112,6 @@ public class Fx implements ContentList{
float ang = e.rotation + Mathf.randomSeedRange(e.id, 30f);
Draw.color(Pal.lightFlame, Pal.lightOrange, e.fin());
Fill.circle(e.x + Angles.trnsx(ang, len), e.y + Angles.trnsy(ang, len), 2f * e.fout());
Draw.reset();
});
unitDrop = new GroundEffect(30, e -> {
@@ -130,7 +119,6 @@ public class Fx implements ContentList{
Angles.randLenVectors(e.id, 9, 3 + 20f * e.finpow(), (x, y) -> {
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.4f);
});
Draw.reset();
});
unitLand = new GroundEffect(30, e -> {
@@ -138,42 +126,36 @@ public class Fx implements ContentList{
Angles.randLenVectors(e.id, 6, 17f * e.finpow(), (x, y) -> {
Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.3f);
});
Draw.reset();
});
unitPickup = new GroundEffect(18, e -> {
Draw.color(Pal.lightishGray);
Lines.stroke(e.fin() * 2f);
Lines.poly(e.x, e.y, 4, 13f * e.fout());
Draw.reset();
});
landShock = new GroundEffect(12, e -> {
Draw.color(Pal.lancerLaser);
Lines.stroke(e.fout() * 3f);
Lines.poly(e.x, e.y, 12, 20f * e.fout());
Draw.reset();
});
pickup = new Effect(18, e -> {
Draw.color(Pal.lightishGray);
Lines.stroke(e.fout() * 2f);
Lines.spikes(e.x, e.y, 1f + e.fin() * 6f, e.fout() * 4f, 6);
Draw.reset();
});
healWave = new Effect(22, e -> {
Draw.color(Pal.heal);
Lines.stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 4f + e.finpow() * 60f);
Draw.color();
});
heal = new Effect(11, e -> {
Draw.color(Pal.heal);
Lines.stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 2f + e.finpow() * 7f);
Draw.color();
});
@@ -193,7 +175,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f);
});
Draw.reset();
});
hitFuse = new Effect(14, e -> {
@@ -212,7 +193,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f);
});
Draw.reset();
});
hitBulletBig = new Effect(13, e -> {
@@ -224,7 +204,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1.5f);
});
Draw.reset();
});
hitFlameSmall = new Effect(14, e -> {
@@ -236,7 +215,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f);
});
Draw.reset();
});
hitLiquid = new Effect(16, e -> {
@@ -246,7 +224,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 2f);
});
Draw.reset();
});
hitLancer = new Effect(12, e -> {
@@ -258,7 +235,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f);
});
Draw.reset();
});
hitMeltdown = new Effect(12, e -> {
@@ -270,14 +246,12 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f);
});
Draw.reset();
});
hitLaser = new Effect(8, e -> {
Draw.color(Color.white, Pal.heal, e.fin());
Lines.stroke(0.5f + e.fout());
Lines.circle(e.x, e.y, e.fin() * 5f);
Draw.reset();
});
despawn = new Effect(12, e -> {
@@ -289,7 +263,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 2 + 1f);
});
Draw.reset();
});
flakExplosion = new Effect(20, e -> {
@@ -313,7 +286,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
plasticExplosion = new Effect(24, e -> {
@@ -337,7 +309,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
plasticExplosionFlak = new Effect(28, e -> {
@@ -361,7 +332,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
blastExplosion = new Effect(22, e -> {
@@ -385,32 +355,27 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
artilleryTrail = new Effect(50, e -> {
Draw.color(e.color);
Fill.circle(e.x, e.y, e.rotation * e.fout());
Draw.reset();
});
incendTrail = new Effect(50, e -> {
Draw.color(Pal.lightOrange);
Fill.circle(e.x, e.y, e.rotation * e.fout());
Draw.reset();
});
missileTrail = new Effect(50, e -> {
Draw.color(e.color);
Fill.circle(e.x, e.y, e.rotation * e.fout());
Draw.reset();
});
absorb = new Effect(12, e -> {
Draw.color(Pal.accent);
Lines.stroke(2f * e.fout());
Lines.circle(e.x, e.y, 5f * e.fout());
Draw.reset();
});
flakExplosionBig = new Effect(30, e -> {
@@ -434,7 +399,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
@@ -445,7 +409,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.1f + e.fout() * 1.4f);
});
Draw.color();
});
fire = new Effect(50f, e -> {
@@ -467,7 +430,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
});
Draw.color();
});
steam = new Effect(35f, e -> {
@@ -477,7 +439,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f);
});
Draw.color();
});
fireballsmoke = new Effect(25f, e -> {
@@ -487,7 +448,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f);
});
Draw.color();
});
ballfire = new Effect(25f, e -> {
@@ -497,7 +457,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f);
});
Draw.color();
});
freezing = new Effect(40f, e -> {
@@ -507,7 +466,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 1.2f);
});
Draw.color();
});
melting = new Effect(40f, e -> {
@@ -517,7 +475,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f);
});
Draw.color();
});
wet = new Effect(40f, e -> {
@@ -527,7 +484,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
});
Draw.color();
});
oily = new Effect(42f, e -> {
@@ -537,7 +493,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
});
Draw.color();
});
overdriven = new Effect(20f, e -> {
@@ -547,7 +502,6 @@ public class Fx implements ContentList{
Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f);
});
Draw.color();
});
dropItem = new Effect(20f, e -> {
@@ -562,35 +516,30 @@ public class Fx implements ContentList{
Draw.color(Color.white, Color.lightGray, e.fin());
Lines.stroke(e.fout() * 2f + 0.2f);
Lines.circle(e.x, e.y, e.fin() * 28f);
Draw.reset();
});
bigShockwave = new Effect(10f, 80f, e -> {
Draw.color(Color.white, Color.lightGray, e.fin());
Lines.stroke(e.fout() * 3f);
Lines.circle(e.x, e.y, e.fin() * 50f);
Draw.reset();
});
nuclearShockwave = new Effect(10f, 200f, e -> {
Draw.color(Color.white, Color.lightGray, e.fin());
Lines.stroke(e.fout() * 3f + 0.2f);
Lines.circle(e.x, e.y, e.fin() * 140f);
Draw.reset();
});
impactShockwave = new Effect(13f, 300f, e -> {
Draw.color(Pal.lighterOrange, Color.lightGray, e.fin());
Lines.stroke(e.fout() * 4f + 0.2f);
Lines.circle(e.x, e.y, e.fin() * 200f);
Draw.reset();
});
spawnShockwave = new Effect(20f, 400f, e -> {
Draw.color(Color.white, Color.lightGray, e.fin());
Lines.stroke(e.fout() * 3f + 0.5f);
Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f));
Draw.reset();
});
explosion = new Effect(30, e -> {
@@ -613,7 +562,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
dynamicExplosion = new Effect(30, e -> {
@@ -638,7 +586,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f + intensity));
});
Draw.reset();
});
blockExplosion = new Effect(30, e -> {
@@ -661,7 +608,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f);
});
Draw.reset();
});
blockExplosionSmoke = new Effect(30, e -> {
@@ -672,7 +618,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f);
});
Draw.reset();
});
@@ -681,7 +626,6 @@ public class Fx implements ContentList{
float w = 1f + 5 * e.fout();
Drawf.tri(e.x, e.y, w, 15f * e.fout(), e.rotation);
Drawf.tri(e.x, e.y, w, 3f * e.fout(), e.rotation + 180f);
Draw.reset();
});
shootHeal = new Effect(8, e -> {
@@ -689,7 +633,6 @@ public class Fx implements ContentList{
float w = 1f + 5 * e.fout();
Drawf.tri(e.x, e.y, w, 17f * e.fout(), e.rotation);
Drawf.tri(e.x, e.y, w, 4f * e.fout(), e.rotation + 180f);
Draw.reset();
});
shootSmallSmoke = new Effect(20f, e -> {
@@ -699,7 +642,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f);
});
Draw.reset();
});
shootBig = new Effect(9, e -> {
@@ -707,7 +649,6 @@ public class Fx implements ContentList{
float w = 1.2f + 7 * e.fout();
Drawf.tri(e.x, e.y, w, 25f * e.fout(), e.rotation);
Drawf.tri(e.x, e.y, w, 4f * e.fout(), e.rotation + 180f);
Draw.reset();
});
shootBig2 = new Effect(10, e -> {
@@ -715,7 +656,6 @@ public class Fx implements ContentList{
float w = 1.2f + 8 * e.fout();
Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation);
Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f);
Draw.reset();
});
shootBigSmoke = new Effect(17f, e -> {
@@ -725,7 +665,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f);
});
Draw.reset();
});
shootBigSmoke2 = new Effect(18f, e -> {
@@ -735,7 +674,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f);
});
Draw.reset();
});
shootSmallFlame = new Effect(32f, e -> {
@@ -745,7 +683,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f);
});
Draw.reset();
});
shootPyraFlame = new Effect(33f, e -> {
@@ -755,7 +692,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f);
});
Draw.reset();
});
shootLiquid = new Effect(40f, e -> {
@@ -765,7 +701,6 @@ public class Fx implements ContentList{
Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f);
});
Draw.reset();
});
shellEjectSmall = new GroundEffect(30f, 400f, e -> {
@@ -780,7 +715,6 @@ public class Fx implements ContentList{
e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()),
1f, 2f, rot + e.fin() * 50f * i);
Draw.color();
});
shellEjectMedium = new GroundEffect(34f, 400f, e -> {
@@ -804,7 +738,6 @@ public class Fx implements ContentList{
});
}
Draw.color();
});
shellEjectBig = new GroundEffect(22f, 400f, e -> {
@@ -829,7 +762,6 @@ public class Fx implements ContentList{
});
}
Draw.color();
});
lancerLaserShoot = new Effect(21f, e -> {
@@ -839,7 +771,6 @@ public class Fx implements ContentList{
Drawf.tri(e.x, e.y, 4f * e.fout(), 29f, e.rotation + 90f * i);
}
Draw.reset();
});
lancerLaserShootSmoke = new Effect(26f, e -> {
@@ -849,7 +780,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fout() * 9f);
});
Draw.reset();
});
lancerLaserCharge = new Effect(38f, e -> {
@@ -859,7 +789,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 3f + 1f);
});
Draw.reset();
});
lancerLaserChargeBegin = new Effect(71f, e -> {
@@ -877,7 +806,6 @@ public class Fx implements ContentList{
Drawf.tri(e.x + x, e.y + y, e.fslope() * 3f + 1, e.fslope() * 3f + 1, Mathf.angle(x, y));
});
Draw.reset();
});
lightningShoot = new Effect(12f, e -> {
@@ -888,7 +816,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 5f + 2f);
});
Draw.reset();
});
@@ -897,7 +824,6 @@ public class Fx implements ContentList{
float size = 1f + e.fout() * 5f;
Draw.color(Color.lightGray, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
nuclearsmoke = new Effect(40, e -> {
@@ -905,7 +831,6 @@ public class Fx implements ContentList{
float size = e.fslope() * 4f;
Draw.color(Color.lightGray, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
nuclearcloud = new Effect(90, 200f, e -> {
@@ -913,7 +838,6 @@ public class Fx implements ContentList{
float size = e.fout() * 14f;
Draw.color(Color.lime, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
impactsmoke = new Effect(60, e -> {
@@ -921,7 +845,6 @@ public class Fx implements ContentList{
float size = e.fslope() * 4f;
Draw.color(Color.lightGray, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
impactcloud = new Effect(140, 400f, e -> {
@@ -929,7 +852,6 @@ public class Fx implements ContentList{
float size = e.fout() * 15f;
Draw.color(Pal.lighterOrange, Color.lightGray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
redgeneratespark = new Effect(18, e -> {
@@ -937,7 +859,6 @@ public class Fx implements ContentList{
float len = e.fout() * 4f;
Draw.color(Pal.redSpark, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, len, len);
Draw.reset();
});
});
generatespark = new Effect(18, e -> {
@@ -945,7 +866,6 @@ public class Fx implements ContentList{
float len = e.fout() * 4f;
Draw.color(Pal.orangeSpark, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, len, len);
Draw.reset();
});
});
fuelburn = new Effect(23, e -> {
@@ -953,70 +873,60 @@ public class Fx implements ContentList{
float len = e.fout() * 4f;
Draw.color(Color.lightGray, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, len, len);
Draw.reset();
});
});
plasticburn = new Effect(40, e -> {
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> {
Draw.color(Color.valueOf("e9ead3"), Color.gray, e.fin());
Fill.circle(e.x + x, e.y + y, e.fout() * 1f);
Draw.reset();
});
});
pulverize = new Effect(40, e -> {
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> {
Draw.color(Pal.stoneGray);
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
Draw.reset();
});
});
pulverizeRed = new Effect(40, e -> {
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> {
Draw.color(Pal.redDust, Pal.stoneGray, e.fin());
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
Draw.reset();
});
});
pulverizeRedder = new Effect(40, e -> {
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 9f, (x, y) -> {
Draw.color(Pal.redderDust, Pal.stoneGray, e.fin());
Fill.square(e.x + x, e.y + y, e.fout() * 2.5f + 0.5f, 45);
Draw.reset();
});
});
pulverizeSmall = new Effect(30, e -> {
Angles.randLenVectors(e.id, 3, e.fin() * 5f, (x, y) -> {
Draw.color(Pal.stoneGray);
Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45);
Draw.reset();
});
});
pulverizeMedium = new Effect(30, e -> {
Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> {
Draw.color(Pal.stoneGray);
Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45);
Draw.reset();
});
});
producesmoke = new Effect(12, e -> {
Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> {
Draw.color(Color.white, Pal.accent, e.fin());
Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45);
Draw.reset();
});
});
smeltsmoke = new Effect(15, e -> {
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> {
Draw.color(Color.white, e.color, e.fin());
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
Draw.reset();
});
});
formsmoke = new Effect(40, e -> {
Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> {
Draw.color(Pal.plasticSmoke, Color.lightGray, e.fin());
Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45);
Draw.reset();
});
});
blastsmoke = new Effect(26, e -> {
@@ -1024,7 +934,6 @@ public class Fx implements ContentList{
float size = 2f + e.fout() * 6f;
Draw.color(Color.lightGray, Color.darkGray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
lava = new Effect(18, e -> {
@@ -1032,79 +941,66 @@ public class Fx implements ContentList{
float size = e.fslope() * 4f;
Draw.color(Color.orange, Color.gray, e.fin());
Draw.rect("circle", e.x + x, e.y + y, size, size);
Draw.reset();
});
});
dooropen = new Effect(10, e -> {
Lines.stroke(e.fout() * 1.6f);
Lines.square(e.x, e.y, tilesize / 2f + e.fin() * 2f);
Draw.reset();
});
doorclose = new Effect(10, e -> {
Lines.stroke(e.fout() * 1.6f);
Lines.square(e.x, e.y, tilesize / 2f + e.fout() * 2f);
Draw.reset();
});
dooropenlarge = new Effect(10, e -> {
Lines.stroke(e.fout() * 1.6f);
Lines.square(e.x, e.y, tilesize + e.fin() * 2f);
Draw.reset();
});
doorcloselarge = new Effect(10, e -> {
Lines.stroke(e.fout() * 1.6f);
Lines.square(e.x, e.y, tilesize + e.fout() * 2f);
Draw.reset();
});
purify = new Effect(10, e -> {
Draw.color(Color.royal, Color.gray, e.fin());
Lines.stroke(2f);
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
Draw.reset();
});
purifyoil = new Effect(10, e -> {
Draw.color(Color.black, Color.gray, e.fin());
Lines.stroke(2f);
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
Draw.reset();
});
purifystone = new Effect(10, e -> {
Draw.color(Color.orange, Color.gray, e.fin());
Lines.stroke(2f);
Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6);
Draw.reset();
});
generate = new Effect(11, e -> {
Draw.color(Color.orange, Color.yellow, e.fin());
Lines.stroke(1f);
Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8);
Draw.reset();
});
mine = new Effect(20, e -> {
Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> {
Draw.color(e.color, Color.lightGray, e.fin());
Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45);
Draw.reset();
});
});
mineBig = new Effect(30, e -> {
Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> {
Draw.color(e.color, Color.lightGray, e.fin());
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45);
Draw.reset();
});
});
mineHuge = new Effect(40, e -> {
Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> {
Draw.color(e.color, Color.lightGray, e.fin());
Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45);
Draw.reset();
});
});
smelt = new Effect(20, e -> {
Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> {
Draw.color(Color.white, e.color, e.fin());
Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45);
Draw.reset();
});
});
teleportActivate = new Effect(50, e -> {
@@ -1121,7 +1017,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f);
});
Draw.reset();
});
teleport = new Effect(60, e -> {
Draw.color(e.color);
@@ -1132,7 +1027,6 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f);
});
Draw.reset();
});
teleportOut = new Effect(20, e -> {
Draw.color(e.color);
@@ -1143,13 +1037,11 @@ public class Fx implements ContentList{
Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 4f + 1f);
});
Draw.reset();
});
ripple = new GroundEffect(false, 30, e -> {
Draw.color(Tmp.c1.set(e.color).mul(1.2f));
Lines.stroke(e.fout() + 0.4f);
Lines.circle(e.x, e.y, 2f + e.fin() * 4f);
Draw.reset();
});
bubble = new Effect(20, e -> {
@@ -1158,56 +1050,47 @@ public class Fx implements ContentList{
Angles.randLenVectors(e.id, 2, 8f, (x, y) -> {
Lines.circle(e.x + x, e.y + y, 1f + e.fin() * 3f);
});
Draw.reset();
});
launch = new Effect(28, e -> {
Draw.color(Pal.command);
Lines.stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, 4f + e.finpow() * 120f);
Draw.color();
});
healWaveMend = new Effect(40, e -> {
Draw.color(e.color);
Lines.stroke(e.fout() * 2f);
Lines.circle(e.x, e.y, e.finpow() * e.rotation);
Draw.color();
});
overdriveWave = new Effect(50, e -> {
Draw.color(e.color);
Lines.stroke(e.fout() * 1f);
Lines.circle(e.x, e.y, e.finpow() * e.rotation);
Draw.color();
});
healBlock = new Effect(20, e -> {
Draw.color(Pal.heal);
Lines.stroke(2f * e.fout() + 0.5f);
Lines.square(e.x, e.y, 1f + (e.fin() * e.rotation * tilesize / 2f - 1f));
Draw.color();
});
healBlockFull = new Effect(20, e -> {
Draw.color(e.color);
Draw.alpha(e.fout());
Fill.square(e.x, e.y, e.rotation * tilesize / 2f);
Draw.color();
});
overdriveBlockFull = new Effect(60, e -> {
Draw.color(e.color);
Draw.alpha(e.fslope() * 0.4f);
Fill.square(e.x, e.y, e.rotation * tilesize);
Draw.color();
});
shieldBreak = new Effect(40, e -> {
Draw.color(Pal.accent);
Lines.stroke(3f * e.fout());
Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90);
Draw.reset();
});
coreLand = new Effect(120f, e -> {

View File

@@ -15,61 +15,71 @@ public class StatusEffects implements ContentList{
@Override
public void load(){
none = new StatusEffect();
none = new StatusEffect("none");
burning = new StatusEffect(){{
burning = new StatusEffect("burning"){{
damage = 0.06f;
effect = Fx.burning;
opposite(() -> wet, () -> freezing);
trans(() -> tarred, ((unit, time, newTime, result) -> {
unit.damage(1f);
Effects.effect(Fx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
result.set(this, Math.min(time + newTime, 300f));
}));
init(() -> {
opposite(wet,freezing);
trans(tarred, ((unit, time, newTime, result) -> {
unit.damage(1f);
Effects.effect(Fx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f));
result.set(this, Math.min(time + newTime, 300f));
}));
});
}};
freezing = new StatusEffect(){{
freezing = new StatusEffect("freezing"){{
speedMultiplier = 0.6f;
armorMultiplier = 0.8f;
effect = Fx.freezing;
opposite(() -> melting, () -> burning);
init(() -> {
opposite(melting, burning);
});
}};
wet = new StatusEffect(){{
wet = new StatusEffect("wet"){{
speedMultiplier = 0.9f;
effect = Fx.wet;
trans(() -> shocked, ((unit, time, newTime, result) -> {
unit.damage(20f);
if(unit.getTeam() == waveTeam){
Events.fire(Trigger.shock);
}
result.set(this, time);
}));
opposite(() -> burning);
init(() -> {
trans(shocked, ((unit, time, newTime, result) -> {
unit.damage(20f);
if(unit.getTeam() == waveTeam){
Events.fire(Trigger.shock);
}
result.set(this, time);
}));
opposite(burning);
});
}};
melting = new StatusEffect(){{
melting = new StatusEffect("melting"){{
speedMultiplier = 0.8f;
armorMultiplier = 0.8f;
damage = 0.3f;
effect = Fx.melting;
trans(() -> tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f))));
opposite(() -> wet, () -> freezing);
init(() -> {
trans(tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f))));
opposite(wet, freezing);
});
}};
tarred = new StatusEffect(){{
tarred = new StatusEffect("tarred"){{
speedMultiplier = 0.6f;
effect = Fx.oily;
trans(() -> melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time)));
trans(() -> burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time)));
init(() -> {
trans(melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time)));
trans(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time)));
});
}};
overdrive = new StatusEffect(){{
overdrive = new StatusEffect("overdrive"){{
armorMultiplier = 0.95f;
speedMultiplier = 1.15f;
damageMultiplier = 1.4f;
@@ -77,20 +87,20 @@ public class StatusEffects implements ContentList{
effect = Fx.overdriven;
}};
shielded = new StatusEffect(){{
shielded = new StatusEffect("shielded"){{
armorMultiplier = 3f;
}};
boss = new StatusEffect(){{
boss = new StatusEffect("boss"){{
armorMultiplier = 3f;
damageMultiplier = 3f;
speedMultiplier = 1.1f;
}};
shocked = new StatusEffect();
shocked = new StatusEffect("shocked");
//no effects, just small amounts of damage.
corroded = new StatusEffect(){{
corroded = new StatusEffect("corroded"){{
damage = 0.1f;
}};
}

View File

@@ -17,7 +17,7 @@ public class UnitTypes implements ContentList{
@Override
public void load(){
draug = new UnitType("draug", Draug::new){{
draug = new UnitType("draug", MinerDrone::new){{
flying = true;
drag = 0.01f;
speed = 0.3f;
@@ -32,7 +32,7 @@ public class UnitTypes implements ContentList{
}};
}};
spirit = new UnitType("spirit", Spirit::new){{
spirit = new UnitType("spirit", RepairDrone::new){{
flying = true;
drag = 0.01f;
speed = 0.42f;
@@ -53,7 +53,7 @@ public class UnitTypes implements ContentList{
}};
}};
phantom = new UnitType("phantom", Phantom::new){{
phantom = new UnitType("phantom", BuilderDrone::new){{
flying = true;
drag = 0.01f;
mass = 2f;
@@ -76,7 +76,7 @@ public class UnitTypes implements ContentList{
}};
}};
dagger = new UnitType("dagger", Dagger::new){{
dagger = new UnitType("dagger", GroundUnit::new){{
maxVelocity = 1.1f;
speed = 0.2f;
drag = 0.4f;
@@ -92,7 +92,7 @@ public class UnitTypes implements ContentList{
}};
}};
crawler = new UnitType("crawler", Crawler::new){{
crawler = new UnitType("crawler", GroundUnit::new){{
maxVelocity = 1.27f;
speed = 0.285f;
drag = 0.4f;
@@ -123,7 +123,7 @@ public class UnitTypes implements ContentList{
}};
}};
titan = new UnitType("titan", Titan::new){{
titan = new UnitType("titan", GroundUnit::new){{
maxVelocity = 0.8f;
speed = 0.22f;
drag = 0.4f;
@@ -145,7 +145,7 @@ public class UnitTypes implements ContentList{
}};
}};
fortress = new UnitType("fortress", Fortress::new){{
fortress = new UnitType("fortress", GroundUnit::new){{
maxVelocity = 0.78f;
speed = 0.15f;
drag = 0.4f;
@@ -167,7 +167,7 @@ public class UnitTypes implements ContentList{
}};
}};
eruptor = new UnitType("eruptor", Eruptor::new){{
eruptor = new UnitType("eruptor", GroundUnit::new){{
maxVelocity = 0.81f;
speed = 0.16f;
drag = 0.4f;
@@ -189,7 +189,7 @@ public class UnitTypes implements ContentList{
}};
}};
chaosArray = new UnitType("chaos-array", Dagger::new){{
chaosArray = new UnitType("chaos-array", GroundUnit::new){{
maxVelocity = 0.68f;
speed = 0.12f;
drag = 0.4f;
@@ -213,7 +213,7 @@ public class UnitTypes implements ContentList{
}};
}};
eradicator = new UnitType("eradicator", Dagger::new){{
eradicator = new UnitType("eradicator", GroundUnit::new){{
maxVelocity = 0.68f;
speed = 0.12f;
drag = 0.4f;
@@ -238,7 +238,7 @@ public class UnitTypes implements ContentList{
}};
}};
wraith = new UnitType("wraith", Wraith::new){{
wraith = new UnitType("wraith", FlyingUnit::new){{
speed = 0.3f;
maxVelocity = 1.9f;
drag = 0.01f;
@@ -257,7 +257,7 @@ public class UnitTypes implements ContentList{
}};
}};
ghoul = new UnitType("ghoul", Ghoul::new){{
ghoul = new UnitType("ghoul", FlyingUnit::new){{
health = 220;
speed = 0.2f;
maxVelocity = 1.4f;
@@ -281,7 +281,7 @@ public class UnitTypes implements ContentList{
}};
}};
revenant = new UnitType("revenant", Revenant::new){{
revenant = new UnitType("revenant", HoverUnit::new){{
health = 1000;
mass = 5f;
hitsize = 20f;
@@ -312,7 +312,7 @@ public class UnitTypes implements ContentList{
}};
}};
lich = new UnitType("lich", Revenant::new){{
lich = new UnitType("lich", HoverUnit::new){{
health = 6000;
mass = 20f;
hitsize = 40f;
@@ -345,7 +345,7 @@ public class UnitTypes implements ContentList{
}};
}};
reaper = new UnitType("reaper", Revenant::new){{
reaper = new UnitType("reaper", HoverUnit::new){{
health = 11000;
mass = 30f;
hitsize = 56f;

View File

@@ -3,9 +3,11 @@ package io.anuke.mindustry.core;
import io.anuke.arc.collection.*;
import io.anuke.arc.func.*;
import io.anuke.arc.graphics.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.bullet.*;
import io.anuke.mindustry.mod.Mods.*;
import io.anuke.mindustry.type.*;
@@ -20,10 +22,11 @@ import static io.anuke.mindustry.Vars.mods;
*/
@SuppressWarnings("unchecked")
public class ContentLoader{
private boolean loaded = false;
private ObjectMap<String, MappableContent>[] contentNameMap = new ObjectMap[ContentType.values().length];
private Array<Content>[] contentMap = new Array[ContentType.values().length];
private MappableContent[][] temporaryMapper;
private @Nullable LoadedMod currentMod;
private @Nullable Content lastAdded;
private ObjectSet<Cons<Content>> initialization = new ObjectSet<>();
private ContentList[] content = {
new Fx(),
@@ -43,35 +46,40 @@ public class ContentLoader{
new LegacyColorMapper(),
};
public ContentLoader(){
clear();
}
/** Clears all initialized content.*/
public void clear(){
contentNameMap = new ObjectMap[ContentType.values().length];
contentMap = new Array[ContentType.values().length];
initialization = new ObjectSet<>();
loaded = false;
}
/** Creates all content types. */
public void createContent(){
if(loaded){
Log.info("Content already loaded, skipping.");
return;
}
for(ContentType type : ContentType.values()){
contentMap[type.ordinal()] = new Array<>();
contentNameMap[type.ordinal()] = new ObjectMap<>();
}
}
/** Creates all base types. */
public void createBaseContent(){
for(ContentList list : content){
list.load();
}
}
/** Creates mod content, if applicable. */
public void createModContent(){
if(mods != null){
mods.loadContent();
}
}
//check up ID mapping, make sure it's linear
/** Logs content statistics.*/
public void logContent(){
//check up ID mapping, make sure it's linear (debug only)
for(Array<Content> arr : contentMap){
for(int i = 0; i < arr.size; i++){
int id = arr.get(i).id;
@@ -81,17 +89,12 @@ public class ContentLoader{
}
}
loaded = true;
}
/** Logs content statistics.*/
public void logContent(){
Log.info("--- CONTENT INFO ---");
Log.debug("--- CONTENT INFO ---");
for(int k = 0; k < contentMap.length; k++){
Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size);
Log.debug("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size);
}
Log.info("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum());
Log.info("-------------------");
Log.debug("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum());
Log.debug("-------------------");
}
/** Calls Content#init() on everything. Use only after all modules have been created.*/
@@ -113,8 +116,8 @@ public class ContentLoader{
try{
callable.get(content);
}catch(Throwable e){
if(content.mod != null){
mods.handleError(new ModLoadException(content, e), content.mod);
if(content.minfo.mod != null){
mods.handleContentError(content, e);
}else{
throw new RuntimeException(e);
}
@@ -145,15 +148,41 @@ public class ContentLoader{
//clear all content, currently not used
}
public void handleContent(Content content){
contentMap[content.getContentType().ordinal()].add(content);
/** Get last piece of content created for error-handling purposes. */
public @Nullable Content getLastAdded(){
return lastAdded;
}
/** Remove last content added in case of an exception. */
public void removeLast(){
if(lastAdded != null && contentMap[lastAdded.getContentType().ordinal()].peek() == lastAdded){
contentMap[lastAdded.getContentType().ordinal()].pop();
if(lastAdded instanceof MappableContent){
contentNameMap[lastAdded.getContentType().ordinal()].remove(((MappableContent)lastAdded).name);
}
}
}
public void handleContent(Content content){
this.lastAdded = content;
contentMap[content.getContentType().ordinal()].add(content);
}
public void setCurrentMod(@Nullable LoadedMod mod){
this.currentMod = mod;
}
public String transformName(String name){
return currentMod == null ? name : currentMod.name + "-" + name;
}
public void handleMappableContent(MappableContent content){
if(contentNameMap[content.getContentType().ordinal()].containsKey(content.name)){
throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + content.name + "')");
}
if(currentMod != null){
content.minfo.mod = currentMod;
}
contentNameMap[content.getContentType().ordinal()].put(content.name, content);
}

View File

@@ -262,6 +262,7 @@ public class Control implements ApplicationListener, Loadable{
}
}
state.set(State.playing);
state.wavetime = state.rules.waveSpacing;
control.saves.zoneSave();
logic.play();
Events.fire(Trigger.newGame);
@@ -451,12 +452,12 @@ public class Control implements ApplicationListener, Loadable{
platform.updateRPC();
}
if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){
state.set(state.is(State.playing) ? State.paused : State.playing);
}
if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown()){
if(ui.chatfrag.chatOpen()){
if(ui.chatfrag.shown()){
ui.chatfrag.hide();
}else if(!ui.paused.isShown() && !scene.hasDialog()){
ui.paused.show();
@@ -464,7 +465,7 @@ public class Control implements ApplicationListener, Loadable{
}
}
if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !ui.chatfrag.chatOpen()){
if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !scene.hasKeyboard()){
renderer.takeMapScreenshot();
}

View File

@@ -7,16 +7,18 @@ import io.anuke.arc.files.*;
/** Handles files in a modded context. */
public class FileTree implements FileHandleResolver{
private ObjectMap<String, FileHandle> files = new ObjectMap<>();
private ObjectMap<String, Fi> files = new ObjectMap<>();
public void addFile(String path, FileHandle f){
public void addFile(String path, Fi f){
files.put(path, f);
}
/** Gets an asset file.*/
public FileHandle get(String path){
public Fi get(String path){
if(files.containsKey(path)){
return files.get(path);
}else if(files.containsKey("/" + path)){
return files.get("/" + path);
}else{
return Core.files.internal(path);
}
@@ -28,7 +30,7 @@ public class FileTree implements FileHandleResolver{
}
@Override
public FileHandle resolve(String fileName){
public Fi resolve(String fileName){
return get(fileName);
}
}

View File

@@ -52,7 +52,7 @@ public class Logic implements ApplicationListener{
if(block instanceof BuildBlock){
BuildEntity entity = tile.entity();
BuildEntity entity = tile.ent();
//update block to reflect the fact that something was being constructed
if(entity.cblock != null && entity.cblock.synthetic()){

View File

@@ -11,6 +11,7 @@ import io.anuke.arc.util.io.*;
import io.anuke.arc.util.serialization.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.core.GameState.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
import io.anuke.mindustry.entities.traits.*;
@@ -22,7 +23,6 @@ import io.anuke.mindustry.net.Administration.*;
import io.anuke.mindustry.net.Net.*;
import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.TypeID;
import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.modules.*;
@@ -491,7 +491,7 @@ public class NetClient implements ApplicationListener{
player.pointerX, player.pointerY, player.rotation, player.baseRotation,
player.velocity().x, player.velocity().y,
player.getMineTile(),
player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(), player.isBuilding,
player.isBoosting, player.isShooting, ui.chatfrag.shown(), player.isBuilding,
requests,
Core.camera.position.x, Core.camera.position.y,
Core.camera.width * viewScale, Core.camera.height * viewScale);

View File

@@ -66,6 +66,10 @@ public class NetServer implements ApplicationListener{
});
net.handleServer(ConnectPacket.class, (con, packet) -> {
if(con.address.startsWith("steam:")){
packet.uuid = con.address.substring("steam:".length());
}
String uuid = packet.uuid;
if(admins.isIPBanned(con.address)) return;
@@ -215,7 +219,7 @@ public class NetServer implements ApplicationListener{
@Override
public void init(){
mods.each(mod -> mod.registerClientCommands(clientCommands));
mods.eachClass(mod -> mod.registerClientCommands(clientCommands));
}
private void registerCommands(){

View File

@@ -8,10 +8,12 @@ import io.anuke.arc.func.*;
import io.anuke.arc.math.*;
import io.anuke.arc.scene.ui.*;
import io.anuke.arc.util.serialization.*;
import io.anuke.mindustry.mod.*;
import io.anuke.mindustry.net.*;
import io.anuke.mindustry.net.Net.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.ui.dialogs.*;
import org.mozilla.javascript.*;
import static io.anuke.mindustry.Vars.mobile;
@@ -33,7 +35,7 @@ public interface Platform{
default void viewListingID(String mapid){}
/** Steam: Return external workshop maps to be loaded.*/
default Array<FileHandle> getWorkshopContent(Class<? extends Publishable> type){
default Array<Fi> getWorkshopContent(Class<? extends Publishable> type){
return new Array<>(0);
}
@@ -42,7 +44,18 @@ public interface Platform{
/** Get the networking implementation.*/
default NetProvider getNet(){
return new ArcNetImpl();
return new ArcNetProvider();
}
/** Gets the scripting implementation. */
default Scripts createScripts(){
return new Scripts();
}
default Context getScriptContext(){
Context c = Context.enter();
c.setOptimizationLevel(9);
return c;
}
/** Add a text input dialog that should show up after the field is tapped. */
@@ -87,7 +100,7 @@ public interface Platform{
}
/** Only used for iOS or android: open the share menu for a map or save. */
default void shareFile(FileHandle file){
default void shareFile(Fi file){
}
/**
@@ -96,7 +109,7 @@ public interface Platform{
* @param open Whether to open or save files
* @param extension File extension to filter
*/
default void showFileChooser(boolean open, String extension, Cons<FileHandle> cons){
default void showFileChooser(boolean open, String extension, Cons<Fi> cons){
new FileChooser(open ? "$open" : "$save", file -> file.extension().toLowerCase().equals(extension), open, file -> {
if(!open){
cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension));

View File

@@ -456,7 +456,7 @@ public class Renderer implements ApplicationListener{
buffer.end();
Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888);
BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length);
FileHandle file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png");
Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png");
PixmapIO.writePNG(file, fullPixmap);
fullPixmap.dispose();
ui.showInfoFade(Core.bundle.format("screenshot", file.toString()));

View File

@@ -42,6 +42,7 @@ public class UI implements ApplicationListener, Loadable{
public MenuFragment menufrag;
public HudFragment hudfrag;
public ChatFragment chatfrag;
public ScriptConsoleFragment scriptfrag;
public PlayerListFragment listfrag;
public LoadingFragment loadfrag;
@@ -137,7 +138,7 @@ public class UI implements ApplicationListener, Loadable{
Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver){
@Override
public BitmapFont loadSync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter){
public BitmapFont loadSync(AssetManager manager, String fileName, Fi file, FreeTypeFontLoaderParameter parameter){
if(fileName.equals("outline")){
parameter.fontParameters.borderWidth = Scl.scl(2f);
parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth;
@@ -211,6 +212,7 @@ public class UI implements ApplicationListener, Loadable{
chatfrag = new ChatFragment();
listfrag = new PlayerListFragment();
loadfrag = new LoadingFragment();
scriptfrag = new ScriptConsoleFragment();
picker = new ColorPicker();
editor = new MapEditorDialog();
@@ -253,6 +255,7 @@ public class UI implements ApplicationListener, Loadable{
menufrag.build(menuGroup);
chatfrag.container().build(hudGroup);
listfrag.build(hudGroup);
scriptfrag.container().build(hudGroup);
loadfrag.build(group);
new FadeInFragment().build(group);
}
@@ -371,6 +374,37 @@ public class UI implements ApplicationListener, Loadable{
}}.show();
}
public void showExceptions(String text, String... messages){
loadfrag.hide();
new Dialog(""){{
setFillParent(true);
cont.margin(15);
cont.add("$error.title").colspan(2);
cont.row();
cont.addImage().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet);
cont.row();
cont.add(text).colspan(2).wrap().growX().center().get().setAlignment(Align.center);
cont.row();
//cont.pane(p -> {
for(int i = 0; i < messages.length; i += 2){
String btext = messages[i];
String details = messages[i + 1];
Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(details).color(Color.lightGray).left()), true);
cont.add(btext).right();
cont.addButton("$details", Styles.togglet, col::toggle).size(180f, 50f).checked(b -> !col.isCollapsed()).fillX().left();
cont.row();
cont.add(col).colspan(2).pad(2);
cont.row();
}
//}).colspan(2);
cont.addButton("$ok", this::hide).size(300, 50).fillX().colspan(2);
}}.show();
}
public void showText(String titleText, String text){
showText(titleText, text, Align.center);
}

View File

@@ -7,8 +7,6 @@ import io.anuke.arc.files.*;
import io.anuke.arc.util.*;
import io.anuke.arc.util.io.*;
import java.io.*;
public class Version{
/** Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used. */
public static String type;
@@ -26,29 +24,25 @@ public class Version{
public static void init(){
if(!enabled) return;
try{
FileHandle file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new FileHandle("version.properties", FileType.Internal);
Fi file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new Fi("version.properties", FileType.internal);
ObjectMap<String, String> map = new ObjectMap<>();
PropertiesUtils.load(map, file.reader());
ObjectMap<String, String> map = new ObjectMap<>();
PropertiesUtils.load(map, file.reader());
type = map.get("type");
number = Integer.parseInt(map.get("number", "4"));
modifier = map.get("modifier");
if(map.get("build").contains(".")){
String[] split = map.get("build").split("\\.");
try{
build = Integer.parseInt(split[0]);
revision = Integer.parseInt(split[1]);
}catch(Throwable e){
e.printStackTrace();
build = -1;
}
}else{
build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1;
type = map.get("type");
number = Integer.parseInt(map.get("number", "4"));
modifier = map.get("modifier");
if(map.get("build").contains(".")){
String[] split = map.get("build").split("\\.");
try{
build = Integer.parseInt(split[0]);
revision = Integer.parseInt(split[1]);
}catch(Throwable e){
e.printStackTrace();
build = -1;
}
}catch(IOException e){
throw new RuntimeException(e);
}else{
build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1;
}
}
}

View File

@@ -4,16 +4,14 @@ import io.anuke.arc.files.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.mod.Mods.*;
import io.anuke.mindustry.type.*;
/** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */
public abstract class Content implements Comparable<Content>{
public final short id;
/** The mod that loaded this piece of content. */
public @Nullable LoadedMod mod;
/** File that this content was loaded from. */
public @Nullable FileHandle sourceFile;
/** Info on which mod this content was loaded from. */
public @NonNull ModContentInfo minfo = new ModContentInfo();
public Content(){
this.id = (short)Vars.content.getBy(getContentType()).size;
@@ -37,6 +35,11 @@ public abstract class Content implements Comparable<Content>{
public void load(){
}
/** @return whether an error ocurred during mod loading. */
public boolean hasErrored(){
return minfo.error != null;
}
@Override
public int compareTo(Content c){
return Integer.compare(id, c.id);
@@ -46,4 +49,15 @@ public abstract class Content implements Comparable<Content>{
public String toString(){
return getContentType().name() + "#" + id;
}
public static class ModContentInfo{
/** The mod that loaded this piece of content. */
public @Nullable LoadedMod mod;
/** File that this content was loaded from. */
public @Nullable Fi sourceFile;
/** The error that occurred during loading, if applicable. Null if no error occurred. */
public @Nullable String error;
/** Base throwable that caused the error. */
public @Nullable Throwable baseError;
}
}

View File

@@ -1,4 +1,4 @@
package io.anuke.mindustry.type;
package io.anuke.mindustry.ctype;
/** Do not rearrange, ever! */
public enum ContentType{
@@ -13,7 +13,8 @@ public enum ContentType{
effect,
zone,
loadout,
typeid;
typeid,
error;
public static final ContentType[] all = values();
}

View File

@@ -6,7 +6,7 @@ public abstract class MappableContent extends Content{
public final String name;
public MappableContent(String name){
this.name = name;
this.name = Vars.content.transformName(name);
Vars.content.handleMappableContent(this);
}

View File

@@ -20,8 +20,8 @@ public abstract class UnlockableContent extends MappableContent{
public UnlockableContent(String name){
super(name);
this.localizedName = Core.bundle.get(getContentType() + "." + name + ".name", name);
this.description = Core.bundle.getOrNull(getContentType() + "." + name + ".description");
this.localizedName = Core.bundle.get(getContentType() + "." + this.name + ".name", this.name);
this.description = Core.bundle.getOrNull(getContentType() + "." + this.name + ".description");
}
/** Generate any special icons for this content. Called asynchronously.*/
@@ -42,11 +42,6 @@ public abstract class UnlockableContent extends MappableContent{
return cicons[icon.ordinal()];
}
/** Returns the localized name of this content. */
public abstract String localizedName();
//public abstract TextureRegion getContentIcon();
/** This should show all necessary info about this content in the specified table. */
public abstract void displayInfo(Table table);

View File

@@ -1,7 +1,7 @@
package io.anuke.mindustry.editor;
import io.anuke.arc.collection.StringMap;
import io.anuke.arc.files.FileHandle;
import io.anuke.arc.files.Fi;
import io.anuke.arc.func.Cons;
import io.anuke.arc.func.Boolf;
import io.anuke.arc.graphics.Pixmap;
@@ -109,7 +109,7 @@ public class MapEditor{
}
}
public Map createMap(FileHandle file){
public Map createMap(Fi file){
return new Map(file, width(), height(), new StringMap(tags), true);
}

View File

@@ -133,7 +133,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
}else{
ui.loadAnd(() -> {
try{
FileHandle result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension);
Fi result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension);
MapIO.writeMap(result, editor.createMap(result));
platform.shareFile(result);
}catch(Exception e){
@@ -381,7 +381,7 @@ public class MapEditorDialog extends Dialog implements Disposable{
editor.renderer().dispose();
}
public void beginEditMap(FileHandle file){
public void beginEditMap(Fi file){
ui.loadAnd(() -> {
try{
shownWithMap = true;

View File

@@ -12,6 +12,7 @@ import io.anuke.arc.scene.ui.layout.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.graphics.*;

View File

@@ -38,7 +38,7 @@ public class Damage{
}
for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){
Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f)));
Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1, 1));
}
int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30);

View File

@@ -4,6 +4,7 @@ import io.anuke.arc.Core;
import io.anuke.arc.collection.Array;
import io.anuke.arc.func.Cons;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Position;
import io.anuke.arc.util.pooling.Pools;
@@ -36,6 +37,7 @@ public class Effects{
public static void renderEffect(int id, Effect render, Color color, float life, float rotation, float x, float y, Object data){
container.set(id, color, life, render.lifetime, rotation, x, y, data);
render.draw.render(container);
Draw.reset();
}
public static Effect getEffect(int id){

View File

@@ -4,6 +4,7 @@ import io.anuke.arc.audio.*;
import io.anuke.arc.math.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.Content;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.Effects.*;
import io.anuke.mindustry.entities.effect.*;
@@ -137,7 +138,7 @@ public abstract class BulletType extends Content{
}
for(int i = 0; i < lightining; i++){
Lightning.create(b.getTeam(), Pal.surge, damage, b.x, b.y, Mathf.random(360f), lightningLength);
Lightning.createLighting(Lightning.nextSeed(), b.getTeam(), Pal.surge, damage, b.x, b.y, Mathf.random(360f), lightningLength);
}
}
@@ -150,7 +151,7 @@ public abstract class BulletType extends Content{
public void update(Bullet b){
if(homingPower > 0.0001f){
TargetTrait target = Units.closestTarget(b.getTeam(), b.x, b.y, homingRange);
TargetTrait target = Units.closestTarget(b.getTeam(), b.x, b.y, homingRange, e -> !e.isFlying() || collidesAir);
if(target != null){
b.velocity().setAngle(Mathf.slerpDelta(b.velocity().angle(), b.angleTo(target), 0.08f));
}

View File

@@ -10,10 +10,10 @@ import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.entities.type.TimedEntity;
import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.type.TypeID;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*;
import java.io.*;
@@ -144,7 +144,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait{
create(other);
if(Mathf.chance(fireballChance * Time.delta() * Mathf.clamp(flammability / 10f))){
Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f));
Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1, 1);
}
}

View File

@@ -44,7 +44,11 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{
/** Create a lighting branch at a location. Use Team.none to damage everyone. */
public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){
Call.createLighting(lastSeed++, team, color, damage, x, y, targetAngle, length);
Call.createLighting(nextSeed(), team, color, damage, x, y, targetAngle, length);
}
public static int nextSeed(){
return lastSeed++;
}
/** Do not invoke! */

View File

@@ -1,25 +1,22 @@
package io.anuke.mindustry.entities.effect;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.arc.collection.IntMap;
import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.Fill;
import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.collection.*;
import io.anuke.arc.graphics.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*;
import io.anuke.arc.math.geom.*;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.pooling.Pool.Poolable;
import io.anuke.arc.util.pooling.Pools;
import io.anuke.arc.util.*;
import io.anuke.arc.util.pooling.Pool.*;
import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.type.SolidEntity;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.type.TypeID;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.type.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.gen.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*;
import java.io.*;
@@ -118,7 +115,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai
(liquid.flammability > 0.3f && dest.temperature > 0.7f)){ //flammable liquid + hot liquid
Fire.create(tile);
if(Mathf.chance(0.006 * amount)){
Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f));
Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1f, 1f);
}
}else if(dest.temperature > 0.7f && liquid.temperature < 0.55f){ //cold liquid poured onto hot puddle
if(Mathf.chance(0.5f * amount)){

View File

@@ -2,7 +2,6 @@ package io.anuke.mindustry.entities.traits;
import io.anuke.arc.*;
import io.anuke.arc.collection.Queue;
import io.anuke.arc.collection.*;
import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.*;
import io.anuke.arc.math.geom.*;
@@ -88,7 +87,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
}
//otherwise, update it.
BuildEntity entity = tile.entity();
BuildEntity entity = tile.ent();
if(entity == null){
return;
@@ -210,7 +209,7 @@ public interface BuilderTrait extends Entity, TeamTrait{
}
Tile tile = world.tile(place.x, place.y);
if(tile != null && tile.entity instanceof BuildEntity){
place.progress = tile.<BuildEntity>entity().progress;
place.progress = tile.<BuildEntity>ent().progress;
}
if(tail){
buildQueue().addLast(place);

View File

@@ -9,6 +9,7 @@ import io.anuke.arc.util.*;
import io.anuke.arc.util.ArcAnnotate.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.units.*;
@@ -107,7 +108,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
public @Nullable UnitCommand getCommand(){
if(isCommanded()){
return indexer.getAllied(team, BlockFlag.comandCenter).first().<CommandCenterEntity>entity().command;
return indexer.getAllied(team, BlockFlag.comandCenter).first().<CommandCenterEntity>ent().command;
}
return null;
}

View File

@@ -77,16 +77,9 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool
return create(type, parent.owner, parent.team, x, y, angle, velocityScl);
}
/** Internal use only. */
@Remote(called = Loc.server, unreliable = true)
public static void createBullet(BulletType type, float x, float y, float angle){
create(type, null, Team.derelict, x, y, angle);
}
/** ok */
@Remote(called = Loc.server, unreliable = true)
public static void createBullet(BulletType type, Team team, float x, float y, float angle){
create(type, null, team, x, y, angle);
public static void createBullet(BulletType type, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl){
create(type, null, team, x, y, angle, velocityScl, lifetimeScl, null);
}
public Entity getOwner(){

View File

@@ -15,6 +15,7 @@ import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.core.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.game.*;
@@ -556,7 +557,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
updateKeyboard();
}
isTyping = ui.chatfrag.chatOpen();
isTyping = ui.chatfrag.shown();
updateMechanics();
@@ -604,7 +605,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
movement.limit(speed).scl(Time.delta());
if(!ui.chatfrag.chatOpen()){
if(!Core.scene.hasKeyboard()){
velocity.add(movement.x, movement.y);
}else{
isShooting = false;
@@ -613,7 +614,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{
updateVelocityStatus();
moved = dst(prex, prey) > 0.001f;
if(!ui.chatfrag.chatOpen()){
if(!Core.scene.hasKeyboard()){
float baseLerp = mech.getRotationAlpha(this);
if(!isShooting() || !mech.turnCursor){
if(!movement.isZero()){

View File

@@ -37,7 +37,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{
public PowerModule power;
public ItemModule items;
public LiquidModule liquids;
public ConsumeModule cons;
public @Nullable ConsumeModule cons;
/** List of (cached) tiles with entities in proximity, used for outputting to */
private Array<Tile> proximity = new Array<>(8);

View File

@@ -24,6 +24,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{
private static final IntIntMap totals = new IntIntMap();
protected Queue<BuildRequest> placeQueue = new Queue<>();
protected BuildRequest lastFound;
protected boolean isBreaking;
protected Player playerTarget;
@@ -57,6 +58,9 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{
buildQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y));
}else{
buildQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y, entity.tile.rotation(), entity.cblock));
if(lastFound != null && lastFound.hasConfig){
buildQueue().last().configure(lastFound.config);
}
}
}
@@ -171,9 +175,10 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{
BuildRequest req = player.buildRequest();
Tile tile = world.tile(req.x, req.y);
if(tile != null && tile.entity instanceof BuildEntity){
BuildEntity b = tile.entity();
BuildEntity b = tile.ent();
float dist = Math.min(b.dst(x, y) - placeDistance, 0);
if(dist / type.maxVelocity < b.buildCost * 0.9f){
lastFound = req;
target = b;
this.isBreaking = req.breaking;
setState(build);

View File

@@ -1,4 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Crawler extends GroundUnit{
}

View File

@@ -1,5 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Dagger extends GroundUnit{
}

View File

@@ -1,4 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Draug extends MinerDrone{
}

View File

@@ -1,4 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Eruptor extends GroundUnit{
}

View File

@@ -1,4 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Fortress extends GroundUnit{
}

View File

@@ -1,5 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Ghoul extends FlyingUnit{
}

View File

@@ -5,7 +5,7 @@ import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf;
import io.anuke.mindustry.entities.Units;
public class Revenant extends FlyingUnit{
public class HoverUnit extends FlyingUnit{
@Override
public void drawWeapons(){

View File

@@ -1,5 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Phantom extends BuilderDrone{
}

View File

@@ -1,4 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Spirit extends RepairDrone{
}

View File

@@ -1,5 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Titan extends GroundUnit{
}

View File

@@ -1,5 +0,0 @@
package io.anuke.mindustry.entities.type.base;
public class Wraith extends FlyingUnit{
}

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.graphics.*;
import io.anuke.arc.util.*;
import io.anuke.arc.util.pooling.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.type.*;

View File

@@ -95,6 +95,10 @@ public class EventType{
}
public static class ServerLoadEvent{
}
public static class ContentReloadEvent{
}
@@ -135,9 +139,19 @@ public class EventType{
}
/** Called when a player withdraws items from a block. Tutorial only.*/
/** Called when the player withdraws items from a block. */
public static class WithdrawEvent{
public final Tile tile;
public final Player player;
public final Item item;
public final int amount;
public WithdrawEvent(Tile tile, Player player, Item item, int amount){
this.tile = tile;
this.player = player;
this.item = item;
this.amount = amount;
}
}
/** Called when a player deposits items to a block.*/

View File

@@ -6,7 +6,7 @@ import io.anuke.arc.files.*;
import io.anuke.arc.util.io.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.UnlockableContent;
import io.anuke.mindustry.ctype.*;
import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.type.*;
@@ -35,8 +35,8 @@ public class GlobalData{
});
}
public void exportData(FileHandle file) throws IOException{
Array<FileHandle> files = new Array<>();
public void exportData(Fi file) throws IOException{
Array<Fi> files = new Array<>();
files.add(Core.settings.getSettingsFile());
files.addAll(customMapDirectory.list());
files.addAll(saveDirectory.list());
@@ -46,7 +46,7 @@ public class GlobalData{
String base = Core.settings.getDataDirectory().path();
try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){
for(FileHandle add : files){
for(Fi add : files){
if(add.isDirectory()) continue;
zos.putNextEntry(new ZipEntry(add.path().substring(base.length())));
Streams.copyStream(add.read(), zos);
@@ -56,12 +56,12 @@ public class GlobalData{
}
}
public void importData(FileHandle file){
FileHandle dest = Core.files.local("zipdata.zip");
public void importData(Fi file){
Fi dest = Core.files.local("zipdata.zip");
file.copyTo(dest);
FileHandle zipped = new ZipFileHandle(dest);
Fi zipped = new ZipFi(dest);
FileHandle base = Core.settings.getDataDirectory();
Fi base = Core.settings.getDataDirectory();
if(!zipped.child("settings.bin").exists()){
throw new IllegalArgumentException("Not valid save data.");
}

View File

@@ -27,7 +27,7 @@ public class Saves{
private AsyncExecutor previewExecutor = new AsyncExecutor(1);
private boolean saving;
private float time;
private FileHandle zoneFile;
private Fi zoneFile;
private long totalPlaytime;
private long lastTimestamp;
@@ -48,7 +48,7 @@ public class Saves{
saves.clear();
zoneFile = saveDirectory.child("-1.msav");
for(FileHandle file : saveDirectory.list()){
for(Fi file : saveDirectory.list()){
if(!file.name().contains("backup") && SaveIO.isSaveValid(file)){
SaveSlot slot = new SaveSlot(file);
saves.add(slot);
@@ -121,7 +121,7 @@ public class Saves{
return slot;
}
public SaveSlot importSave(FileHandle file) throws IOException{
public SaveSlot importSave(Fi file) throws IOException{
SaveSlot slot = new SaveSlot(getNextSlotFile());
slot.importFile(file);
slot.setName(file.nameWithoutExtension());
@@ -136,9 +136,9 @@ public class Saves{
return slot == null || slot.getZone() == null ? null : slot;
}
public FileHandle getNextSlotFile(){
public Fi getNextSlotFile(){
int i = 0;
FileHandle file;
Fi file;
while((file = saveDirectory.child(i + "." + saveExtension)).exists()){
i ++;
}
@@ -151,11 +151,11 @@ public class Saves{
public class SaveSlot{
//public final int index;
public final FileHandle file;
public final Fi file;
boolean requestedPreview;
SaveMeta meta;
public SaveSlot(FileHandle file){
public SaveSlot(Fi file){
this.file = file;
}
@@ -216,11 +216,11 @@ public class Saves{
return file.nameWithoutExtension();
}
private FileHandle previewFile(){
private Fi previewFile(){
return mapPreviewDirectory.child("save_slot_" + index() + ".png");
}
private FileHandle loadPreviewFile(){
private Fi loadPreviewFile(){
return previewFile().sibling(previewFile().name() + ".spreview");
}
@@ -293,7 +293,7 @@ public class Saves{
Core.settings.save();
}
public void importFile(FileHandle from) throws IOException{
public void importFile(Fi from) throws IOException{
try{
from.copyTo(file);
}catch(Exception e){
@@ -301,7 +301,7 @@ public class Saves{
}
}
public void exportFile(FileHandle to) throws IOException{
public void exportFile(Fi to) throws IOException{
try{
file.copyTo(to);
}catch(Exception e){

View File

@@ -16,7 +16,8 @@ public class Schematic implements Publishable, Comparable<Schematic>{
public final Array<Stile> tiles;
public StringMap tags;
public int width, height;
public @Nullable FileHandle file;
public @Nullable
Fi file;
/** Associated mod. If null, no mod is associated with this schematic. */
public @Nullable LoadedMod mod;
@@ -94,15 +95,15 @@ public class Schematic implements Publishable, Comparable<Schematic>{
}
@Override
public FileHandle createSteamFolder(String id){
FileHandle directory = tmpDirectory.child("schematic_" + id).child("schematic." + schematicExtension);
public Fi createSteamFolder(String id){
Fi directory = tmpDirectory.child("schematic_" + id).child("schematic." + schematicExtension);
file.copyTo(directory);
return directory;
}
@Override
public FileHandle createSteamPreview(String id){
FileHandle preview = tmpDirectory.child("schematic_preview_" + id + ".png");
public Fi createSteamPreview(String id){
Fi preview = tmpDirectory.child("schematic_preview_" + id + ".png");
schematics.savePreview(this, preview);
return preview;
}

View File

@@ -13,12 +13,12 @@ import io.anuke.arc.util.io.Streams.*;
import io.anuke.arc.util.serialization.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.traits.BuilderTrait.*;
import io.anuke.mindustry.game.EventType.*;
import io.anuke.mindustry.game.Schematic.*;
import io.anuke.mindustry.input.*;
import io.anuke.mindustry.input.Placement.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.blocks.*;
import io.anuke.mindustry.world.blocks.production.*;
@@ -69,7 +69,7 @@ public class Schematics implements Loadable{
public void load(){
all.clear();
for(FileHandle file : schematicDirectory.list()){
for(Fi file : schematicDirectory.list()){
loadFile(file);
}
@@ -111,7 +111,7 @@ public class Schematics implements Loadable{
}
}
private @Nullable Schematic loadFile(FileHandle file){
private @Nullable Schematic loadFile(Fi file){
if(!file.extension().equals(schematicExtension)) return null;
try{
@@ -144,7 +144,7 @@ public class Schematics implements Loadable{
}
}
public void savePreview(Schematic schematic, FileHandle file){
public void savePreview(Schematic schematic, Fi file){
FrameBuffer buffer = getBuffer(schematic);
Draw.flush();
buffer.begin();
@@ -272,7 +272,7 @@ public class Schematics implements Loadable{
public void add(Schematic schematic){
all.add(schematic);
try{
FileHandle file = schematicDirectory.child(Time.millis() + "." + schematicExtension);
Fi file = schematicDirectory.child(Time.millis() + "." + schematicExtension);
write(schematic, file);
schematic.file = file;
}catch(Exception e){
@@ -372,7 +372,7 @@ public class Schematics implements Loadable{
return read(new ByteArrayInputStream(Base64Coder.decode(schematic)));
}
public static Schematic read(FileHandle file) throws IOException{
public static Schematic read(Fi file) throws IOException{
Schematic s = read(new DataInputStream(file.read(1024)));
if(!s.tags.containsKey("name")){
s.tags.put("name", file.nameWithoutExtension());
@@ -425,7 +425,7 @@ public class Schematics implements Loadable{
}
}
public static void write(Schematic schematic, FileHandle file) throws IOException{
public static void write(Schematic schematic, Fi file) throws IOException{
write(schematic, file.write(false, 1024));
}

View File

@@ -4,6 +4,7 @@ import io.anuke.arc.util.serialization.Json;
import io.anuke.arc.util.serialization.Json.Serializable;
import io.anuke.arc.util.serialization.JsonValue;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.type.BaseUnit;
import io.anuke.mindustry.type.*;

View File

@@ -138,7 +138,7 @@ public class BlockRenderer implements Disposable{
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.53f * brokenFade);
Draw.alpha(0.33f * 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);
}

View File

@@ -40,8 +40,7 @@ public enum Binding implements KeyBind{
block_select_08(KeyCode.NUM_8),
block_select_09(KeyCode.NUM_9),
block_select_10(KeyCode.NUM_0),
zoom_hold(KeyCode.CONTROL_LEFT, "view"),
zoom(new Axis(KeyCode.SCROLL)),
zoom(new Axis(KeyCode.SCROLL), "view"),
menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE),
fullscreen(KeyCode.F11),
pause(KeyCode.SPACE),
@@ -54,6 +53,7 @@ public enum Binding implements KeyBind{
chat_history_prev(KeyCode.UP),
chat_history_next(KeyCode.DOWN),
chat_scroll(new Axis(KeyCode.SCROLL)),
console(KeyCode.F8),
;
private final KeybindValue defaultValue;

View File

@@ -122,7 +122,7 @@ public class DesktopInput extends InputHandler{
drawSelected(sreq.x, sreq.y, sreq.block, getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null ? Pal.remove : Pal.accent);
}
if(Core.input.keyDown(Binding.schematic_select) && !ui.chatfrag.chatOpen()){
if(Core.input.keyDown(Binding.schematic_select) && !Core.scene.hasKeyboard()){
drawSelection(schemX, schemY, cursorX, cursorY, Vars.maxSchematicSize);
}
@@ -139,7 +139,7 @@ public class DesktopInput extends InputHandler{
player.isShooting = false;
}
if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !ui.chatfrag.chatOpen() && !(scene.getKeyboardFocus() instanceof TextField)){
if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !Core.scene.hasKeyboard() && !(scene.getKeyboardFocus() instanceof TextField)){
if(!ui.minimap.isShown()){
ui.minimap.show();
}else{
@@ -149,8 +149,8 @@ public class DesktopInput extends InputHandler{
if(state.is(State.menu) || Core.scene.hasDialog()) return;
//zoom things
if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && Core.input.keyDown(Binding.zoom_hold)){
//zoom camera
if(!Core.scene.hasScroll() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){
renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
}
@@ -166,11 +166,6 @@ public class DesktopInput extends InputHandler{
mode = none;
}
if(mode != none || isPlacing()){
selectRequests.clear();
lastSchematic = null;
}
if(player.isShooting && !canShoot()){
player.isShooting = false;
}
@@ -182,8 +177,7 @@ public class DesktopInput extends InputHandler{
selectScale = 0f;
}
if(!Core.input.keyDown(Binding.zoom_hold) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){
if(!Core.input.keyDown(Binding.diagonal_placement) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){
rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4);
if(sreq != null){
@@ -293,12 +287,12 @@ public class DesktopInput extends InputHandler{
player.clearBuilding();
}
if(Core.input.keyTap(Binding.schematic_select) && !ui.chatfrag.chatOpen()){
if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard()){
schemX = rawCursorX;
schemY = rawCursorY;
}
if(Core.input.keyTap(Binding.schematic_menu) && !ui.chatfrag.chatOpen()){
if(Core.input.keyTap(Binding.schematic_menu) && !Core.scene.hasKeyboard()){
if(ui.schematics.isShown()){
ui.schematics.hide();
}else{
@@ -311,7 +305,7 @@ public class DesktopInput extends InputHandler{
selectRequests.clear();
}
if(Core.input.keyRelease(Binding.schematic_select) && !ui.chatfrag.chatOpen()){
if(Core.input.keyRelease(Binding.schematic_select) && !Core.scene.hasKeyboard()){
lastSchematic = schematics.create(schemX, schemY, rawCursorX, rawCursorY);
useSchematic(lastSchematic);
if(selectRequests.isEmpty()){
@@ -355,7 +349,9 @@ public class DesktopInput extends InputHandler{
if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){
BuildRequest req = getRequest(cursorX, cursorY);
if(!selectRequests.isEmpty()){
if(Core.input.keyDown(Binding.break_block)){
mode = none;
}else if(!selectRequests.isEmpty()){
flushRequests(selectRequests);
}else if(isPlacing()){
selectX = cursorX;
@@ -371,15 +367,18 @@ public class DesktopInput extends InputHandler{
}else if(selected != null){
//only begin shooting if there's no cursor event
if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.buildQueue().size == 0 || !player.isBuilding) && !droppingItem &&
!tryBeginMine(selected) && player.getMineTile() == null && !ui.chatfrag.chatOpen()){
!tryBeginMine(selected) && player.getMineTile() == null && !Core.scene.hasKeyboard()){
player.isShooting = true;
}
}else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine
}else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine
player.isShooting = true;
}
}else if(Core.input.keyTap(Binding.deselect) && block != null){
}else if(Core.input.keyTap(Binding.deselect) && isPlacing()){
block = null;
mode = none;
}else if(Core.input.keyTap(Binding.deselect) && !selectRequests.isEmpty()){
selectRequests.clear();
lastSchematic = null;
}else if(Core.input.keyTap(Binding.break_block) && !Core.scene.hasMouse()){
//is recalculated because setting the mode to breaking removes potential multiblock cursor offset
deleting = false;

View File

@@ -221,7 +221,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
public boolean requestMatches(BuildRequest request){
Tile tile = world.tile(request.x, request.y);
return tile != null && tile.block() instanceof BuildBlock && tile.<BuildEntity>entity().cblock == request.block;
return tile != null && tile.block() instanceof BuildBlock && tile.<BuildEntity>ent().cblock == request.block;
}
public void drawBreaking(int x, int y){

View File

@@ -587,8 +587,8 @@ public class MobileInput extends InputHandler implements GestureListener{
mode = none;
}
//zoom things
if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && (Core.input.keyDown(Binding.zoom_hold))){
//zoom camera
if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){
renderer.scaleCamera(Core.input.axisTap(Binding.zoom));
}

View File

@@ -1,5 +1,5 @@
package io.anuke.mindustry.input;
enum PlaceMode{
public enum PlaceMode{
none, breaking, placing, schematicSelect
}

View File

@@ -5,6 +5,7 @@ import io.anuke.arc.util.serialization.Json.*;
import io.anuke.mindustry.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*;

View File

@@ -6,10 +6,10 @@ import io.anuke.arc.graphics.*;
import io.anuke.arc.util.*;
import io.anuke.arc.util.serialization.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.io.MapIO.*;
import io.anuke.mindustry.maps.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.*;
import io.anuke.mindustry.world.LegacyColorMapper.*;
import io.anuke.mindustry.world.blocks.*;
@@ -26,7 +26,7 @@ public class LegacyMapIO{
private static final Json json = new Json();
/* Convert a map from the old format to the new format. */
public static void convertMap(FileHandle in, FileHandle out) throws IOException{
public static void convertMap(Fi in, Fi out) throws IOException{
Map map = readMap(in, true);
String waves = map.tags.get("waves", "[]");
@@ -45,7 +45,7 @@ public class LegacyMapIO{
MapIO.writeMap(out, map);
}
public static Map readMap(FileHandle file, boolean custom) throws IOException{
public static Map readMap(Fi file, boolean custom) throws IOException{
try(DataInputStream stream = new DataInputStream(file.read(1024))){
StringMap tags = new StringMap();
@@ -76,11 +76,11 @@ public class LegacyMapIO{
readTiles(map.file, map.width, map.height, tiles);
}
private static void readTiles(FileHandle file, int width, int height, Tile[][] tiles) throws IOException{
private static void readTiles(Fi file, int width, int height, Tile[][] tiles) throws IOException{
readTiles(file, width, height, (x, y) -> tiles[x][y]);
}
private static void readTiles(FileHandle file, int width, int height, TileProvider tiles) throws IOException{
private static void readTiles(Fi file, int width, int height, TileProvider tiles) throws IOException{
try(BufferedInputStream input = file.read(bufferSize)){
//read map

View File

@@ -22,7 +22,7 @@ import static io.anuke.mindustry.Vars.*;
public class MapIO{
private static final int[] pngHeader = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
public static boolean isImage(FileHandle file){
public static boolean isImage(Fi file){
try(InputStream stream = file.read(32)){
for(int i1 : pngHeader){
if(stream.read() != i1){
@@ -35,7 +35,7 @@ public class MapIO{
}
}
public static Map createMap(FileHandle file, boolean custom) throws IOException{
public static Map createMap(Fi file, boolean custom) throws IOException{
try(InputStream is = new InflaterInputStream(file.read(bufferSize)); CounterInputStream counter = new CounterInputStream(is); DataInputStream stream = new DataInputStream(counter)){
SaveIO.readHeader(stream);
int version = stream.readInt();
@@ -46,7 +46,7 @@ public class MapIO{
}
}
public static void writeMap(FileHandle file, Map map) throws IOException{
public static void writeMap(Fi file, Map map) throws IOException{
try{
SaveIO.write(file, map.tags);
}catch(Exception e){

View File

@@ -1,7 +1,7 @@
package io.anuke.mindustry.io;
import io.anuke.arc.collection.*;
import io.anuke.arc.files.FileHandle;
import io.anuke.arc.files.Fi;
import io.anuke.arc.util.io.CounterInputStream;
import io.anuke.arc.util.io.FastDeflaterOutputStream;
import io.anuke.mindustry.Vars;
@@ -34,7 +34,7 @@ public class SaveIO{
return versions.get(version);
}
public static void save(FileHandle file){
public static void save(Fi file){
boolean exists = file.exists();
if(exists) file.moveTo(backupFileFor(file));
try{
@@ -45,15 +45,15 @@ public class SaveIO{
}
}
public static DataInputStream getStream(FileHandle file){
public static DataInputStream getStream(Fi file){
return new DataInputStream(new InflaterInputStream(file.read(bufferSize)));
}
public static DataInputStream getBackupStream(FileHandle file){
public static DataInputStream getBackupStream(Fi file){
return new DataInputStream(new InflaterInputStream(backupFileFor(file).read(bufferSize)));
}
public static boolean isSaveValid(FileHandle file){
public static boolean isSaveValid(Fi file){
try{
return isSaveValid(new DataInputStream(new InflaterInputStream(file.read(bufferSize))));
}catch(Exception e){
@@ -71,7 +71,7 @@ public class SaveIO{
}
}
public static SaveMeta getMeta(FileHandle file){
public static SaveMeta getMeta(Fi file){
try{
return getMeta(getStream(file));
}catch(Exception e){
@@ -92,19 +92,19 @@ public class SaveIO{
}
}
public static FileHandle fileFor(int slot){
public static Fi fileFor(int slot){
return saveDirectory.child(slot + "." + Vars.saveExtension);
}
public static FileHandle backupFileFor(FileHandle file){
public static Fi backupFileFor(Fi file){
return file.sibling(file.name() + "-backup." + file.extension());
}
public static void write(FileHandle file, StringMap tags){
public static void write(Fi file, StringMap tags){
write(new FastDeflaterOutputStream(file.write(false, bufferSize)), tags);
}
public static void write(FileHandle file){
public static void write(Fi file){
write(file, null);
}
@@ -122,17 +122,17 @@ public class SaveIO{
}
}
public static void load(FileHandle file) throws SaveException{
public static void load(Fi file) throws SaveException{
load(file, world.context);
}
public static void load(FileHandle file, WorldContext context) throws SaveException{
public static void load(Fi file, WorldContext context) throws SaveException{
try{
//try and load; if any exception at all occurs
load(new InflaterInputStream(file.read(bufferSize)), context);
}catch(SaveException e){
e.printStackTrace();
FileHandle backup = file.sibling(file.name() + "-backup." + file.extension());
Fi backup = file.sibling(file.name() + "-backup." + file.extension());
if(backup.exists()){
load(new InflaterInputStream(backup.read(bufferSize)), context);
}else{

View File

@@ -12,7 +12,7 @@ public class SavePreviewLoader extends TextureLoader{
}
@Override
public void loadAsync(AssetManager manager, String fileName, FileHandle file, TextureParameter parameter){
public void loadAsync(AssetManager manager, String fileName, Fi file, TextureParameter parameter){
try{
super.loadAsync(manager, fileName, file.sibling(file.nameWithoutExtension()), parameter);
}catch(Exception e){

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.util.io.*;
import io.anuke.mindustry.content.*;
import io.anuke.mindustry.core.*;
import io.anuke.mindustry.ctype.*;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.*;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.game.*;
@@ -84,7 +85,6 @@ public abstract class SaveVersion extends SaveFileReader{
state.rules = JsonIO.read(Rules.class, map.get("rules", "{}"));
if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get();
lastReadBuild = map.getInt("build", -1);
String[] mods = JsonIO.read(String[].class, map.get("mods", "[]"));
Map worldmap = maps.byName(map.get("mapname", "\\\\\\"));
world.setMap(worldmap == null ? new Map(StringMap.of(

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.io;
import io.anuke.annotations.Annotations.ReadClass;
import io.anuke.annotations.Annotations.WriteClass;
import io.anuke.arc.graphics.Color;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.Effects;
import io.anuke.mindustry.entities.Effects.Effect;
import io.anuke.mindustry.entities.type.Bullet;

View File

@@ -12,6 +12,60 @@ Latest data: [build 81]
0 = Player
1 = Fire
2 = Puddle
3 = MinerDrone
4 = RepairDrone
5 = BuilderDrone
6 = GroundUnit
7 = GroundUnit
8 = GroundUnit
9 = GroundUnit
10 = GroundUnit
11 = FlyingUnit
12 = FlyingUnit
13 = Revenant
Before removal of lightining/bullet: [build 80]
0 = Player
1 = Fire
2 = Puddle
3 = Bullet
4 = Lightning
5 = MinerDrone
6 = RepairDrone
7 = BuilderDrone
8 = GroundUnit
9 = GroundUnit
10 = GroundUnit
11 = GroundUnit
12 = GroundUnit
13 = FlyingUnit
14 = FlyingUnit
15 = Revenant
Before addition of new units: [build 79 and below]
0 = Player
1 = Fire
2 = Puddle
3 = Bullet
4 = Lightning
5 = RepairDrone
6 = GroundUnit
7 = GroundUnit
8 = GroundUnit
9 = GroundUnit
10 = GroundUnit
11 = FlyingUnit
12 = FlyingUnit
13 = BuilderDrone
14 = Revenant
*/
public class LegacyTypeTable{
/*
0 = Player
1 = Fire
2 = Puddle
3 = Draug
4 = Spirit
5 = Phantom
@@ -23,97 +77,59 @@ Latest data: [build 81]
11 = Wraith
12 = Ghoul
13 = Revenant
Before removal of lightining/bullet: [build 80]
0 = Player
1 = Fire
2 = Puddle
3 = Bullet
4 = Lightning
5 = Draug
6 = Spirit
7 = Phantom
8 = Dagger
9 = Crawler
10 = Titan
11 = Fortress
12 = Eruptor
13 = Wraith
14 = Ghoul
15 = Revenant
Before addition of new units: [build 79 and below]
0 = Player
1 = Fire
2 = Puddle
3 = Bullet
4 = Lightning
5 = Spirit
6 = Dagger
7 = Crawler
8 = Titan
9 = Fortress
10 = Eruptor
11 = Wraith
12 = Ghoul
13 = Phantom
14 = Revenant
*/
public class LegacyTypeTable{
*/
private static final Prov[] build81Table = {
Player::new,
Fire::new,
Puddle::new,
Draug::new,
Spirit::new,
Phantom::new,
Dagger::new,
Crawler::new,
Titan::new,
Fortress::new,
Eruptor::new,
Wraith::new,
Ghoul::new,
Revenant::new
MinerDrone::new,
RepairDrone::new,
BuilderDrone::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
FlyingUnit::new,
FlyingUnit::new,
HoverUnit::new
};
private static final Prov[] build80Table = {
Player::new,
Fire::new,
Puddle::new,
Bullet::new, //TODO reading these may crash
Bullet::new,
Lightning::new,
Draug::new,
Spirit::new,
Phantom::new,
Dagger::new,
Crawler::new,
Titan::new,
Fortress::new,
Eruptor::new,
Wraith::new,
Ghoul::new,
Revenant::new
MinerDrone::new,
RepairDrone::new,
BuilderDrone::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
FlyingUnit::new,
FlyingUnit::new,
HoverUnit::new
};
private static final Prov[] build79Table = {
Player::new,
Fire::new,
Puddle::new,
Bullet::new, //TODO reading these may crash
Bullet::new,
Lightning::new,
Spirit::new,
Dagger::new,
Crawler::new,
Titan::new,
Fortress::new,
Eruptor::new,
Wraith::new,
Ghoul::new,
Phantom::new,
Revenant::new
RepairDrone::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
GroundUnit::new,
FlyingUnit::new,
FlyingUnit::new,
BuilderDrone::new,
HoverUnit::new
};
public static Prov[] getTable(int build){

View File

@@ -1,8 +1,8 @@
package io.anuke.mindustry.io.versions;
import io.anuke.mindustry.ctype.ContentType;
import io.anuke.mindustry.entities.traits.*;
import io.anuke.mindustry.io.*;
import io.anuke.mindustry.type.*;
import io.anuke.mindustry.type.TypeID;
import java.io.*;

Some files were not shown because too many files have changed in this diff Show More