Merge remote-tracking branch 'upstream/master'

# Conflicts:
#	core/assets/bundles/bundle_ja.properties
This commit is contained in:
beito123
2019-03-20 13:11:49 +09:00
69 changed files with 2143 additions and 1475 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -203,6 +203,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Name: editor.name = Name:
@@ -250,14 +256,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Width: width = Width:
height = Height: height = Height:
menu = Menu menu = Menu
@@ -289,7 +299,7 @@ uncover = Uncover
configure = Configure Loadout configure = Configure Loadout
configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}. configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}.
zone.unlocked = [LIGHT_GRAY]{0} unlocked. zone.unlocked = [LIGHT_GRAY]{0} unlocked.
zone.complete = Wave {0} reached:\nNew zone requirements met. zone.complete = Wave {0} reached:\nNext zone requirements met.
zone.config.complete = Wave {0} reached:\nLoadout config unlocked. zone.config.complete = Wave {0} reached:\nLoadout config unlocked.
zone.resources = Resources Detected: zone.resources = Resources Detected:
add = Add... add = Add...
@@ -340,6 +350,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Power Capacity blocks.powercapacity = Power Capacity
blocks.powershot = Power/Shot blocks.powershot = Power/Shot
blocks.targetsair = Targets Air blocks.targetsair = Targets Air
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Range blocks.shootrange = Range
@@ -409,6 +420,7 @@ setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = training setting.difficulty.training = training
setting.difficulty.easy = easy setting.difficulty.easy = easy
setting.difficulty.normal = normal setting.difficulty.normal = normal
@@ -445,6 +457,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deselect keybind.deselect.name = Deselect
@@ -563,6 +576,9 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.snowrock.name = Snow Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Jméno: editor.name = Jméno:
@@ -240,6 +246,7 @@ editor.mapname = Jméno mapy:
editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu. editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.
editor.overwrite.confirm = [scarlet]Varování![] Mapa s tímto jménem již existuje. Jsi si jistý že ji chceš přepsat? editor.overwrite.confirm = [scarlet]Varování![] Mapa s tímto jménem již existuje. Jsi si jistý že ji chceš přepsat?
editor.selectmap = Vyber mapu k načtení: editor.selectmap = Vyber mapu k načtení:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Šířka: width = Šířka:
height = Výška: height = Výška:
menu = Hlavní menu menu = Hlavní menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Kapacita energie blocks.powercapacity = Kapacita energie
blocks.powershot = Energie na výstřel blocks.powershot = Energie na výstřel
blocks.targetsair = Zaměřuje vzdušné jednotky blocks.targetsair = Zaměřuje vzdušné jednotky
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Dostřel blocks.shootrange = Dostřel
@@ -402,6 +414,7 @@ setting.autotarget.name = Automaticky zaměřuje
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = žádný setting.fpscap.none = žádný
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = Trénink setting.difficulty.training = Trénink
setting.difficulty.easy = lehká setting.difficulty.easy = lehká
setting.difficulty.normal = normální setting.difficulty.normal = normální
@@ -438,6 +451,7 @@ keybind.screenshot.name = Sníměk mapy
keybind.move_x.name = Pohyb na X keybind.move_x.name = Pohyb na X
keybind.move_y.name = Pohyb na Y keybind.move_y.name = Pohyb na Y
keybind.select.name = Vybrat/Střílet keybind.select.name = Vybrat/Střílet
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Odznačit keybind.deselect.name = Odznačit
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Name: editor.name = Name:
@@ -240,6 +246,7 @@ editor.mapname = Karten Name
editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte. editor.overwrite = [accent] Warnung! Dies überschreibt eine vorhandene Karte.
editor.overwrite.confirm = [scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher, dass du sie überschreiben willst? editor.overwrite.confirm = [scarlet]Warnung![] Eine Karte mit diesem Namen existiert bereits. Bist du sicher, dass du sie überschreiben willst?
editor.selectmap = Wähle eine Karte zum Laden: editor.selectmap = Wähle eine Karte zum Laden:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Breite: width = Breite:
height = Höhe: height = Höhe:
menu = Menü menu = Menü
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Kapazität blocks.powercapacity = Kapazität
blocks.powershot = Stromverbrauch/Schuss blocks.powershot = Stromverbrauch/Schuss
blocks.targetsair = Visiert Luft Einheiten an blocks.targetsair = Visiert Luft Einheiten an
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Reichweite blocks.shootrange = Reichweite
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Zielauswahl
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = kein setting.fpscap.none = kein
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = Training setting.difficulty.training = Training
setting.difficulty.easy = Leicht setting.difficulty.easy = Leicht
setting.difficulty.normal = Normal setting.difficulty.normal = Normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = X-Achse keybind.move_x.name = X-Achse
keybind.move_y.name = Y-Achse keybind.move_y.name = Y-Achse
keybind.select.name = Auswählen/Schießen keybind.select.name = Auswählen/Schießen
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Auswahl aufheben keybind.deselect.name = Auswahl aufheben
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Nombre: editor.name = Nombre:
@@ -240,6 +246,7 @@ editor.mapname = Nombre del Mapa:
editor.overwrite = [accent]¡Advertencia!\nEsto sobrescribe un mapa ya existente. editor.overwrite = [accent]¡Advertencia!\nEsto sobrescribe un mapa ya existente.
editor.overwrite.confirm = [scarlet]¡Advertencia![] Un mapa con ese nombre ya existe. ¿Estás seguro de querer sobrescribirlo? editor.overwrite.confirm = [scarlet]¡Advertencia![] Un mapa con ese nombre ya existe. ¿Estás seguro de querer sobrescribirlo?
editor.selectmap = Selecciona un mapa para cargar: editor.selectmap = Selecciona un mapa para cargar:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Ancho: width = Ancho:
height = Alto: height = Alto:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Capacidad de Energía blocks.powercapacity = Capacidad de Energía
blocks.powershot = Energía/Disparo blocks.powershot = Energía/Disparo
blocks.targetsair = Apunta al Aire blocks.targetsair = Apunta al Aire
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Rango blocks.shootrange = Rango
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto apuntado
setting.fpscap.name = Máx FPS setting.fpscap.name = Máx FPS
setting.fpscap.none = Nada setting.fpscap.none = Nada
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = entrenamiento setting.difficulty.training = entrenamiento
setting.difficulty.easy = fácil setting.difficulty.easy = fácil
setting.difficulty.normal = normal setting.difficulty.normal = normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Mover x keybind.move_x.name = Mover x
keybind.move_y.name = Mover y keybind.move_y.name = Mover y
keybind.select.name = Seleccionar keybind.select.name = Seleccionar
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deseleccionar keybind.deselect.name = Deseleccionar
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Nom: editor.name = Nom:
@@ -240,6 +246,7 @@ editor.mapname = Nom de la carte²:
editor.overwrite = [accent]Attention !\nCeci réécrit une carte existante . editor.overwrite = [accent]Attention !\nCeci réécrit une carte existante .
editor.overwrite.confirm = [scarlet]Attention ![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir la réécrire? editor.overwrite.confirm = [scarlet]Attention ![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir la réécrire?
editor.selectmap = Séléctionnez une carte: editor.selectmap = Séléctionnez une carte:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Largeur: width = Largeur:
height = Hauteur: height = Hauteur:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = capacité d'énergie blocks.powercapacity = capacité d'énergie
blocks.powershot = Énergie/Tir blocks.powershot = Énergie/Tir
blocks.targetsair = Cible les unités aériennes blocks.targetsair = Cible les unités aériennes
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Portée blocks.shootrange = Portée
@@ -402,6 +414,7 @@ setting.autotarget.name = Visée automatique
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = entraînement setting.difficulty.training = entraînement
setting.difficulty.easy = facile setting.difficulty.easy = facile
setting.difficulty.normal = normal setting.difficulty.normal = normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = mouvement x keybind.move_x.name = mouvement x
keybind.move_y.name = mouvement y keybind.move_y.name = mouvement y
keybind.select.name = sélectionner keybind.select.name = sélectionner
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Déselectionner keybind.deselect.name = Déselectionner
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Nom: editor.name = Nom:
@@ -240,6 +246,7 @@ editor.mapname = Nom de la carte:
editor.overwrite = [accent]Attention!\nCela écrasera une carte existante. editor.overwrite = [accent]Attention!\nCela écrasera une carte existante.
editor.overwrite.confirm = [scarlet]Attention ![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir la réécrire? editor.overwrite.confirm = [scarlet]Attention ![] Une carte avec ce nom existe déjà. Êtes-vous sûr de vouloir la réécrire?
editor.selectmap = Sélectionnez une carte à charger: editor.selectmap = Sélectionnez une carte à charger:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Largeur: width = Largeur:
height = Hauteur: height = Hauteur:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Capacité d'énergie blocks.powercapacity = Capacité d'énergie
blocks.powershot = Énergie/Tir blocks.powershot = Énergie/Tir
blocks.targetsair = Cible les unités aériennes blocks.targetsair = Cible les unités aériennes
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Portée blocks.shootrange = Portée
@@ -402,6 +414,7 @@ setting.autotarget.name = Visée automatique
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = Vide setting.fpscap.none = Vide
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = Entraînement setting.difficulty.training = Entraînement
setting.difficulty.easy = Facile setting.difficulty.easy = Facile
setting.difficulty.normal = Normal setting.difficulty.normal = Normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Mouvement X keybind.move_x.name = Mouvement X
keybind.move_y.name = Mouvement Y keybind.move_y.name = Mouvement Y
keybind.select.name = Sélectionner/Tirer keybind.select.name = Sélectionner/Tirer
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Déselectionner keybind.deselect.name = Déselectionner
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Name: editor.name = Name:
@@ -240,6 +246,7 @@ editor.mapname = Nama Peta:
editor.overwrite = [accent]Peringatan!\nIni akan mengganti peta yang ada. editor.overwrite = [accent]Peringatan!\nIni akan mengganti peta yang ada.
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
editor.selectmap = Pilih peta yang akan dimuat: editor.selectmap = Pilih peta yang akan dimuat:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Lebar: width = Lebar:
height = Tinggi: height = Tinggi:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Kapasitas Tenaga blocks.powercapacity = Kapasitas Tenaga
blocks.powershot = Tenaga/tembakan blocks.powershot = Tenaga/tembakan
blocks.targetsair = Targets Air blocks.targetsair = Targets Air
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Range blocks.shootrange = Range
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = training setting.difficulty.training = training
setting.difficulty.easy = mudah setting.difficulty.easy = mudah
setting.difficulty.normal = normal setting.difficulty.normal = normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = gerak_x keybind.move_x.name = gerak_x
keybind.move_y.name = gerak_y keybind.move_y.name = gerak_y
keybind.select.name = pilih keybind.select.name = pilih
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deselect keybind.deselect.name = Deselect
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Nome: editor.name = Nome:
@@ -240,6 +246,7 @@ editor.mapname = Nome Mappa:
editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente. editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente.
editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere? editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
editor.selectmap = Seleziona una mappa da caricare: editor.selectmap = Seleziona una mappa da caricare:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Larghezza: width = Larghezza:
height = Altezza: height = Altezza:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Capacità Energetica blocks.powercapacity = Capacità Energetica
blocks.powershot = Danno/Colpo blocks.powershot = Danno/Colpo
blocks.targetsair = Attacca nemici aerei blocks.targetsair = Attacca nemici aerei
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Raggio blocks.shootrange = Raggio
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
setting.fpscap.name = Limite FPS setting.fpscap.name = Limite FPS
setting.fpscap.none = Niente setting.fpscap.none = Niente
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = training setting.difficulty.training = training
setting.difficulty.easy = facile setting.difficulty.easy = facile
setting.difficulty.normal = medio setting.difficulty.normal = medio
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Sposta_x keybind.move_x.name = Sposta_x
keybind.move_y.name = Sposta_y keybind.move_y.name = Sposta_y
keybind.select.name = seleziona keybind.select.name = seleziona
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deselect keybind.deselect.name = Deselect
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -194,17 +194,23 @@ editor.oregen.info = 鉱石の生成:
editor.mapinfo = マップ情報 editor.mapinfo = マップ情報
editor.author = 作者: editor.author = 作者:
editor.description = 説明: editor.description = 説明:
editor.waves = ウェーブ: editor.waves = Waves:
waves.title = ウェーブ waves.title = Waves
waves.remove = 削除 waves.remove = Remove
waves.never = <永久> waves.never = <never>
waves.every = waves.every = every
waves.waves = ウェーブごとに出現 waves.waves = wave(s)
waves.perspawn = スポーン waves.perspawn = per spawn
waves.to = から waves.to = to
waves.boss = ボス waves.boss = Boss
editor.default = [LIGHT_GRAY]<デフォルト> waves.preview = Preview
edit = 編集... waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default>
edit = Edit...
editor.name = 名前: editor.name = 名前:
editor.teams = チーム editor.teams = チーム
editor.elevation = 標高 editor.elevation = 標高
@@ -242,22 +248,26 @@ editor.mapname = マップ名:
editor.overwrite = [accent]警告!\n存在するマップを上書きします。 editor.overwrite = [accent]警告!\n存在するマップを上書きします。
editor.overwrite.confirm = [scarlet]警告![] この名前のマップがすでに存在します。上書きしてもよろしいですか? editor.overwrite.confirm = [scarlet]警告![] この名前のマップがすでに存在します。上書きしてもよろしいですか?
editor.selectmap = 読み込むマップを選択: editor.selectmap = 読み込むマップを選択:
filters.empty = [LIGHT_GRAY]フィルターが設定されていません!下のボタンからフィルターを追加してください。 filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = ゆがみ filter.distort = Distort
filter.noise = ノイズ filter.noise = Noise
filter.ore = 鉱石 filter.ore = Ore
filter.rivernoise = リバーノイズ filter.rivernoise = River Noise
filter.scatter = 分散 filter.scatter = Scatter
filter.terrain = 地形 filter.terrain = Terrain
filter.option.scale = スケール filter.option.scale = Scale
filter.option.mag = マグニチュード filter.option.chance = Chance
filter.option.threshold = スレッシュホールド filter.option.mag = Magnitude
filter.option.circle-scale = サークルスケール filter.option.threshold = Threshold
filter.option.octaves = オクターブ filter.option.circle-scale = Circle Scale
filter.option.falloff = フォールオフ filter.option.octaves = Octaves
filter.option.floor = 地面 filter.option.falloff = Falloff
filter.option.wall = filter.option.block = Block
filter.option.ore = 鉱石 filter.option.floor = Floor
filter.option.wall = Wall
filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = 幅: width = 幅:
height = 高さ: height = 高さ:
menu = メニュー menu = メニュー
@@ -336,8 +346,9 @@ blocks.poweroutput = 電力発電量: {0}
blocks.powercapacity = 電力容量 blocks.powercapacity = 電力容量
blocks.powershot = 電力/ショット blocks.powershot = 電力/ショット
blocks.targetsair = 対空攻撃 blocks.targetsair = 対空攻撃
blocks.items = アイテム: {0} blocks.targetsground = Targets Ground
blocks.itemsmoved = 輸送速度 blocks.items = Items: {0}
blocks.itemsmoved = Move Speed
blocks.shootrange = 範囲 blocks.shootrange = 範囲
blocks.size = 大きさ blocks.size = 大きさ
blocks.liquidcapacity = 液体容量 blocks.liquidcapacity = 液体容量
@@ -405,6 +416,7 @@ setting.autotarget.name = 自動ターゲット
setting.fpscap.name = 最大FPS setting.fpscap.name = 最大FPS
setting.fpscap.none = なし setting.fpscap.none = なし
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = トレーニング setting.difficulty.training = トレーニング
setting.difficulty.easy = イージー setting.difficulty.easy = イージー
setting.difficulty.normal = ノーマル setting.difficulty.normal = ノーマル
@@ -441,8 +453,9 @@ keybind.screenshot.name = スクリーンショット
keybind.move_x.name = 左右移動 keybind.move_x.name = 左右移動
keybind.move_y.name = 上下移動 keybind.move_y.name = 上下移動
keybind.select.name = 選択/ショット keybind.select.name = 選択/ショット
keybind.pick.name = ブロックを選ぶ keybind.diagonal_placement.name = Diagonal Placement
keybind.break_block.name = ブロックを破壊 keybind.pick.name = Pick Block
keybind.break_block.name = Break Block
keybind.deselect.name = 選択解除 keybind.deselect.name = 選択解除
keybind.shoot.name = ショット keybind.shoot.name = ショット
keybind.zoom_hold.name = ズーム長押し keybind.zoom_hold.name = ズーム長押し
@@ -554,24 +567,26 @@ mech.ability = [LIGHT_GRAY]能力: {0}
liquid.heatcapacity = [LIGHT_GRAY]熱容量: {0} liquid.heatcapacity = [LIGHT_GRAY]熱容量: {0}
liquid.viscosity = [LIGHT_GRAY]粘度: {0} liquid.viscosity = [LIGHT_GRAY]粘度: {0}
liquid.temperature = [LIGHT_GRAY]温度: {0} liquid.temperature = [LIGHT_GRAY]温度: {0}
block.grass.name = block.grass.name = Grass
block.salt.name = 岩塩氷河 block.salt.name = Salt
block.sandrocks.name = 砂岩 block.sandrocks.name = Sand Rocks
block.spore-pine.name = 胞子の松の木 block.spore-pine.name = Spore Pine
block.shale.name = 泥板岩 block.sporerocks.name = Spore Rocks
block.shale-boulder.name = 泥板岩の丸石 block.rock.name = Rock
block.moss.name = コケ block.shale.name = Shale
block.spore-moss.name = 胞子のコケ block.shale-boulder.name = Shale Boulder
block.shalerocks.name = 泥板岩の岩 block.moss.name = Moss
block.scrap-wall.name = スクラップの壁 block.spore-moss.name = Spore Moss
block.scrap-wall-large.name = 大きなスクラップの壁 block.shalerocks.name = Shale Rocks
block.scrap-wall-huge.name = とても大きなスクラップの壁 block.scrap-wall.name = Scrap Wall
block.scrap-wall-gigantic.name = 巨大なスクラップの壁 block.scrap-wall-large.name = Large Scrap Wall
block.thruster.name = スラスター block.scrap-wall-huge.name = Huge Scrap Wall
block.kiln.name = かまど block.scrap-wall-gigantic.name = Gigantic Scrap Wall
block.kiln.description = 砂と鉛を溶かしてメタガラスを生成します。少量の電力が必要です。 block.thruster.name = Thruster
block.graphite-press.name = 黒鉛圧縮機 block.kiln.name = Kiln
block.multi-press.name = 複合圧縮機 block.kiln.description = Smelts sand and lead into metaglass. Requires small amounts of power.
block.graphite-press.name = Graphite Press
block.multi-press.name = Multi-Press
block.constructing = {0}\n[LIGHT_GRAY](建設中) block.constructing = {0}\n[LIGHT_GRAY](建設中)
block.spawn.name = 敵のスポーン block.spawn.name = 敵のスポーン
block.core-shard.name = コア: シャード block.core-shard.name = コア: シャード

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = 이름: editor.name = 이름:
@@ -240,6 +246,7 @@ editor.mapname = 맵 이름:
editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다. editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까? editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
editor.selectmap = 불러올 맵 선택: editor.selectmap = 불러올 맵 선택:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = 넓이: width = 넓이:
height = 높이: height = 높이:
menu = 메뉴 menu = 메뉴
@@ -333,6 +344,7 @@ blocks.poweroutput = 전력 출력: {0}
blocks.powercapacity = 전력 용량 blocks.powercapacity = 전력 용량
blocks.powershot = 1발당 전력 소모량 blocks.powershot = 1발당 전력 소모량
blocks.targetsair = 공중공격 가능 blocks.targetsair = 공중공격 가능
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = 이동 속도 blocks.itemsmoved = 이동 속도
blocks.shootrange = 사거리 blocks.shootrange = 사거리
@@ -402,6 +414,7 @@ setting.autotarget.name = 자동 조준
setting.fpscap.name = 최대 FPS setting.fpscap.name = 최대 FPS
setting.fpscap.none = 없음 setting.fpscap.none = 없음
setting.fpscap.text = FPS setting.fpscap.text = FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = 훈련 setting.difficulty.training = 훈련
setting.difficulty.easy = 쉬움 setting.difficulty.easy = 쉬움
setting.difficulty.normal = 보통 setting.difficulty.normal = 보통
@@ -438,6 +451,7 @@ keybind.screenshot.name = 맵 스크린샷
keybind.move_x.name = 오른쪽/왼쪽 이동 keybind.move_x.name = 오른쪽/왼쪽 이동
keybind.move_y.name = 위 / 아래 중간 keybind.move_y.name = 위 / 아래 중간
keybind.select.name = 선택 keybind.select.name = 선택
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = 블록 선택 keybind.pick.name = 블록 선택
keybind.break_block.name = 블록 파괴 keybind.break_block.name = 블록 파괴
keybind.deselect.name = 선택해제 keybind.deselect.name = 선택해제
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Name: editor.name = Name:
@@ -240,6 +246,7 @@ editor.mapname = Map Name:
editor.overwrite = [accent]Warning!\nThis overwrites an existing map. editor.overwrite = [accent]Warning!\nThis overwrites an existing map.
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
editor.selectmap = Select a map to load: editor.selectmap = Select a map to load:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Width: width = Width:
height = Height: height = Height:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Power Capacity blocks.powercapacity = Power Capacity
blocks.powershot = Power/Shot blocks.powershot = Power/Shot
blocks.targetsair = Targets Air blocks.targetsair = Targets Air
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Range blocks.shootrange = Range
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = training setting.difficulty.training = training
setting.difficulty.easy = easy setting.difficulty.easy = easy
setting.difficulty.normal = normal setting.difficulty.normal = normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Move x keybind.move_x.name = Move x
keybind.move_y.name = Move y keybind.move_y.name = Move y
keybind.select.name = Select/Shoot keybind.select.name = Select/Shoot
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deselect keybind.deselect.name = Deselect
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Nazwa: editor.name = Nazwa:
@@ -240,6 +246,7 @@ editor.mapname = Nazwa mapy:
editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy. editor.overwrite = [accent]Uwaga!\nSpowoduje to nadpisanie istniejącej mapy.
editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać? editor.overwrite.confirm = [scarlet]Uwaga![] Mapa pod tą nazwą już istnieje. Jesteś pewny, że chcesz ją nadpisać?
editor.selectmap = Wybierz mapę do załadowania: editor.selectmap = Wybierz mapę do załadowania:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Szerokość: width = Szerokość:
height = Wysokość: height = Wysokość:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Pojemność mocy blocks.powercapacity = Pojemność mocy
blocks.powershot = moc/strzał blocks.powershot = moc/strzał
blocks.targetsair = Może namierzać wrogów powietrznych blocks.targetsair = Może namierzać wrogów powietrznych
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Zasięg blocks.shootrange = Zasięg
@@ -402,6 +414,7 @@ setting.autotarget.name = Automatyczne Celowanie
setting.fpscap.name = Maksymalny FPS setting.fpscap.name = Maksymalny FPS
setting.fpscap.none = Nieograniczone setting.fpscap.none = Nieograniczone
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = trening setting.difficulty.training = trening
setting.difficulty.easy = łatwy setting.difficulty.easy = łatwy
setting.difficulty.normal = normalny setting.difficulty.normal = normalny
@@ -438,6 +451,7 @@ keybind.screenshot.name = Zrzut ekranu mapy
keybind.move_x.name = Poruszanie w poziomie keybind.move_x.name = Poruszanie w poziomie
keybind.move_y.name = Poruszanie w pionie keybind.move_y.name = Poruszanie w pionie
keybind.select.name = Zaznacz keybind.select.name = Zaznacz
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Wybierz Blok keybind.pick.name = Wybierz Blok
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Odznacz keybind.deselect.name = Odznacz
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Nome: editor.name = Nome:
@@ -240,6 +246,7 @@ editor.mapname = Nome do Mapa:
editor.overwrite = [accent]Aviso!\nIsso Subistitui um mapa existente. editor.overwrite = [accent]Aviso!\nIsso Subistitui um mapa existente.
editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir? editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir?
editor.selectmap = Selecione uma mapa para carregar: editor.selectmap = Selecione uma mapa para carregar:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Largura: width = Largura:
height = Altura: height = Altura:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Capacidade de Energia blocks.powercapacity = Capacidade de Energia
blocks.powershot = Energia/tiro blocks.powershot = Energia/tiro
blocks.targetsair = Mirar no ar blocks.targetsair = Mirar no ar
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Alcance blocks.shootrange = Alcance
@@ -402,6 +414,7 @@ setting.autotarget.name = Alvo automatico
setting.fpscap.name = FPS Maximo setting.fpscap.name = FPS Maximo
setting.fpscap.none = Nenhum setting.fpscap.none = Nenhum
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = treinamento setting.difficulty.training = treinamento
setting.difficulty.easy = Fácil setting.difficulty.easy = Fácil
setting.difficulty.normal = Normal setting.difficulty.normal = Normal
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = mover_x keybind.move_x.name = mover_x
keybind.move_y.name = mover_y keybind.move_y.name = mover_y
keybind.select.name = selecionar keybind.select.name = selecionar
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deselecionar keybind.deselect.name = Deselecionar
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Название: editor.name = Название:
@@ -240,6 +246,7 @@ editor.mapname = Название карты:
editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту. editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту.
editor.overwrite.confirm = [scarlet]Осторожно![] Карта с таким названием уже существует. Вы действительно хотите её перезаписать? editor.overwrite.confirm = [scarlet]Осторожно![] Карта с таким названием уже существует. Вы действительно хотите её перезаписать?
editor.selectmap = Выберите карту для загрузки: editor.selectmap = Выберите карту для загрузки:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Ширина: width = Ширина:
height = Высота: height = Высота:
menu = Меню menu = Меню
@@ -333,6 +344,7 @@ blocks.poweroutput = Выходная энергия: {0}
blocks.powercapacity = Вместимость энергии blocks.powercapacity = Вместимость энергии
blocks.powershot = Энергия/выстрел blocks.powershot = Энергия/выстрел
blocks.targetsair = Атакует воздуш. юнитов blocks.targetsair = Атакует воздуш. юнитов
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Скорость перемещения blocks.itemsmoved = Скорость перемещения
blocks.shootrange = Радиус действия blocks.shootrange = Радиус действия
@@ -402,6 +414,7 @@ setting.autotarget.name = Авто-цель
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
setting.fpscap.none = Неограниченный setting.fpscap.none = Неограниченный
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = обучение setting.difficulty.training = обучение
setting.difficulty.easy = легко setting.difficulty.easy = легко
setting.difficulty.normal = нормально setting.difficulty.normal = нормально
@@ -438,6 +451,7 @@ keybind.screenshot.name = Скриншот карты
keybind.move_x.name = Движение по оси x keybind.move_x.name = Движение по оси x
keybind.move_y.name = Движение по оси y keybind.move_y.name = Движение по оси y
keybind.select.name = Выбор/Выстрел keybind.select.name = Выбор/Выстрел
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Выбрать блок keybind.pick.name = Выбрать блок
keybind.break_block.name = Разрушить блок keybind.break_block.name = Разрушить блок
keybind.deselect.name = Отмена keybind.deselect.name = Отмена
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = isim: editor.name = isim:
@@ -240,6 +246,7 @@ editor.mapname = Harita ismi:
editor.overwrite = [accent]Dikkat et!\nBu bir haritanin uzerinden cececek. editor.overwrite = [accent]Dikkat et!\nBu bir haritanin uzerinden cececek.
editor.overwrite.confirm = [scarlet]uyari![] bu isimde bir harita zaten var. Uzerinden gececek misin? editor.overwrite.confirm = [scarlet]uyari![] bu isimde bir harita zaten var. Uzerinden gececek misin?
editor.selectmap = Yukleyecek bir harita sec: editor.selectmap = Yukleyecek bir harita sec:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Genislik: width = Genislik:
height = Yukseklik: height = Yukseklik:
menu = Menu menu = Menu
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Guc kapasitesi blocks.powercapacity = Guc kapasitesi
blocks.powershot = Guc/Saldiri hizi blocks.powershot = Guc/Saldiri hizi
blocks.targetsair = Havayi hedef alir mi? blocks.targetsair = Havayi hedef alir mi?
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Menzil blocks.shootrange = Menzil
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = Yok setting.fpscap.none = Yok
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = training setting.difficulty.training = training
setting.difficulty.easy = kolay setting.difficulty.easy = kolay
setting.difficulty.normal = orta setting.difficulty.normal = orta
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = Sol/Sag hareket keybind.move_x.name = Sol/Sag hareket
keybind.move_y.name = Yukari/asagi hareket keybind.move_y.name = Yukari/asagi hareket
keybind.select.name = Sec/silahi sik keybind.select.name = Sec/silahi sik
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Eldeki yapiyi birak keybind.deselect.name = Eldeki yapiyi birak
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Name: editor.name = Name:
@@ -240,6 +246,7 @@ editor.mapname = Harita Adı
editor.overwrite = [Vurgu] Uyarı! Bu mevcut bir haritanın üzerine yazar. editor.overwrite = [Vurgu] Uyarı! Bu mevcut bir haritanın üzerine yazar.
editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it? editor.overwrite.confirm = [scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
editor.selectmap = Yüklenecek bir harita seçin: editor.selectmap = Yüklenecek bir harita seçin:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Genişliği: width = Genişliği:
height = Boy: height = Boy:
menu = Menü menu = Menü
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = Güç kapasitesi blocks.powercapacity = Güç kapasitesi
blocks.powershot = Güç / atış blocks.powershot = Güç / atış
blocks.targetsair = Targets Air blocks.targetsair = Targets Air
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = Range blocks.shootrange = Range
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
setting.fpscap.name = Max FPS setting.fpscap.name = Max FPS
setting.fpscap.none = None setting.fpscap.none = None
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = training setting.difficulty.training = training
setting.difficulty.easy = kolay setting.difficulty.easy = kolay
setting.difficulty.normal = orta setting.difficulty.normal = orta
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
keybind.move_x.name = sağ / sol keybind.move_x.name = sağ / sol
keybind.move_y.name = yukarı / aşağı keybind.move_y.name = yukarı / aşağı
keybind.select.name = seçmek keybind.select.name = seçmek
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = Deselect keybind.deselect.name = Deselect
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = Назва: editor.name = Назва:
@@ -240,6 +246,7 @@ editor.mapname = Название карты:
editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу карту. editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу карту.
editor.overwrite.confirm = [scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її? editor.overwrite.confirm = [scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її?
editor.selectmap = Виберіть мапу для завантаження: editor.selectmap = Виберіть мапу для завантаження:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = Ширина: width = Ширина:
height = Висота: height = Висота:
menu = Меню menu = Меню
@@ -333,6 +344,7 @@ blocks.poweroutput = Вихідна енергія: {0}
blocks.powercapacity = Місткість енергії blocks.powercapacity = Місткість енергії
blocks.powershot = Енергія/постріл blocks.powershot = Енергія/постріл
blocks.targetsair = Атакуе повітряних ворогів blocks.targetsair = Атакуе повітряних ворогів
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Швидкість переміщення blocks.itemsmoved = Швидкість переміщення
blocks.shootrange = Діапазон дії blocks.shootrange = Діапазон дії
@@ -402,6 +414,7 @@ setting.autotarget.name = Авто-ціль
setting.fpscap.name = Макс. FPS setting.fpscap.name = Макс. FPS
setting.fpscap.none = Необмежений setting.fpscap.none = Необмежений
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = навчання setting.difficulty.training = навчання
setting.difficulty.easy = легка setting.difficulty.easy = легка
setting.difficulty.normal = нормальна setting.difficulty.normal = нормальна
@@ -438,6 +451,7 @@ keybind.screenshot.name = Скріншот мапи
keybind.move_x.name = Рух по осі x keybind.move_x.name = Рух по осі x
keybind.move_y.name = Рух по осі x keybind.move_y.name = Рух по осі x
keybind.select.name = Вибір/Постріл keybind.select.name = Вибір/Постріл
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Вибрати блок keybind.pick.name = Вибрати блок
keybind.break_block.name = Зламати блок keybind.break_block.name = Зламати блок
keybind.deselect.name = Скасувати keybind.deselect.name = Скасувати
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = 名字: editor.name = 名字:
@@ -240,6 +246,7 @@ editor.mapname = 地图名字:
editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。 editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。
editor.overwrite.confirm = [scarlet]警告![] 存在同名地图,确定要覆盖? editor.overwrite.confirm = [scarlet]警告![] 存在同名地图,确定要覆盖?
editor.selectmap = 选择一个地图加载: editor.selectmap = 选择一个地图加载:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = 宽度: width = 宽度:
height = 高度: height = 高度:
menu = 菜单 menu = 菜单
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = 能量容量 blocks.powercapacity = 能量容量
blocks.powershot = 能量/发射 blocks.powershot = 能量/发射
blocks.targetsair = 攻击空中单位 blocks.targetsair = 攻击空中单位
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = 移动速度 blocks.itemsmoved = 移动速度
blocks.shootrange = 范围 blocks.shootrange = 范围
@@ -402,6 +414,7 @@ setting.autotarget.name = 自动发射
setting.fpscap.name = 最高 FPS setting.fpscap.name = 最高 FPS
setting.fpscap.none = setting.fpscap.none =
setting.fpscap.text = {0} FPS setting.fpscap.text = {0} FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = 训练 setting.difficulty.training = 训练
setting.difficulty.easy = 简单 setting.difficulty.easy = 简单
setting.difficulty.normal = 普通 setting.difficulty.normal = 普通
@@ -438,6 +451,7 @@ keybind.screenshot.name = 地图截图
keybind.move_x.name = 水平移动 keybind.move_x.name = 水平移动
keybind.move_y.name = 垂直移动 keybind.move_y.name = 垂直移动
keybind.select.name = 选择 keybind.select.name = 选择
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = 选择方块 keybind.pick.name = 选择方块
keybind.break_block.name = 破坏方块 keybind.break_block.name = 破坏方块
keybind.deselect.name = 取消 keybind.deselect.name = 取消
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

View File

@@ -201,6 +201,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn waves.perspawn = per spawn
waves.to = to waves.to = to
waves.boss = Boss waves.boss = Boss
waves.preview = Preview
waves.edit = Edit...
waves.copy = Copy to Clipboard
waves.load = Load from Clipboard
waves.invalid = Invalid waves in clipboard.
waves.copied = Waves copied.
editor.default = [LIGHT_GRAY]<Default> editor.default = [LIGHT_GRAY]<Default>
edit = Edit... edit = Edit...
editor.name = 名稱: editor.name = 名稱:
@@ -240,6 +246,7 @@ editor.mapname = 地圖名稱:
editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。 editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖? editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖?
editor.selectmap = 選取要載入的地圖: editor.selectmap = 選取要載入的地圖:
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
filter.distort = Distort filter.distort = Distort
filter.noise = Noise filter.noise = Noise
filter.ore = Ore filter.ore = Ore
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
filter.scatter = Scatter filter.scatter = Scatter
filter.terrain = Terrain filter.terrain = Terrain
filter.option.scale = Scale filter.option.scale = Scale
filter.option.chance = Chance
filter.option.mag = Magnitude filter.option.mag = Magnitude
filter.option.threshold = Threshold filter.option.threshold = Threshold
filter.option.circle-scale = Circle Scale filter.option.circle-scale = Circle Scale
filter.option.octaves = Octaves filter.option.octaves = Octaves
filter.option.falloff = Falloff filter.option.falloff = Falloff
filter.option.block = Block
filter.option.floor = Floor filter.option.floor = Floor
filter.option.wall = Wall filter.option.wall = Wall
filter.option.ore = Ore filter.option.ore = Ore
filter.option.floor2 = Secondary Floor
filter.option.threshold2 = Secondary Threshold
width = 寬度: width = 寬度:
height = 長度: height = 長度:
menu = 主選單 menu = 主選單
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
blocks.powercapacity = 蓄電量 blocks.powercapacity = 蓄電量
blocks.powershot = 能量/射擊 blocks.powershot = 能量/射擊
blocks.targetsair = 攻擊空中目標 blocks.targetsair = 攻擊空中目標
blocks.targetsground = Targets Ground
blocks.items = Items: {0} blocks.items = Items: {0}
blocks.itemsmoved = Move Speed blocks.itemsmoved = Move Speed
blocks.shootrange = 範圍 blocks.shootrange = 範圍
@@ -402,6 +414,7 @@ setting.autotarget.name = 自動射擊
setting.fpscap.name = 最大FPS setting.fpscap.name = 最大FPS
setting.fpscap.none = 没有 setting.fpscap.none = 没有
setting.fpscap.text = {0}FPS setting.fpscap.text = {0}FPS
setting.swapdiagonal.name = Always Diagonal Placement
setting.difficulty.training = 訓練 setting.difficulty.training = 訓練
setting.difficulty.easy = 簡單 setting.difficulty.easy = 簡單
setting.difficulty.normal = 普通 setting.difficulty.normal = 普通
@@ -438,6 +451,7 @@ keybind.screenshot.name = 地圖截圖
keybind.move_x.name = 水平移動 keybind.move_x.name = 水平移動
keybind.move_y.name = 垂直移動 keybind.move_y.name = 垂直移動
keybind.select.name = 選取 keybind.select.name = 選取
keybind.diagonal_placement.name = Diagonal Placement
keybind.pick.name = Pick Block keybind.pick.name = Pick Block
keybind.break_block.name = Break Block keybind.break_block.name = Break Block
keybind.deselect.name = 取消選取 keybind.deselect.name = 取消選取
@@ -555,6 +569,8 @@ block.grass.name = Grass
block.salt.name = Salt block.salt.name = Salt
block.sandrocks.name = Sand Rocks block.sandrocks.name = Sand Rocks
block.spore-pine.name = Spore Pine block.spore-pine.name = Spore Pine
block.sporerocks.name = Spore Rocks
block.rock.name = Rock
block.shale.name = Shale block.shale.name = Shale
block.shale-boulder.name = Shale Boulder block.shale-boulder.name = Shale Boulder
block.moss.name = Moss block.moss.name = Moss

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 501 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 209 KiB

View File

@@ -66,6 +66,8 @@ public class Vars{
public static final float finalWorldBounds = worldBounds + 500; public static final float finalWorldBounds = worldBounds + 500;
/**ticks spent out of bound until self destruct.*/ /**ticks spent out of bound until self destruct.*/
public static final float boundsCountdown = 60*7; public static final float boundsCountdown = 60*7;
/**for map generator dialog*/
public static boolean updateEditorOnChange = false;
/**size of tiles in units*/ /**size of tiles in units*/
public static final int tilesize = 8; public static final int tilesize = 8;
/**all choosable player colors in join/host dialog*/ /**all choosable player colors in join/host dialog*/

View File

@@ -27,6 +27,7 @@ public class WaveSpawner{
private Array<FlyerSpawn> flySpawns = new Array<>(); private Array<FlyerSpawn> flySpawns = new Array<>();
private Array<GroundSpawn> groundSpawns = new Array<>(); private Array<GroundSpawn> groundSpawns = new Array<>();
private IntArray loadedSpawns = new IntArray(); private IntArray loadedSpawns = new IntArray();
private boolean spawning = false;
public WaveSpawner(){ public WaveSpawner(){
Events.on(WorldLoadEvent.class, e -> reset()); Events.on(WorldLoadEvent.class, e -> reset());
@@ -57,6 +58,7 @@ public class WaveSpawner{
} }
public void spawnEnemies(){ public void spawnEnemies(){
spawning = true;
for(SpawnGroup group : state.rules.spawns){ for(SpawnGroup group : state.rules.spawns){
int spawned = group.getUnitsSpawned(state.wave); int spawned = group.getUnitsSpawned(state.wave);
@@ -90,7 +92,7 @@ public class WaveSpawner{
BaseUnit unit = group.createUnit(waveTeam); BaseUnit unit = group.createUnit(waveTeam);
unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y); unit.set(spawnX + Tmp.v1.x, spawnY + Tmp.v1.y);
Time.run(i*5, () -> shockwave(unit)); Time.run(Math.min(i*5, 60*2), () -> shockwave(unit));
} }
Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawn.x * tilesize, spawn.y * tilesize)); Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawn.x * tilesize, spawn.y * tilesize));
//would be interesting to see player structures survive this without hacks //would be interesting to see player structures survive this without hacks
@@ -98,6 +100,12 @@ public class WaveSpawner{
} }
} }
} }
Time.runTask(121f, () -> spawning = false);
}
public boolean isSpawning(){
return spawning;
} }
private void reset(){ private void reset(){

View File

@@ -36,9 +36,9 @@ public class Blocks implements ContentList{
//environment //environment
air, part, spawn, deepwater, water, tar, stone, craters, charr, sand, ice, snow, air, part, spawn, deepwater, water, tar, stone, craters, charr, sand, ice, snow,
holostone, rocks, icerocks, cliffs, sporePine, pine, whiteTree, whiteTreeDead, sporeCluster, holostone, rocks, sporerocks, icerocks, cliffs, sporePine, pine, whiteTree, whiteTreeDead, sporeCluster,
iceSnow, sandWater, duneRocks, sandRocks, moss, sporeMoss, shale, shaleRocks, shaleBoulder, grass, salt, iceSnow, sandWater, duneRocks, sandRocks, moss, sporeMoss, shale, shaleRocks, shaleBoulder, grass, salt,
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, rock, snowrock,
//ores //ores
oreCopper, oreLead, oreScrap, oreCoal, oreTitanium, oreThorium, oreCopper, oreLead, oreScrap, oreCoal, oreTitanium, oreThorium,
@@ -189,11 +189,6 @@ public class Blocks implements ContentList{
variants = 0; variants = 0;
}}; }};
iceSnow = new Floor("ice-snow"){{
variants = 3;
attributes.set(Attribute.water, 0.3f);
}};
snow = new Floor("snow"){{ snow = new Floor("snow"){{
attributes.set(Attribute.water, 0.2f); attributes.set(Attribute.water, 0.2f);
}}; }};
@@ -205,6 +200,12 @@ public class Blocks implements ContentList{
attributes.set(Attribute.water, 0.4f); attributes.set(Attribute.water, 0.4f);
}}; }};
iceSnow = new Floor("ice-snow"){{
variants = 3;
attributes.set(Attribute.water, 0.3f);
edgeStyle = "blocky";
}};
cliffs = new StaticWall("cliffs"){{ cliffs = new StaticWall("cliffs"){{
variants = 1; variants = 1;
fillsTile = false; fillsTile = false;
@@ -214,6 +215,18 @@ public class Blocks implements ContentList{
variants = 2; variants = 2;
}}; }};
sporerocks = new StaticWall("sporerocks"){{
variants = 2;
}};
rock = new Rock("rock"){{
variants = 2;
}};
snowrock = new Rock("snowrock"){{
variants = 2;
}};
icerocks = new StaticWall("icerocks"){{ icerocks = new StaticWall("icerocks"){{
variants = 2; variants = 2;
}}; }};
@@ -269,6 +282,7 @@ public class Blocks implements ContentList{
sporeMoss = new Floor("spore-moss"){{ sporeMoss = new Floor("spore-moss"){{
variants = 3; variants = 3;
attributes.set(Attribute.spores, 0.3f); attributes.set(Attribute.spores, 0.3f);
edgeStyle = "blocky";
}}; }};
metalFloor = new Floor("metal-floor"){{ metalFloor = new Floor("metal-floor"){{
@@ -694,7 +708,7 @@ public class Blocks implements ContentList{
}}; }};
junction = new Junction("junction"){{ junction = new Junction("junction"){{
requirements(Category.distribution, ItemStack.with(Items.copper, 3)); requirements(Category.distribution, ItemStack.with(Items.copper, 3), true);
speed = 26; speed = 26;
capacity = 32; capacity = 32;
health = 25; health = 25;
@@ -1061,29 +1075,30 @@ public class Blocks implements ContentList{
range = 95f; range = 95f;
shootCone = 15f; shootCone = 15f;
ammoUseEffect = Fx.shellEjectSmall; ammoUseEffect = Fx.shellEjectSmall;
health = 210; health = 250;
inaccuracy = 2f; inaccuracy = 2f;
rotatespeed = 10f; rotatespeed = 10f;
}}; }};
scatter = new BurstTurret("scatter"){{ scatter = new BurstTurret("scatter"){{
requirements(Category.turret, ItemStack.with(Items.copper, 170, Items.lead, 90), true); requirements(Category.turret, ItemStack.with(Items.copper, 170, Items.lead, 90));
ammo( ammo(
Items.scrap, Bullets.flakScrap, Items.scrap, Bullets.flakScrap,
Items.lead, Bullets.flakLead Items.lead, Bullets.flakLead
); );
reload = 45f; reload = 43f;
range = 160f; range = 160f;
size = 2; size = 2;
burstSpacing = 5f; burstSpacing = 5f;
shots = 2; shots = 2;
targetGround = false;
recoil = 2f; recoil = 2f;
rotatespeed = 10f; rotatespeed = 10f;
inaccuracy = 18f; inaccuracy = 17f;
shootCone = 35f; shootCone = 35f;
health = 220*size*size; health = 260*size*size;
}}; }};
hail = new ArtilleryTurret("hail"){{ hail = new ArtilleryTurret("hail"){{
@@ -1098,7 +1113,7 @@ public class Blocks implements ContentList{
range = 230f; range = 230f;
inaccuracy = 1f; inaccuracy = 1f;
shootCone = 10f; shootCone = 10f;
health = 120; health = 260;
}}; }};
wave = new LiquidTurret("wave"){{ wave = new LiquidTurret("wave"){{
@@ -1116,7 +1131,7 @@ public class Blocks implements ContentList{
shootCone = 50f; shootCone = 50f;
shootEffect = Fx.shootLiquid; shootEffect = Fx.shootLiquid;
range = 100f; range = 100f;
health = 360; health = 250*size*size;
drawer = (tile, entity) -> { drawer = (tile, entity) -> {
Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90);
@@ -1147,7 +1162,7 @@ public class Blocks implements ContentList{
chargeBeginEffect = Fx.lancerLaserChargeBegin; chargeBeginEffect = Fx.lancerLaserChargeBegin;
heatColor = Color.RED; heatColor = Color.RED;
size = 2; size = 2;
health = 320; health = 280*size*size;
targetAir = false; targetAir = false;
}}; }};
@@ -1165,6 +1180,7 @@ public class Blocks implements ContentList{
heatColor = Color.RED; heatColor = Color.RED;
recoil = 1f; recoil = 1f;
size = 1; size = 1;
health = 260;
}}; }};
swarmer = new BurstTurret("swarmer"){{ swarmer = new BurstTurret("swarmer"){{
@@ -1181,7 +1197,7 @@ public class Blocks implements ContentList{
range = 140f; range = 140f;
xRand = 6f; xRand = 6f;
size = 2; size = 2;
health = 380; health = 300*size*size;
}}; }};
salvo = new BurstTurret("salvo"){{ salvo = new BurstTurret("salvo"){{

View File

@@ -36,7 +36,7 @@ public class Mechs implements ContentList{
speed = 0.5f; speed = 0.5f;
boostSpeed = 0.85f; boostSpeed = 0.85f;
engineColor = Color.valueOf("ffd37f"); engineColor = Color.valueOf("ffd37f");
health = 250f; health = 300f;
weapon = new Weapon("blaster"){{ weapon = new Weapon("blaster"){{
length = 1.5f; length = 1.5f;
@@ -62,7 +62,7 @@ public class Mechs implements ContentList{
boostSpeed = 0.95f; boostSpeed = 0.95f;
itemCapacity = 15; itemCapacity = 15;
mass = 0.9f; mass = 0.9f;
health = 220f; health = 250f;
weaponOffsetX = -1; weaponOffsetX = -1;
weaponOffsetY = -1; weaponOffsetY = -1;
engineColor = Color.valueOf("d3ddff"); engineColor = Color.valueOf("d3ddff");

View File

@@ -43,20 +43,22 @@ public class TechTree implements ContentList{
}); });
node(duo, () -> { node(duo, () -> {
node(hail, () -> { node(scatter, () -> {
node(hail, () -> {
node(salvo, () -> { node(salvo, () -> {
node(swarmer, () -> { node(swarmer, () -> {
node(cyclone, () -> { node(cyclone, () -> {
node(spectre, () -> { node(spectre, () -> {
});
}); });
}); });
});
node(ripple, () -> { node(ripple, () -> {
node(fuse, () -> { node(fuse, () -> {
});
}); });
}); });
}); });
@@ -257,7 +259,7 @@ public class TechTree implements ContentList{
private TechNode node(Block block, Runnable children){ private TechNode node(Block block, Runnable children){
ItemStack[] requirements = new ItemStack[block.buildRequirements.length]; ItemStack[] requirements = new ItemStack[block.buildRequirements.length];
for(int i = 0; i < requirements.length; i++){ for(int i = 0; i < requirements.length; i++){
requirements[i] = new ItemStack(block.buildRequirements[i].item, block.buildRequirements[i].amount * 10); requirements[i] = new ItemStack(block.buildRequirements[i].item, block.buildRequirements[i].amount * 8);
} }
return new TechNode(block, requirements, children); return new TechNode(block, requirements, children);

View File

@@ -16,13 +16,13 @@ public class Zones implements ContentList{
@Override @Override
public void load(){ public void load(){
groundZero = new Zone("groundZero", new MapGenerator("groundZero", 1)){{ groundZero = new Zone("groundZero", new MapGenerator("groundZero", 1).decor(new Decoration(Blocks.snow, Blocks.snowrock, 0.01))){{
baseLaunchCost = ItemStack.with(Items.copper, -100); baseLaunchCost = ItemStack.with(Items.copper, -100);
startingItems = ItemStack.list(Items.copper, 100); startingItems = ItemStack.list(Items.copper, 100);
alwaysUnlocked = true; alwaysUnlocked = true;
conditionWave = 5; conditionWave = 5;
launchPeriod = 5; launchPeriod = 5;
resources = new Item[]{Items.copper, Items.scrap}; resources = new Item[]{Items.copper, Items.scrap, Items.lead};
rules = () -> new Rules(){{ rules = () -> new Rules(){{
waves = true; waves = true;
waveTimer = true; waveTimer = true;
@@ -30,7 +30,7 @@ public class Zones implements ContentList{
}}; }};
}}; }};
craters = new Zone("craters", new MapGenerator("craters", 1).dist(0)){{ craters = new Zone("craters", new MapGenerator("craters", 1).dist(0).decor(new Decoration(Blocks.snow, Blocks.sporeCluster, 0.01))){{
startingItems = ItemStack.list(Items.copper, 200); startingItems = ItemStack.list(Items.copper, 200);
conditionWave = 10; conditionWave = 10;
itemRequirements = ItemStack.with(Items.copper, 2000); itemRequirements = ItemStack.with(Items.copper, 2000);

View File

@@ -212,7 +212,7 @@ public class MapEditor{
if(tile.block().isMultiblock()){ if(tile.block().isMultiblock()){
removeLinked(wx, wy); removeLinked(wx, wy);
}else if(link != 0 && tiles[x][y].block() == Blocks.part){ }else if(link != 0 && tiles[wx][wy].block() == Blocks.part){
removeLinked(wx - (Pack.leftByte(link) - 8), wy - (Pack.rightByte(link) - 8)); removeLinked(wx - (Pack.leftByte(link) - 8), wy - (Pack.rightByte(link) - 8));
} }
} }

View File

@@ -6,10 +6,12 @@ import io.anuke.arc.function.Supplier;
import io.anuke.arc.graphics.Pixmap; import io.anuke.arc.graphics.Pixmap;
import io.anuke.arc.graphics.Pixmap.Format; import io.anuke.arc.graphics.Pixmap.Format;
import io.anuke.arc.graphics.Texture; import io.anuke.arc.graphics.Texture;
import io.anuke.arc.scene.ui.Image;
import io.anuke.arc.scene.ui.layout.Stack;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.arc.util.Scaling;
import io.anuke.arc.util.async.AsyncExecutor; import io.anuke.arc.util.async.AsyncExecutor;
import io.anuke.arc.util.async.AsyncResult; import io.anuke.arc.util.async.AsyncResult;
import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.editor.generation.*; import io.anuke.mindustry.editor.generation.*;
import io.anuke.mindustry.editor.generation.GenerateFilter.GenerateInput; import io.anuke.mindustry.editor.generation.GenerateFilter.GenerateInput;
import io.anuke.mindustry.game.Team; import io.anuke.mindustry.game.Team;
@@ -21,7 +23,7 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import static io.anuke.mindustry.Vars.mobile; import static io.anuke.mindustry.Vars.*;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class MapGenerateDialog extends FloatingDialog{ public class MapGenerateDialog extends FloatingDialog{
@@ -48,8 +50,10 @@ public class MapGenerateDialog extends FloatingDialog{
shown(this::setup); shown(this::setup);
addCloseButton(); addCloseButton();
buttons.addButton("$editor.apply", () -> { buttons.addButton("$editor.apply", () -> {
apply(); ui.loadAnd(() -> {
hide(); apply();
hide();
});
}).size(160f, 64f); }).size(160f, 64f);
buttons.addButton("$editor.randomize", () -> { buttons.addButton("$editor.randomize", () -> {
for(GenerateFilter filter : filters){ for(GenerateFilter filter : filters){
@@ -75,15 +79,20 @@ public class MapGenerateDialog extends FloatingDialog{
cont.clear(); cont.clear();
cont.table("flat", t -> { cont.table("flat", t -> {
t.margin(8f); t.margin(8f);
t.add(new BorderImage(texture)).size(400f).padRight(6); t.stack(new BorderImage(texture), new Stack(){{
add(new Image("loadDim"));
add(new Image("icon-refresh"){{
setScaling(Scaling.none);
}});
visible(() -> generating);
}}).size(mobile ? 300f : 400f).padRight(6);
t.pane(p -> filterTable = p).width(300f).get().setScrollingDisabled(true, false); t.pane(p -> filterTable = p).width(300f).get().setScrollingDisabled(true, false);
}).grow(); }).grow();
update();
buffer1 = create(); buffer1 = create();
buffer2 = create(); buffer2 = create();
update();
rebuildFilters(); rebuildFilters();
} }
@@ -186,6 +195,16 @@ public class MapGenerateDialog extends FloatingDialog{
result.get(); result.get();
} }
buffer1 = null;
buffer2 = null;
generating = false;
if(pixmap != null){
pixmap.dispose();
texture.dispose();
pixmap = null;
texture = null;
}
//writeback buffer //writeback buffer
DummyTile[][] writeTiles = new DummyTile[editor.width()][editor.height()]; DummyTile[][] writeTiles = new DummyTile[editor.width()][editor.height()];
@@ -196,7 +215,7 @@ public class MapGenerateDialog extends FloatingDialog{
} }
for(GenerateFilter filter : filters){ for(GenerateFilter filter : filters){
input.setFilter(filter, (x, y) -> dset(editor.tile(x, y))); input.setFilter(filter, editor.width(), editor.height(), 1, (x, y) -> dset(editor.tile(x, y)));
//write to buffer //write to buffer
for(int x = 0; x < editor.width(); x++){ for(int x = 0; x < editor.width(); x++){
for(int y = 0; y < editor.height(); y++){ for(int y = 0; y < editor.height(); y++){
@@ -215,10 +234,10 @@ public class MapGenerateDialog extends FloatingDialog{
DummyTile write = writeTiles[x][y]; DummyTile write = writeTiles[x][y];
tile.setRotation((byte)write.rotation); tile.setRotation((byte)write.rotation);
tile.setFloor((Floor)write.floor); tile.setFloor((Floor)content.block(write.floor));
tile.setBlock(write.block); tile.setBlock(content.block(write.block));
tile.setTeam(write.team); tile.setTeam(Team.all[write.team]);
tile.setOre(write.ore); tile.setOre(content.block(write.ore));
} }
} }
}); });
@@ -239,74 +258,81 @@ public class MapGenerateDialog extends FloatingDialog{
Array<GenerateFilter> copy = new Array<>(filters); Array<GenerateFilter> copy = new Array<>(filters);
result = executor.submit(() -> { result = executor.submit(() -> {
generating = true; try{
generating = true;
if(!filters.isEmpty()){
//write to buffer1 for reading
for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){
buffer1[px][py].set(editor.tile(px * scaling, py * scaling));
}
}
}
for(GenerateFilter filter : copy){
input.setFilter(filter, pixmap.getWidth(), pixmap.getHeight(), scaling, (x, y) -> buffer1[x][y]);
//read from buffer1 and write to buffer2
for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){
int x = px * scaling, y = py * scaling;
DummyTile tile = buffer1[px][py];
input.begin(editor, x, y, content.block(tile.floor), content.block(tile.block), content.block(tile.ore));
filter.apply(input);
buffer2[px][py].set(input.floor, input.block, input.ore, Team.all[tile.team], tile.rotation);
}
}
for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){
buffer1[px][py].set(buffer2[px][py]);
}
}
}
if(!filters.isEmpty()){
//write to buffer1 for reading
for(int px = 0; px < pixmap.getWidth(); px++){ for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){ for(int py = 0; py < pixmap.getHeight(); py++){
buffer1[px][py].set(editor.tile(px * scaling, py * scaling)); int color;
//get result from buffer1 if there's filters left, otherwise get from editor directly
if(filters.isEmpty()){
Tile tile = editor.tile(px * scaling, py * scaling);
color = MapIO.colorFor(tile.floor(), tile.block(), tile.ore(), Team.none);
}else{
DummyTile tile = buffer1[px][py];
color = MapIO.colorFor(content.block(tile.floor), content.block(tile.block), content.block(tile.ore), Team.none);
}
pixmap.drawPixel(px, pixmap.getHeight() - 1 - py, color);
} }
} }
}
for(GenerateFilter filter : copy){ Core.app.post(() -> {
input.setFilter(filter, (x, y) -> buffer1[x][y]); texture.draw(pixmap, 0, 0);
//read from buffer1 and write to buffer2 generating = false;
for(int px = 0; px < pixmap.getWidth(); px++){ });
for(int py = 0; py < pixmap.getHeight(); py++){ }catch(Exception e){
int x = px*scaling, y = py*scaling;
DummyTile tile = buffer1[px][py];
input.begin(editor, x, y, tile.floor, tile.block, tile.ore);
filter.apply(input);
buffer2[px][py].set(input.floor, input.block, input.ore, tile.team, tile.rotation);
}
}
for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){
buffer1[px][py].set(buffer2[px][py]);
}
}
}
for(int px = 0; px < pixmap.getWidth(); px++){
for(int py = 0; py < pixmap.getHeight(); py++){
int color;
//get result from buffer1 if there's filters left, otherwise get from editor directly
if(filters.isEmpty()){
Tile tile = editor.tile(px * scaling, py * scaling);
color = MapIO.colorFor(tile.floor(), tile.block(), tile.ore(), Team.none);
}else{
DummyTile tile = buffer1[px][py];
color = MapIO.colorFor(tile.floor, tile.block, tile.ore, Team.none);
}
pixmap.drawPixel(px, pixmap.getHeight() - 1 - py, color);
}
}
Core.app.post(() -> {
texture.draw(pixmap, 0, 0);
generating = false; generating = false;
}); e.printStackTrace();
}
return null; return null;
}); });
} }
public static class DummyTile{ public static class DummyTile{
public Block block = Blocks.air, ore = Blocks.air, floor = Blocks.air; public byte block, floor, ore, team, rotation;
public Team team = Team.none;
public int rotation;
void set(Block floor, Block wall, Block ore, Team team, int rotation){ void set(Block floor, Block wall, Block ore, Team team, int rotation){
this.floor = floor; this.floor = floor.id;
this.block = wall; this.block = wall.id;
this.ore = ore; this.ore = ore.id;
this.team = team; this.team = (byte)team.ordinal();
this.rotation = rotation; this.rotation = (byte)rotation;
} }
void set(DummyTile other){ void set(DummyTile other){
set(other.floor, other.block, other.ore, other.team, other.rotation); this.floor = other.floor;
this.block = other.block;
this.ore = other.ore;
this.team = other.team;
this.rotation = other.rotation;
} }
void set(Tile other){ void set(Tile other){

View File

@@ -267,7 +267,9 @@ public class MapView extends Element implements GestureListener{
Draw.color(Pal.remove); Draw.color(Pal.remove);
Lines.stroke(2f); Lines.stroke(2f);
Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2);
editor.renderer().draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); if(Core.scene.getKeyboardFocus() != null && isDescendantOf(Core.scene.getKeyboardFocus())){
editor.renderer().draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight);
}
Draw.reset(); Draw.reset();
if(!ScissorStack.pushScissors(rect.set(x, y, width, height))){ if(!ScissorStack.pushScissors(rect.set(x, y, width, height))){

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.editor;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.input.KeyCode;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.scene.ui.TextField.TextFieldFilter; import io.anuke.arc.scene.ui.TextField.TextFieldFilter;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
@@ -37,13 +38,49 @@ public class WaveInfoDialog extends FloatingDialog{
this.editor = editor; this.editor = editor;
shown(this::setup); shown(this::setup);
hidden(() -> editor.getTags().put("waves", world.maps.writeWaves(groups))); hidden(() -> {
if(groups == null){
editor.getTags().remove("waves");
}else{
editor.getTags().put("waves", world.maps.writeWaves(groups));
}
});
keyDown(key -> {
if(key == KeyCode.ESCAPE || key == KeyCode.BACK) {
Core.app.post(this::hide);
}
});
addCloseButton(); addCloseButton();
buttons.addButton("$settings.reset", () -> ui.showConfirm("$confirm", "$settings.clear.confirm", () ->{ buttons.addButton("$waves.edit", () -> {
groups = null; FloatingDialog dialog = new FloatingDialog("$waves.edit");
buildGroups(); dialog.addCloseButton();
})).size(270f, 64f); dialog.setFillParent(false);
dialog.cont.defaults().size(210f, 64f);
dialog.cont.addButton("$waves.copy", () -> {
ui.showInfoFade("$waves.copied");
Core.app.getClipboard().setContents(world.maps.writeWaves(groups));
dialog.hide();
}).disabled(b -> groups == null);
dialog.cont.row();
dialog.cont.addButton("$waves.load", () -> {
try{
groups = world.maps.readWaves(Core.app.getClipboard().getContents());
buildGroups();
}catch(Exception e){
ui.showError("$waves.invalid");
}
dialog.hide();
}).disabled(b -> Core.app.getClipboard().getContents() == null || Core.app.getClipboard().getContents().isEmpty());
dialog.cont.row();
dialog.cont.addButton("$settings.reset", () -> ui.showConfirm("$confirm", "$settings.clear.confirm", () ->{
groups = null;
buildGroups();
dialog.hide();
}));
dialog.show();
}).size(270f, 64f);
} }
void setup(){ void setup(){
@@ -61,7 +98,7 @@ public class WaveInfoDialog extends FloatingDialog{
}).growX().height(70f); }).growX().height(70f);
}).width(390f).growY(); }).width(390f).growY();
cont.table("clear", m -> { cont.table("clear", m -> {
m.add("Preview").color(Color.LIGHT_GRAY).growX().center().get().setAlignment(Align.center, Align.center); m.add("$waves.preview").color(Color.LIGHT_GRAY).growX().center().get().setAlignment(Align.center, Align.center);
m.row(); m.row();
m.addButton("-", () -> {}).update(t -> { m.addButton("-", () -> {}).update(t -> {
if(t.getClickListener().isPressed()){ if(t.getClickListener().isPressed()){
@@ -108,16 +145,16 @@ public class WaveInfoDialog extends FloatingDialog{
t.row(); t.row();
t.table(spawns -> { t.table(spawns -> {
spawns.addField("" + group.begin, TextFieldFilter.digitsOnly, text -> { spawns.addField("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePostiveInt(text)){ if(Strings.canParsePostiveInt(text)){
group.begin = Strings.parseInt(text); group.begin = Strings.parseInt(text) - 1;
updateWaves(); updateWaves();
} }
}).width(100f); }).width(100f);
spawns.add("$waves.to").padLeft(4).padRight(4); spawns.add("$waves.to").padLeft(4).padRight(4);
spawns.addField(group.end == never ? "" : group.end + "", TextFieldFilter.digitsOnly, text -> { spawns.addField(group.end == never ? "" : (group.end + 1) + "", TextFieldFilter.digitsOnly, text -> {
if(Strings.canParsePostiveInt(text)){ if(Strings.canParsePostiveInt(text)){
group.end = Strings.parseInt(text); group.end = Strings.parseInt(text) - 1;
updateWaves(); updateWaves();
}else if(text.isEmpty()){ }else if(text.isEmpty()){
group.end = never; group.end = never;
@@ -205,7 +242,7 @@ public class WaveInfoDialog extends FloatingDialog{
for(int i = start; i < displayed + start; i ++){ for(int i = start; i < displayed + start; i ++){
int wave = i; int wave = i;
preview.table("underline", table -> { preview.table("underline", table -> {
table.add(wave + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center); table.add((wave+1) + "").color(Pal.accent).center().colspan(2).get().setAlignment(Align.center, Align.center);
table.row(); table.row();
int[] spawned = new int[Vars.content.getBy(ContentType.unit).size]; int[] spawned = new int[Vars.content.getBy(ContentType.unit).size];

View File

@@ -4,6 +4,8 @@ import io.anuke.mindustry.editor.MapGenerateDialog.DummyTile;
import io.anuke.mindustry.editor.generation.FilterOption.SliderOption; import io.anuke.mindustry.editor.generation.FilterOption.SliderOption;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import static io.anuke.mindustry.Vars.content;
public class DistortFilter extends GenerateFilter{ public class DistortFilter extends GenerateFilter{
float scl = 40, mag = 5; float scl = 40, mag = 5;
@@ -16,10 +18,10 @@ public class DistortFilter extends GenerateFilter{
@Override @Override
public void apply(){ public void apply(){
DummyTile tile = in.tile(in.x + noise(in.x, in.y, scl, mag)-mag/2f, in.y + noise(in.x, in.y+o, scl, mag)-mag/2f); DummyTile tile = in.tile(in.x / (in.scaling) + (noise(in.x, in.y, scl, mag)-mag/2f)/in.scaling, in.y / (in.scaling) + (noise(in.x, in.y+o, scl, mag)-mag/2f)/in.scaling);
in.floor = tile.floor; in.floor = content.block(tile.floor);
if(!tile.block.synthetic() && !in.block.synthetic()) in.block = tile.block; if(!content.block(tile.block).synthetic() && !in.block.synthetic()) in.block = content.block(tile.block);
if(!((Floor)in.floor).isLiquid) in.ore = tile.ore; if(!((Floor)in.floor).isLiquid) in.ore = content.block(tile.ore);
} }
} }

View File

@@ -12,6 +12,8 @@ import io.anuke.mindustry.world.Block.Icon;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.OreBlock; import io.anuke.mindustry.world.blocks.OreBlock;
import static io.anuke.mindustry.Vars.updateEditorOnChange;
public abstract class FilterOption{ public abstract class FilterOption{
public static final Predicate<Block> floorsOnly = b -> (b instanceof Floor && !(b instanceof OreBlock)) && Core.atlas.isFound(b.icon(Icon.full)); public static final Predicate<Block> floorsOnly = b -> (b instanceof Floor && !(b instanceof OreBlock)) && Core.atlas.isFound(b.icon(Icon.full));
public static final Predicate<Block> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Icon.full)); public static final Predicate<Block> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Icon.full));
@@ -40,7 +42,11 @@ public abstract class FilterOption{
table.row(); table.row();
Slider slider = table.addSlider(min, max, (max-min)/200f, setter).growX().get(); Slider slider = table.addSlider(min, max, (max-min)/200f, setter).growX().get();
slider.setValue(getter.get()); slider.setValue(getter.get());
slider.changed(changed); if(updateEditorOnChange){
slider.changed(changed);
}else{
slider.released(changed);
}
} }
} }

View File

@@ -56,7 +56,7 @@ public abstract class GenerateFilter{
public Floor srcfloor; public Floor srcfloor;
public Block srcblock; public Block srcblock;
public Block srcore; public Block srcore;
public int x, y; public int x, y, width, height, scaling;
public MapEditor editor; public MapEditor editor;
public Block floor, block, ore; public Block floor, block, ore;
@@ -74,14 +74,17 @@ public abstract class GenerateFilter{
this.y = y; this.y = y;
} }
public void setFilter(GenerateFilter filter, TileProvider buffer){ public void setFilter(GenerateFilter filter, int width, int height, int scaling, TileProvider buffer){
this.buffer = buffer; this.buffer = buffer;
this.width = width;
this.height = height;
this.scaling = scaling;
noise.setSeed(filter.seed); noise.setSeed(filter.seed);
pnoise.setSeed((int)(filter.seed + 1)); pnoise.setSeed((int)(filter.seed + 1));
} }
DummyTile tile(float x, float y){ DummyTile tile(float x, float y){
return buffer.get(Mathf.clamp((int)x, 0, editor.width() - 1), Mathf.clamp((int)y, 0, editor.height() - 1)); return buffer.get(Mathf.clamp((int)x, 0, width - 1), Mathf.clamp((int)y, 0, height - 1));
} }
public interface TileProvider{ public interface TileProvider{

View File

@@ -45,7 +45,7 @@ import static io.anuke.mindustry.Vars.*;
public interface BuilderTrait extends Entity, TeamTrait{ public interface BuilderTrait extends Entity, TeamTrait{
//these are not instance variables! //these are not instance variables!
Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()}; Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()};
float placeDistance = 150f; float placeDistance = 220f;
float mineDistance = 70f; float mineDistance = 70f;
Array<BuildRequest> removal = new Array<>(); Array<BuildRequest> removal = new Array<>();

View File

@@ -32,20 +32,18 @@ public abstract class FlyingUnit extends BaseUnit{
target = null; target = null;
} }
if(target == null){ retarget(() -> {
targetClosest();
retarget(() -> { if(target == null) targetClosestEnemyFlag(BlockFlag.producer);
targetClosest(); if(target == null) targetClosestEnemyFlag(BlockFlag.turret);
if(target == null) targetClosestEnemyFlag(BlockFlag.producer); if(target == null){
if(target == null) targetClosestEnemyFlag(BlockFlag.turret); setState(patrol);
}
});
if(target == null){ if(target != null){
setState(patrol);
}
});
}else{
attack(type.attackLength); attack(type.attackLength);
if((Angles.near(angleTo(target), rotation, type.shootCone) || getWeapon().ignoreRotation) //bombers and such don't care about rotation if((Angles.near(angleTo(target), rotation, type.shootCone) || getWeapon().ignoreRotation) //bombers and such don't care about rotation

View File

@@ -9,9 +9,13 @@ import io.anuke.arc.graphics.g2d.*;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.math.geom.Rectangle; import io.anuke.arc.math.geom.Rectangle;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.*; import io.anuke.arc.util.Align;
import io.anuke.arc.util.Interval;
import io.anuke.arc.util.Pack;
import io.anuke.arc.util.Time;
import io.anuke.arc.util.pooling.Pools; import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.content.Mechs; import io.anuke.mindustry.content.Mechs;
@@ -24,12 +28,12 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.input.Binding; import io.anuke.mindustry.input.Binding;
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
import io.anuke.mindustry.io.TypeIO; import io.anuke.mindustry.io.TypeIO;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection; import io.anuke.mindustry.net.NetConnection;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Block.Icon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor; import io.anuke.mindustry.world.blocks.Floor;
@@ -407,6 +411,7 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
/** Draw all current build requests. Does not draw the beam effect, only the positions. */ /** Draw all current build requests. Does not draw the beam effect, only the positions. */
public void drawBuildRequests(){ public void drawBuildRequests(){
BuildRequest last = null;
for(BuildRequest request : getPlaceQueue()){ for(BuildRequest request : getPlaceQueue()){
if(getCurrentRequest() == request && request.progress > 0.001f) continue; if(getCurrentRequest() == request && request.progress > 0.001f) continue;
@@ -426,32 +431,37 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
Lines.square( Lines.square(
request.x * tilesize + block.offset(), request.x * tilesize + block.offset(),
request.y * tilesize + block.offset(), request.y * tilesize + block.offset(), rad);
rad);
}else{ }else{
float rad = Mathf.absin(Time.time(), 7f, 1f) - 1.5f + request.block.size * tilesize / 2f;
//draw place request
Lines.stroke(1f, Pal.accentBack);
Lines.square(
request.x * tilesize + request.block.offset(),
request.y * tilesize + request.block.offset() - 1,
rad);
Draw.color(); Draw.color();
PlaceDraw draw = PlaceDraw.instance;
Draw.rect(request.block.icon(Icon.full), draw.scalex = 1;
request.x * tilesize + request.block.offset(), draw.scaley = 1;
request.y * tilesize + request.block.offset(), rad*2, rad*2, request.block.rotate ? request.rotation * 90 : 0); draw.rotation = request.rotation;
if(last == null){
request.block.getPlaceDraw(draw, request.rotation, request.x, request.y, request.rotation);
}else{
request.block.getPlaceDraw(draw, request.rotation, last.x - request.x, last.y - request.y, last.rotation);
}
TextureRegion region = draw.region;
Draw.rect(region,
request.x * tilesize + request.block.offset(), request.y * tilesize + request.block.offset(),
region.getWidth() * 1f * Draw.scl * draw.scalex,
region.getHeight() * 1f * Draw.scl * draw.scaley, request.block.rotate ? draw.rotation * 90 : 0);
Draw.color(Pal.accent); Draw.color(Pal.accent);
for(int i = 0; i < 4; i++){
Point2 p = Geometry.d8edge[i];
float offset = -Math.max(request.block.size-1, 0)/2f * tilesize;
if(i % 2 == 0) Draw.rect("block-select", request.x * tilesize + request.block.offset() + offset * p.x, request.y * tilesize + request.block.offset() + offset * p.y, i * 90);
}
Draw.color();
Lines.square( last = request;
request.x * tilesize + request.block.offset(),
request.y * tilesize + request.block.offset(),
rad);
} }
} }
@@ -584,6 +594,8 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
if(!ui.chatfrag.chatOpen()){ if(!ui.chatfrag.chatOpen()){
velocity.add(movement.x, movement.y); velocity.add(movement.x, movement.y);
}else{
isShooting = false;
} }
float prex = x, prey = y; float prex = x, prey = y;
updateVelocityStatus(); updateVelocityStatus();

View File

@@ -30,7 +30,7 @@ public class Stats{
//each new launch period adds onto the rank 'points' //each new launch period adds onto the rank 'points'
if(wavesLasted >= zone.conditionWave){ if(wavesLasted >= zone.conditionWave){
score += (float)((wavesLasted - zone.conditionWave) / zone.launchPeriod + 1) * 1.3f; score += (float)((wavesLasted - zone.conditionWave) / zone.launchPeriod + 1) * 1.2f;
} }
int capacity = zone.loadout.core().itemCapacity; int capacity = zone.loadout.core().itemCapacity;
@@ -42,7 +42,7 @@ public class Stats{
frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size;
} }
score += frac*2.0f; score += frac*1.6f;
if(!launched){ if(!launched){
score *= 0.5f; score *= 0.5f;

View File

@@ -15,6 +15,7 @@ public enum Binding implements KeyBind{
deselect(KeyCode.MOUSE_RIGHT), deselect(KeyCode.MOUSE_RIGHT),
break_block(KeyCode.MOUSE_RIGHT), break_block(KeyCode.MOUSE_RIGHT),
rotate(new Axis(KeyCode.SCROLL)), rotate(new Axis(KeyCode.SCROLL)),
diagonal_placement(KeyCode.CONTROL_LEFT),
pick(KeyCode.MOUSE_MIDDLE), pick(KeyCode.MOUSE_MIDDLE),
dash(KeyCode.SHIFT_LEFT), dash(KeyCode.SHIFT_LEFT),
gridMode(KeyCode.GRAVE), gridMode(KeyCode.GRAVE),

View File

@@ -5,7 +5,6 @@ import io.anuke.arc.Graphics.Cursor;
import io.anuke.arc.Graphics.Cursor.SystemCursor; import io.anuke.arc.Graphics.Cursor.SystemCursor;
import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.Lines; import io.anuke.arc.graphics.g2d.Lines;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Point2;
@@ -17,7 +16,6 @@ import io.anuke.mindustry.input.PlaceUtils.NormalizeDrawResult;
import io.anuke.mindustry.input.PlaceUtils.NormalizeResult; import io.anuke.mindustry.input.PlaceUtils.NormalizeResult;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Block.Icon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -34,33 +32,35 @@ public class DesktopInput extends InputHandler{
/**Animation scale for line.*/ /**Animation scale for line.*/
private float selectScale; private float selectScale;
private int prevX, prevY, prevRotation;
public DesktopInput(Player player){ public DesktopInput(Player player){
super(player); super(player);
} }
/**Draws a placement icon for a specific block.*/ /**Draws a placement icon for a specific block.*/
void drawPlace(int x, int y, Block block, int rotation){ void drawPlace(int x, int y, Block block, int rotation, int prevX, int prevY, int prevRotation){
if(validPlace(x, y, block, rotation)){ if(validPlace(x, y, block, rotation)){
block.getPlaceDraw(placeDraw, rotation, prevX, prevY, prevRotation);
Draw.color(); Draw.color();
Draw.rect(placeDraw.region, x * tilesize + block.offset(), y * tilesize + block.offset(),
TextureRegion region = block.icon(Icon.full); placeDraw.region.getWidth() * selectScale * Draw.scl * placeDraw.scalex,
placeDraw.region.getHeight() * selectScale * Draw.scl * placeDraw.scaley,
Draw.rect(region, x * tilesize + block.offset(), y * tilesize + block.offset(), block.rotate ? placeDraw.rotation * 90 : 0);
region.getWidth() * selectScale * Draw.scl,
region.getHeight() * selectScale * Draw.scl, block.rotate ? rotation * 90 : 0);
Draw.color(Pal.accent); Draw.color(Pal.accent);
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
Point2 p = Geometry.d8edge[i]; Point2 p = Geometry.d8edge[i];
float offset = -Math.max(block.size-1, 0)/2f * tilesize; float offset = -Math.max(block.size-1, 0)/2f * tilesize;
Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90); if(i % 2 == 0)Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90);
} }
Draw.color(); Draw.color();
}else{ }else{
Draw.color(Pal.removeBack); Draw.color(Pal.removeBack);
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset() - 1, block.size * tilesize / 2f); Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset() - 1, block.size * tilesize / 2f - 1);
Draw.color(Pal.remove); Draw.color(Pal.remove);
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset(), block.size * tilesize / 2f); Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset(), block.size * tilesize / 2f - 1);
} }
} }
@@ -77,32 +77,21 @@ public class DesktopInput extends InputHandler{
//draw selection(s) //draw selection(s)
if(mode == placing && block != null){ if(mode == placing && block != null){
NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, true, maxLength); prevX = selectX;
prevY = selectY;
prevRotation = rotation;
for(int i = 0; i <= result.getLength(); i += block.size){ iterateLine(selectX, selectY, cursorX, cursorY, l -> {
int x = selectX + i * Mathf.sign(cursorX - selectX) * Mathf.num(result.isX()); if(l.last && block.rotate){
int y = selectY + i * Mathf.sign(cursorY - selectY) * Mathf.num(!result.isX()); drawArrow(block, l.x, l.y, l.rotation);
if(i + block.size > result.getLength() && block.rotate){
Draw.color(!validPlace(x, y, block, result.rotation) ? Pal.removeBack : Pal.accentBack);
Draw.rect(Core.atlas.find("place-arrow"),
x * tilesize + block.offset(),
y * tilesize + block.offset() - 1,
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, result.rotation * 90 - 90);
Draw.color(!validPlace(x, y, block, result.rotation) ? Pal.remove : Pal.accent);
Draw.rect(Core.atlas.find("place-arrow"),
x * tilesize + block.offset(),
y * tilesize + block.offset(),
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, result.rotation * 90 - 90);
} }
drawPlace(l.x, l.y, block, l.rotation, prevX - l.x, prevY - l.y, prevRotation);
drawPlace(x, y, block, result.rotation); prevX = l.x;
} prevY = l.y;
prevRotation = l.rotation;
});
Draw.reset();
}else if(mode == breaking){ }else if(mode == breaking){
NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, selectX, selectY, cursorX, cursorY, false, maxLength, 1f); NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, selectX, selectY, cursorX, cursorY, false, maxLength, 1f);
NormalizeResult dresult = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength); NormalizeResult dresult = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength);
@@ -126,21 +115,9 @@ public class DesktopInput extends InputHandler{
Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y);
}else if(isPlacing()){ }else if(isPlacing()){
if(block.rotate){ if(block.rotate){
Draw.color(!validPlace(cursorX, cursorY, block, rotation) ? Pal.removeBack : Pal.accentBack); drawArrow(block, cursorX, cursorY, rotation);
Draw.rect(Core.atlas.find("place-arrow"),
cursorX * tilesize + block.offset(),
cursorY * tilesize + block.offset() - 1,
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90);
Draw.color(!validPlace(cursorX, cursorY, block, rotation) ? Pal.remove : Pal.accent);
Draw.rect(Core.atlas.find("place-arrow"),
cursorX * tilesize + block.offset(),
cursorY * tilesize + block.offset(),
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90);
} }
drawPlace(cursorX, cursorY, block, rotation); drawPlace(cursorX, cursorY, block, rotation, cursorX, cursorY, rotation);
block.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, block, rotation)); block.drawPlace(cursorX, cursorY, rotation, validPlace(cursorX, cursorY, block, rotation));
} }
@@ -166,7 +143,10 @@ public class DesktopInput extends InputHandler{
//renderer.minimap.zoomBy(-Core.input.axisTap(Binding.zoom_minimap)); //renderer.minimap.zoomBy(-Core.input.axisTap(Binding.zoom_minimap));
if(player.isDead()) return; if(player.isDead()){
cursorType = SystemCursor.arrow;
return;
}
pollInput(); pollInput();
@@ -190,9 +170,7 @@ public class DesktopInput extends InputHandler{
Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY()); Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY());
if(player.isDead()){ if(cursor != null){
cursorType = SystemCursor.arrow;
}else if(cursor != null){
cursor = cursor.target(); cursor = cursor.target();
cursorType = cursor.block().getCursor(cursor); cursorType = cursor.block().getCursor(cursor);
@@ -255,20 +233,13 @@ public class DesktopInput extends InputHandler{
selectY = tileY(Core.input.mouseY()); selectY = tileY(Core.input.mouseY());
} }
if(Core.input.keyRelease(Binding.break_block) || Core.input.keyRelease(Binding.select)){ if(Core.input.keyRelease(Binding.break_block) || Core.input.keyRelease(Binding.select)){
if(mode == placing && block != null){ //touch up while placing, place everything in selection if(mode == placing && block != null){ //touch up while placing, place everything in selection
NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, true, maxLength); iterateLine(selectX, selectY, cursorX, cursorY, l -> {
rotation = l.rotation;
for(int i = 0; i <= result.getLength(); i += block.size){ tryPlaceBlock(l.x, l.y);
int x = selectX + i * Mathf.sign(cursorX - selectX) * Mathf.num(result.isX()); });
int y = selectY + i * Mathf.sign(cursorY - selectY) * Mathf.num(!result.isX());
rotation = result.rotation;
tryPlaceBlock(x, y);
}
}else if(mode == breaking){ //touch up while breaking, break everything in selection }else if(mode == breaking){ //touch up while breaking, break everything in selection
NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength); NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength);
for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){ for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){
@@ -287,7 +258,6 @@ public class DesktopInput extends InputHandler{
mode = none; mode = none;
} }
} }
@Override @Override
@@ -312,5 +282,4 @@ public class DesktopInput extends InputHandler{
droppingItem = false; droppingItem = false;
} }
} }
} }

View File

@@ -3,13 +3,19 @@ package io.anuke.mindustry.input;
import io.anuke.annotations.Annotations.Loc; import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote; import io.anuke.annotations.Annotations.Remote;
import io.anuke.arc.Core; import io.anuke.arc.Core;
import io.anuke.arc.collection.Array;
import io.anuke.arc.function.Consumer;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.input.InputProcessor; import io.anuke.arc.input.InputProcessor;
import io.anuke.arc.math.Angles; import io.anuke.arc.math.Angles;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.scene.ui.layout.Table;
import io.anuke.arc.util.Time; import io.anuke.arc.util.Time;
import io.anuke.arc.util.Tmp;
import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.Blocks;
import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.content.Fx;
import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects;
@@ -17,6 +23,7 @@ import io.anuke.mindustry.entities.effect.ItemTransfer;
import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest;
import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.entities.type.Player;
import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.ValidateException; import io.anuke.mindustry.net.ValidateException;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
@@ -44,6 +51,9 @@ public abstract class InputHandler implements InputProcessor{
public int rotation; public int rotation;
public boolean droppingItem; public boolean droppingItem;
protected PlaceDraw placeDraw = new PlaceDraw();
private PlaceLine line = new PlaceLine();
public InputHandler(Player player){ public InputHandler(Player player){
this.player = player; this.player = player;
} }
@@ -337,4 +347,67 @@ public abstract class InputHandler implements InputProcessor{
player.addBuildRequest(new BuildRequest(tile.x, tile.y)); player.addBuildRequest(new BuildRequest(tile.x, tile.y));
} }
void drawArrow(Block block, int x, int y, int rotation){
Draw.color(!validPlace(x, y, block, rotation) ? Pal.removeBack : Pal.accentBack);
Draw.rect(Core.atlas.find("place-arrow"),
x * tilesize + block.offset(),
y * tilesize + block.offset() - 1,
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90);
Draw.color(!validPlace(x, y, block, rotation) ? Pal.remove : Pal.accent);
Draw.rect(Core.atlas.find("place-arrow"),
x * tilesize + block.offset(),
y * tilesize + block.offset(),
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90);
}
void iterateLine(int startX, int startY, int endX, int endY, Consumer<PlaceLine> cons){
Array<Point2> points;
boolean diagonal = Core.input.keyDown(Binding.diagonal_placement);
if(Core.settings.getBool("swapdiagonal")){
diagonal = !diagonal;
}
if(diagonal){
points = PlaceUtils.normalizeDiagonal(startX, startY, endX, endY);
}else{
points = PlaceUtils.normalizeLine(startX, startY, endX, endY);
}
float angle = Angles.angle(startX, startY, endX, endY);
int baseRotation = (startX == endX && startY == endY) ? rotation : ((int)((angle + 45) / 90f)) % 4;
Tmp.r3.set(-1, -1, 0, 0);
for(int i = 0; i < points.size; i++){
Point2 point = points.get(i);
if(block != null && Tmp.r2.setSize(block.size * tilesize).setCenter(point.x*tilesize + block.offset(), point.y*tilesize + block.offset()).overlaps(Tmp.r3)){
continue;
}
Point2 next = i == points.size - 1 ? null : points.get(i + 1);
line.x = point.x;
line.y = point.y;
line.rotation = next != null ? Tile.relativeTo(point.x, point.y, next.x, next.y) : baseRotation;
line.last = next == null;
cons.accept(line);
Tmp.r3.setSize(block.size * tilesize).setCenter(point.x*tilesize + block.offset(), point.y*tilesize + block.offset());
}
}
public static class PlaceDraw{
public int rotation, scalex, scaley;
public TextureRegion region;
public static final PlaceDraw instance = new PlaceDraw();
}
class PlaceLine{
public int x, y, rotation;
public boolean last;
}
} }

View File

@@ -34,7 +34,6 @@ import io.anuke.mindustry.input.PlaceUtils.NormalizeDrawResult;
import io.anuke.mindustry.input.PlaceUtils.NormalizeResult; import io.anuke.mindustry.input.PlaceUtils.NormalizeResult;
import io.anuke.mindustry.ui.dialogs.FloatingDialog; import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Block.Icon;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -50,7 +49,6 @@ public class MobileInput extends InputHandler implements GestureListener{
//gesture data //gesture data
private Vector2 vector = new Vector2(); private Vector2 vector = new Vector2();
private float lastDistance = -1f; private float lastDistance = -1f;
private boolean canPan;
/** Set of completed guides. */ /** Set of completed guides. */
private ObjectSet<String> guides = new ObjectSet<>(); private ObjectSet<String> guides = new ObjectSet<>();
@@ -62,6 +60,8 @@ public class MobileInput extends InputHandler implements GestureListener{
/** Animation data for crosshair. */ /** Animation data for crosshair. */
private float crosshairScale; private float crosshairScale;
private TargetTrait lastTarget; private TargetTrait lastTarget;
/** Used for shifting build requests.*/
private float shiftDeltaX, shiftDeltaY;
/** List of currently selected tiles to place. */ /** List of currently selected tiles to place. */
private Array<PlaceRequest> selection = new Array<>(); private Array<PlaceRequest> selection = new Array<>();
@@ -78,6 +78,8 @@ public class MobileInput extends InputHandler implements GestureListener{
/** Last placed request. Used for drawing block overlay. */ /** Last placed request. Used for drawing block overlay. */
private PlaceRequest lastPlaced; private PlaceRequest lastPlaced;
private int prevX, prevY, prevRotation;
public MobileInput(Player player){ public MobileInput(Player player){
super(player); super(player);
Core.input.addProcessor(new GestureDetector(20, 0.5f, 0.4f, 0.15f, this)); Core.input.addProcessor(new GestureDetector(20, 0.5f, 0.4f, 0.15f, this));
@@ -167,42 +169,6 @@ public class MobileInput extends InputHandler implements GestureListener{
removals.add(request); removals.add(request);
} }
void drawRequest(PlaceRequest request){
Tile tile = request.tile();
if(!request.remove){
//draw placing request
float offset = request.block.offset();
TextureRegion region = request.block.icon(Icon.full);
Draw.mixcol(Pal.accent, Mathf.clamp((1f - request.scale) / 0.5f));
Draw.tint(Color.WHITE, Pal.breakInvalid, request.redness);
Draw.rect(region, tile.worldx() + offset, tile.worldy() + offset,
region.getWidth() * request.scale * Draw.scl,
region.getHeight() * request.scale * Draw.scl,
request.block.rotate ? request.rotation * 90 : 0);
Draw.mixcol(Pal.accent, 1f);
for(int i = 0; i < 4; i++){
Point2 p = Geometry.d8edge[i];
float poffset = -Math.max(request.block.size-1, 0)/2f * tilesize;
TextureRegion find = Core.atlas.find("block-select");
Draw.rect("block-select", request.tile().x * tilesize + request.block.offset() + poffset * p.x, request.tile().y * tilesize + request.block.offset() + poffset * p.y,
find.getWidth() * Draw.scl * request.scale, find.getHeight() * Draw.scl * request.scale, i * 90);
}
Draw.color();
}else{
float rad = (tile.block().size * tilesize / 2f - 1) * request.scale;
Draw.mixcol();
//draw removing request
Draw.tint(Pal.removeBack);
Lines.square(tile.drawx(), tile.drawy()-1, rad);
Draw.tint(Pal.remove);
Lines.square(tile.drawx(), tile.drawy(), rad);
}
}
void showGuide(String type){ void showGuide(String type){
if(!guides.contains(type) && !Core.settings.getBool(type, false)){ if(!guides.contains(type) && !Core.settings.getBool(type, false)){
FloatingDialog dialog = new FloatingDialog("$" + type + ".title"); FloatingDialog dialog = new FloatingDialog("$" + type + ".title");
@@ -219,26 +185,76 @@ public class MobileInput extends InputHandler implements GestureListener{
} }
} }
void drawPlaceArrow(Block block, int x, int y, int rotation){ //endregion
if(!block.rotate) return; //region UI and drawing
Draw.color(!validPlace(x, y, block, rotation) ? Pal.removeBack : Pal.accentBack);
Draw.rect(Core.atlas.find("place-arrow"),
x * tilesize + block.offset(),
y * tilesize + block.offset() - 1,
Core.atlas.find("place-arrow").getWidth() * Draw.scl,
Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90);
Draw.color(!validPlace(x, y, block, rotation) ? Pal.remove : Pal.accent); void drawRequest(PlaceRequest request, PlaceRequest prev){
Draw.rect(Core.atlas.find("place-arrow"), Tile tile = request.tile();
x * tilesize + block.offset(),
y * tilesize + block.offset(), if(!request.remove){
Core.atlas.find("place-arrow").getWidth() * Draw.scl, if(prev != null){
Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); block.getPlaceDraw(placeDraw, request.rotation, prev.x - request.x, prev.y - request.y, prev.rotation);
}else{
block.getPlaceDraw(placeDraw, request.rotation, 0, 0, request.rotation);
}
//draw placing request
float offset = request.block.offset();
TextureRegion region = placeDraw.region;
Draw.mixcol(Pal.accent, Mathf.clamp((1f - request.scale) / 0.5f));
Draw.tint(Color.WHITE, Pal.breakInvalid, request.redness);
Draw.rect(region, tile.worldx() + offset, tile.worldy() + offset,
region.getWidth() * request.scale * Draw.scl * placeDraw.scalex,
region.getHeight() * request.scale * Draw.scl * placeDraw.scaley,
request.block.rotate ? placeDraw.rotation * 90 : 0);
Draw.mixcol(Pal.accent, 1f);
for(int i = 0; i < 4; i++){
Point2 p = Geometry.d8edge[i];
float poffset = -Math.max(request.block.size-1, 0)/2f * tilesize;
TextureRegion find = Core.atlas.find("block-select");
if(i%2 == 0) Draw.rect("block-select", request.tile().x * tilesize + request.block.offset() + poffset * p.x, request.tile().y * tilesize + request.block.offset() + poffset * p.y,
find.getWidth() * Draw.scl * request.scale, find.getHeight() * Draw.scl * request.scale, i * 90);
}
Draw.color();
}else{
float rad = (tile.block().size * tilesize / 2f - 1) * request.scale;
Draw.mixcol();
//draw removing request
Draw.tint(Pal.removeBack);
Lines.square(tile.drawx(), tile.drawy()-1, rad);
Draw.tint(Pal.remove);
Lines.square(tile.drawx(), tile.drawy(), rad);
}
} }
//endregion /**Draws a placement icon for a specific block.*/
void drawPlace(int x, int y, Block block, int rotation, int prevX, int prevY, int prevRotation){
if(validPlace(x, y, block, rotation)){
block.getPlaceDraw(placeDraw, rotation, prevX, prevY, prevRotation);
//region UI and drawing Draw.color();
Draw.rect(placeDraw.region, x * tilesize + block.offset(), y * tilesize + block.offset(),
placeDraw.region.getWidth() * Draw.scl * placeDraw.scalex,
placeDraw.region.getHeight() * Draw.scl * placeDraw.scaley,
block.rotate ? placeDraw.rotation * 90 : 0);
Draw.color(Pal.accent);
for(int i = 0; i < 4; i++){
Point2 p = Geometry.d8edge[i];
float offset = -Math.max(block.size-1, 0)/2f * tilesize;
if(i % 2 == 0)Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y, i * 90);
}
Draw.color();
}else{
Draw.color(Pal.removeBack);
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset() - 1, block.size * tilesize / 2f - 1);
Draw.color(Pal.remove);
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset(), block.size * tilesize / 2f - 1);
}
}
@Override @Override
public void buildUI(Table table){ public void buildUI(Table table){
@@ -314,9 +330,11 @@ public class MobileInput extends InputHandler implements GestureListener{
request.scale = Mathf.lerpDelta(request.scale, 0f, 0.2f); request.scale = Mathf.lerpDelta(request.scale, 0f, 0.2f);
request.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f); request.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f);
drawRequest(request); drawRequest(request, null);
} }
PlaceRequest last = null;
//draw list of requests //draw list of requests
for(PlaceRequest request : selection){ for(PlaceRequest request : selection){
Tile tile = request.tile(); Tile tile = request.tile();
@@ -336,17 +354,19 @@ public class MobileInput extends InputHandler implements GestureListener{
if(!request.remove && request == lastPlaced && request.block != null){ if(!request.remove && request == lastPlaced && request.block != null){
Draw.mixcol(); Draw.mixcol();
drawPlaceArrow(request.block, tile.x, tile.y, request.rotation); drawArrow(request.block, tile.x, tile.y, request.rotation);
} }
Draw.mixcol(Tmp.c1, 1f); Draw.mixcol(Tmp.c1, 1f);
drawRequest(request); drawRequest(request, last);
//draw last placed request //draw last placed request
if(!request.remove && request == lastPlaced && request.block != null){ if(!request.remove && request == lastPlaced && request.block != null){
Draw.mixcol(); Draw.mixcol();
request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation)); request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation));
} }
last = request;
} }
Draw.mixcol(); Draw.mixcol();
@@ -357,51 +377,23 @@ public class MobileInput extends InputHandler implements GestureListener{
int tileX = tileX(Core.input.mouseX()); int tileX = tileX(Core.input.mouseX());
int tileY = tileY(Core.input.mouseY()); int tileY = tileY(Core.input.mouseY());
//draw placing
if(mode == placing && block != null){ if(mode == placing && block != null){
//draw placing
NormalizeDrawResult dresult = PlaceUtils.normalizeDrawArea(block, lineStartX, lineStartY, tileX, tileY, true, maxLength, lineScale); prevX = lineStartX;
prevY = lineStartY;
prevRotation = rotation;
Lines.rect(dresult.x, dresult.y, dresult.x2 - dresult.x, dresult.y2 - dresult.y); iterateLine(lineStartX, lineStartY, tileX, tileY, l -> {
if(l.last && block.rotate){
NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, true, maxLength); drawArrow(block, l.x, l.y, l.rotation);
{
int x = lineStartX + result.getLength() * Mathf.sign(tileX - lineStartX) * Mathf.num(result.isX());
int y = lineStartY + result.getLength() * Mathf.sign(tileY - lineStartY) * Mathf.num(!result.isX());
drawPlaceArrow(block, x, y, result.rotation);
}
//go through each cell and draw the block to place if valid
for(int i = 0; i <= result.getLength(); i += block.size){
int x = lineStartX + i * Mathf.sign(tileX - lineStartX) * Mathf.num(result.isX());
int y = lineStartY + i * Mathf.sign(tileY - lineStartY) * Mathf.num(!result.isX());
if(!checkOverlapPlacement(x, y, block) && validPlace(x, y, block, result.rotation)){
Draw.color();
TextureRegion region = block.icon(Icon.full);
Draw.rect(region, x * tilesize + block.offset(), y * tilesize + block.offset(),
region.getWidth() * lineScale * Draw.scl,
region.getHeight() * lineScale * Draw.scl,
block.rotate ? result.rotation * 90 : 0);
Draw.color(Pal.accent);
for(int j = 0; j < 4; j++){
Point2 p = Geometry.d8edge[j];
float offset = -Math.max(block.size-1, 0)/2f * tilesize;
Draw.rect("block-select", x * tilesize + block.offset() + offset * p.x, y * tilesize + block.offset() + offset * p.y,j * 90);
}
Draw.color();
}else{
Draw.color(Pal.removeBack);
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset() - 1, block.size * tilesize / 2f);
Draw.color(Pal.remove);
Lines.square(x * tilesize + block.offset(), y * tilesize + block.offset(), block.size * tilesize / 2f);
} }
} drawPlace(l.x, l.y, block, l.rotation, prevX - l.x, prevY - l.y, prevRotation);
prevX = l.x;
prevY = l.y;
prevRotation = l.rotation;
});
}else if(mode == breaking){ }else if(mode == breaking){
//draw breaking //draw breaking
NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, lineStartX, lineStartY, tileX, tileY, false, maxLength, 1f); NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, lineStartX, lineStartY, tileX, tileY, false, maxLength, 1f);
@@ -487,28 +479,12 @@ public class MobileInput extends InputHandler implements GestureListener{
int tileX = tileX(screenX); int tileX = tileX(screenX);
int tileY = tileY(screenY); int tileY = tileY(screenY);
if(mode == placing && block != null){ if(mode == placing && isPlacing()){
iterateLine(lineStartX, lineStartY, tileX, tileY, l -> {
//normalize area PlaceRequest request = new PlaceRequest(l.x, l.y, block, l.rotation);
NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, true, 100); request.scale = 1f;
selection.add(request);
rotation = result.rotation; });
//place blocks on line
for(int i = 0; i <= result.getLength(); i += block.size){
int x = lineStartX + i * Mathf.sign(tileX - lineStartX) * Mathf.num(result.isX());
int y = lineStartY + i * Mathf.sign(tileY - lineStartY) * Mathf.num(!result.isX());
if(!checkOverlapPlacement(x, y, block) && validPlace(x, y, block, result.rotation)){
PlaceRequest request = new PlaceRequest(x * tilesize + block.offset(), y * tilesize + block.offset(), block, result.rotation);
request.scale = 1f;
selection.add(request);
}
}
//reset last placed for convenience
lastPlaced = null;
}else if(mode == breaking){ }else if(mode == breaking){
//normalize area //normalize area
NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, false, maxLength); NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, false, maxLength);
@@ -526,7 +502,7 @@ public class MobileInput extends InputHandler implements GestureListener{
tar = tar.target(); tar = tar.target();
if(!hasRequest(world.tile(tar.x, tar.y)) && validBreak(tar.x, tar.y)){ if(!hasRequest(world.tile(tar.x, tar.y)) && validBreak(tar.x, tar.y)){
PlaceRequest request = new PlaceRequest(tar.worldx(), tar.worldy()); PlaceRequest request = new PlaceRequest(tar.x, tar.y);
request.scale = 1f; request.scale = 1f;
selection.add(request); selection.add(request);
} }
@@ -589,11 +565,11 @@ public class MobileInput extends InputHandler implements GestureListener{
removeRequest(getRequest(cursor)); removeRequest(getRequest(cursor));
}else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){ }else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){
//add to selection queue if it's a valid place position //add to selection queue if it's a valid place position
selection.add(lastPlaced = new PlaceRequest(cursor.worldx() + block.offset(), cursor.worldy() + block.offset(), block, rotation)); selection.add(lastPlaced = new PlaceRequest(cursor.x, cursor.y, block, rotation));
}else if(mode == breaking && validBreak(cursor.target().x, cursor.target().y) && !hasRequest(cursor.target())){ }else if(mode == breaking && validBreak(cursor.target().x, cursor.target().y) && !hasRequest(cursor.target())){
//add to selection queue if it's a valid BREAK position //add to selection queue if it's a valid BREAK position
cursor = cursor.target(); cursor = cursor.target();
selection.add(new PlaceRequest(cursor.worldx(), cursor.worldy())); selection.add(new PlaceRequest(cursor.x, cursor.y));
}else if(!canTapPlayer(worldx, worldy) && !tileTapped(cursor.target())){ }else if(!canTapPlayer(worldx, worldy) && !tileTapped(cursor.target())){
tryBeginMine(cursor); tryBeginMine(cursor);
} }
@@ -701,10 +677,21 @@ public class MobileInput extends InputHandler implements GestureListener{
} }
if(selecting){ //pan all requests if(selecting){ //pan all requests
for(PlaceRequest req : selection){ shiftDeltaX += deltaX;
if(req.remove) continue; //don't shift removal requests shiftDeltaY += deltaY;
req.x += deltaX;
req.y += deltaY; int shiftedX = (int)(shiftDeltaX / tilesize);
int shiftedY = (int)(shiftDeltaY / tilesize);
if(Math.abs(shiftedX) > 0 || Math.abs(shiftedY) > 0){
for(PlaceRequest req : selection){
if(req.remove) continue; //don't shift removal requests
req.x += shiftedX;
req.y += shiftedY;
}
shiftDeltaX %= tilesize;
shiftDeltaY %= tilesize;
} }
}else{ }else{
//pan player //pan player
@@ -715,6 +702,12 @@ public class MobileInput extends InputHandler implements GestureListener{
return false; return false;
} }
@Override
public boolean panStop(float x, float y, int pointer, KeyCode button){
shiftDeltaX = shiftDeltaY = 0f;
return false;
}
@Override @Override
public boolean zoom(float initialDistance, float distance){ public boolean zoom(float initialDistance, float distance){
if(lastDistance == -1) lastDistance = initialDistance; if(lastDistance == -1) lastDistance = initialDistance;
@@ -727,8 +720,8 @@ public class MobileInput extends InputHandler implements GestureListener{
//endregion //endregion
class PlaceRequest{ private class PlaceRequest{
float x, y; int x, y;
Block block; Block block;
int rotation; int rotation;
boolean remove; boolean remove;
@@ -737,7 +730,7 @@ public class MobileInput extends InputHandler implements GestureListener{
float scale; float scale;
float redness; float redness;
PlaceRequest(float x, float y, Block block, int rotation){ PlaceRequest(int x, int y, Block block, int rotation){
this.x = x; this.x = x;
this.y = y; this.y = y;
this.block = block; this.block = block;
@@ -745,14 +738,14 @@ public class MobileInput extends InputHandler implements GestureListener{
this.remove = false; this.remove = false;
} }
PlaceRequest(float x, float y){ PlaceRequest(int x, int y){
this.x = x; this.x = x;
this.y = y; this.y = y;
this.remove = true; this.remove = true;
} }
Tile tile(){ Tile tile(){
return world.tileWorld(x - (block == null ? 0 : block.offset()), y - (block == null ? 0 : block.offset())); return world.tile(x, y);
} }
} }
} }

View File

@@ -1,13 +1,44 @@
package io.anuke.mindustry.input; package io.anuke.mindustry.input;
import io.anuke.mindustry.world.Block; import io.anuke.arc.collection.Array;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Bresenham2;
import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.util.pooling.Pools;
import io.anuke.mindustry.world.Block;
import static io.anuke.mindustry.Vars.tilesize; import static io.anuke.mindustry.Vars.tilesize;
public class PlaceUtils{ public class PlaceUtils{
private static final NormalizeResult result = new NormalizeResult(); private static final NormalizeResult result = new NormalizeResult();
private static final NormalizeDrawResult drawResult = new NormalizeDrawResult(); private static final NormalizeDrawResult drawResult = new NormalizeDrawResult();
private static Bresenham2 bres = new Bresenham2();
private static Array<Point2> points = new Array<>();
/**Normalize a diagonal line into points. */
public static Array<Point2> normalizeDiagonal(int startX, int startY, int endX, int endY){
Pools.freeAll(points);
points.clear();
return bres.lineNoDiagonal(startX, startY, endX, endY, Pools.get(Point2.class, Point2::new), points);
}
/**Normalize two points into one straight line, no diagonals.*/
public static Array<Point2> normalizeLine(int startX, int startY, int endX, int endY){
Pools.freeAll(points);
points.clear();
if(Math.abs(startX - endX) > Math.abs(startY - endY)){
//go width
for(int i = 0; i <= Math.abs(startX - endX); i++){
points.add(Pools.obtain(Point2.class, Point2::new).set(startX + i*Mathf.sign(endX - startX), startY));
}
}else{
//go height
for(int i = 0; i <= Math.abs(startY - endY); i++){
points.add(Pools.obtain(Point2.class, Point2::new).set(startX, startY + i*Mathf.sign(endY - startY)));
}
}
return points;
}
/** /**
* Normalizes a placement area and returns the result, ready to be used for drawing a rectangle. * Normalizes a placement area and returns the result, ready to be used for drawing a rectangle.

View File

@@ -25,7 +25,7 @@ import static io.anuke.mindustry.Vars.world;
public class MapGenerator extends Generator{ public class MapGenerator extends Generator{
private Map map; private Map map;
private String mapName; private String mapName;
private Array<Decoration> decorations = new Array<>(); private Array<Decoration> decorations = Array.with(new Decoration(Blocks.stone, Blocks.rock, 0.003f));
private Loadout loadout; private Loadout loadout;
/**How much the landscape is randomly distorted.*/ /**How much the landscape is randomly distorted.*/
public float distortion = 3; public float distortion = 3;
@@ -99,6 +99,10 @@ public class MapGenerator extends Generator{
enemies.add(new Point2(x, y)); enemies.add(new Point2(x, y));
tiles[x][y].setBlock(Blocks.air); tiles[x][y].setBlock(Blocks.air);
} }
if(tiles[x][y].block() == Blocks.part){
tiles[x][y].setBlock(Blocks.air);
}
} }
} }
@@ -120,9 +124,14 @@ public class MapGenerator extends Generator{
if(distortFloor){ if(distortFloor){
tile.setFloor(tiles[newX][newY].floor()); tile.setFloor(tiles[newX][newY].floor());
tile.setOre(tiles[newX][newY].ore());
} }
for(Decoration decor : decorations){ for(Decoration decor : decorations){
if(x > 0 && y > 0 && (tiles[x - 1][y].block() == decor.wall || tiles[x][y - 1].block() == decor.wall)){
continue;
}
if(tile.block() == Blocks.air && !(decor.wall instanceof Floor) && tile.floor() == decor.floor && Mathf.chance(decor.chance)){ if(tile.block() == Blocks.air && !(decor.wall instanceof Floor) && tile.floor() == decor.floor && Mathf.chance(decor.chance)){
tile.setBlock(decor.wall); tile.setBlock(decor.wall);
}else if(tile.floor() == decor.floor && decor.wall instanceof Floor && Mathf.chance(decor.chance)){ }else if(tile.floor() == decor.floor && decor.wall instanceof Floor && Mathf.chance(decor.chance)){

View File

@@ -124,6 +124,7 @@ public class SettingsMenuDialog extends SettingsDialog{
game.screenshakePref(); game.screenshakePref();
game.checkPref("effects", true); game.checkPref("effects", true);
game.checkPref("swapdiagonal", false);
if(mobile){ if(mobile){
game.checkPref("autotarget", true); game.checkPref("autotarget", true);
} }

View File

@@ -4,6 +4,7 @@ import io.anuke.arc.Core;
import io.anuke.arc.Events; import io.anuke.arc.Events;
import io.anuke.arc.collection.Array; import io.anuke.arc.collection.Array;
import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Color;
import io.anuke.arc.input.KeyCode;
import io.anuke.arc.math.Interpolation; import io.anuke.arc.math.Interpolation;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.scene.Element; import io.anuke.arc.scene.Element;
@@ -31,6 +32,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Packets.AdminAction; import io.anuke.mindustry.net.Packets.AdminAction;
import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.ui.Bar;
import io.anuke.mindustry.ui.IntFormat; import io.anuke.mindustry.ui.IntFormat;
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.Vars.*;
@@ -222,16 +224,37 @@ public class HudFragment extends Fragment{
//launch button //launch button
parent.fill(t -> { parent.fill(t -> {
t.top().visible(() -> !state.is(State.menu)); t.top().visible(() -> !state.is(State.menu));
TextButton[] testb = {null};
TextButton button = Elements.newButton("$launch", () -> ui.showConfirm("$launch", "$launch.confirm", Call::launchZone)); TextButton button = Elements.newButton("$launch", () -> {
FloatingDialog dialog = new FloatingDialog("$launch");
dialog.update(() -> {
if(!testb[0].isVisible()){
dialog.hide();
}
});
dialog.cont.add("$launch.confirm").width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center);
dialog.buttons.defaults().size(200f, 54f).pad(2f);
dialog.setFillParent(false);
dialog.buttons.addButton("$cancel", dialog::hide);
dialog.buttons.addButton("$ok", () -> {
dialog.hide();
Call.launchZone();
});
dialog.keyDown(KeyCode.ESCAPE, dialog::hide);
dialog.keyDown(KeyCode.BACK, dialog::hide);
dialog.show();
});
testb[0] = button;
button.getStyle().disabledFontColor = Color.WHITE; button.getStyle().disabledFontColor = Color.WHITE;
button.visible(() -> button.visible(() ->
world.isZone() && world.isZone() &&
world.getZone().metCondition() && world.getZone().metCondition() &&
!Net.client() && !Net.client() &&
state.wave % world.getZone().launchPeriod == 0 && state.wave % world.getZone().launchPeriod == 0 && !world.spawner.isSpawning());
state.wavetime < state.rules.waveSpacing * launchWaveMultiplier - 70);
button.update(() -> { button.update(() -> {
if(world.getZone() == null){ if(world.getZone() == null){
@@ -444,6 +467,6 @@ public class HudFragment extends Fragment{
} }
}).growY().fillX().right().width(40f) }).growY().fillX().right().width(40f)
.visible(() -> state.rules.waves && ((Net.server() || players[0].isAdmin) || !Net.active()) && state.enemies() == 0 .visible(() -> state.rules.waves && ((Net.server() || players[0].isAdmin) || !Net.active()) && state.enemies() == 0
&& (state.wavetime < state.rules.waveSpacing - 60 || !state.rules.waveTimer)); && (!world.spawner.isSpawning() || !state.rules.waveTimer));
} }
} }

View File

@@ -26,6 +26,7 @@ import io.anuke.mindustry.game.UnlockableContent;
import io.anuke.mindustry.graphics.CacheLayer; import io.anuke.mindustry.graphics.CacheLayer;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.graphics.Pal;
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.*;
import io.anuke.mindustry.ui.Bar; import io.anuke.mindustry.ui.Bar;
import io.anuke.mindustry.ui.ContentDisplay; import io.anuke.mindustry.ui.ContentDisplay;
@@ -269,6 +270,7 @@ public class Block extends BlockStorage{
public float sumAttribute(Attribute attr, int x, int y){ public float sumAttribute(Attribute attr, int x, int y){
Tile tile = world.tile(x, y); Tile tile = world.tile(x, y);
if(tile == null) return 0;
float sum = 0; float sum = 0;
for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){
sum += other.floor().attributes.get(attr); sum += other.floor().attributes.get(attr);
@@ -546,6 +548,12 @@ public class Block extends BlockStorage{
return icons[icon.ordinal()]; return icons[icon.ordinal()];
} }
public void getPlaceDraw(PlaceDraw draw, int rotation, int prevX, int prevY, int prevRotation){
draw.region = icon(Icon.full);
draw.scalex = draw.scaley = 1;
draw.rotation = rotation;
}
/**Never use outside of the editor!*/ /**Never use outside of the editor!*/
public TextureRegion editorIcon(){ public TextureRegion editorIcon(){
if(editorIcon == null) editorIcon = Core.atlas.find(name + "-icon-editor"); if(editorIcon == null) editorIcon = Core.atlas.find(name + "-icon-editor");

View File

@@ -87,6 +87,14 @@ public class Tile implements Position, TargetTrait{
return -1; return -1;
} }
public static byte relativeTo(int x, int y, int cx, int cy){
if(x == cx && y == cy - 1) return 1;
if(x == cx && y == cy + 1) return 3;
if(x == cx - 1 && y == cy) return 0;
if(x == cx + 1 && y == cy) return 2;
return -1;
}
public byte absoluteRelativeTo(int cx, int cy){ public byte absoluteRelativeTo(int cx, int cy){
if(x == cx && y <= cy - 1) return 1; if(x == cx && y <= cy - 1) return 1;
if(x == cx && y >= cy + 1) return 3; if(x == cx && y >= cy + 1) return 3;
@@ -95,6 +103,14 @@ public class Tile implements Position, TargetTrait{
return -1; return -1;
} }
public static byte absoluteRelativeTo(int x, int y, int cx, int cy){
if(x == cx && y <= cy - 1) return 1;
if(x == cx && y >= cy + 1) return 3;
if(x <= cx - 1 && y == cy) return 0;
if(x >= cx + 1 && y == cy) return 2;
return -1;
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T extends TileEntity> T entity(){ public <T extends TileEntity> T entity(){
return (T) entity; return (T) entity;

View File

@@ -109,12 +109,13 @@ public class Floor extends Block{
Mathf.random.setSeed(tile.pos()); Mathf.random.setSeed(tile.pos());
Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy()); Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
drawEdges(tile);
Floor floor = tile.ore(); Floor floor = tile.ore();
if(floor != Blocks.air && floor != this){ //ore should never have itself on top, but it's possible, so prevent a crash in that case if(floor != Blocks.air && floor != this){ //ore should never have itself on top, but it's possible, so prevent a crash in that case
floor.draw(tile); floor.draw(tile);
} }
drawEdges(tile);
} }

View File

@@ -58,6 +58,7 @@ public abstract class Turret extends Block{
protected float shootShake = 0f; protected float shootShake = 0f;
protected float xRand = 0f; protected float xRand = 0f;
protected boolean targetAir = true; protected boolean targetAir = true;
protected boolean targetGround = true;
protected Vector2 tr = new Vector2(); protected Vector2 tr = new Vector2();
protected Vector2 tr2 = new Vector2(); protected Vector2 tr2 = new Vector2();
@@ -108,6 +109,7 @@ public abstract class Turret extends Block{
stats.add(BlockStat.reload, 60f / reload, StatUnit.none); stats.add(BlockStat.reload, 60f / reload, StatUnit.none);
stats.add(BlockStat.shots, shots, StatUnit.none); stats.add(BlockStat.shots, shots, StatUnit.none);
stats.add(BlockStat.targetsAir, targetAir); stats.add(BlockStat.targetsAir, targetAir);
stats.add(BlockStat.targetsGround, targetGround);
} }
@Override @Override
@@ -201,7 +203,7 @@ public abstract class Turret extends Block{
TurretEntity entity = tile.entity(); TurretEntity entity = tile.entity();
entity.target = Units.getClosestTarget(tile.getTeam(), entity.target = Units.getClosestTarget(tile.getTeam(),
tile.drawx(), tile.drawy(), range, e -> !e.isDead() && (!e.isFlying() || targetAir)); tile.drawx(), tile.drawy(), range, e -> !e.isDead() && (!e.isFlying() || targetAir) && (e.isFlying() || targetGround));
} }
protected void turnToTarget(Tile tile, float targetRot){ protected void turnToTarget(Tile tile, float targetRot){

View File

@@ -6,6 +6,7 @@ import io.anuke.arc.graphics.g2d.Draw;
import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.g2d.TextureRegion;
import io.anuke.arc.math.Mathf; import io.anuke.arc.math.Mathf;
import io.anuke.arc.math.geom.Geometry; import io.anuke.arc.math.geom.Geometry;
import io.anuke.arc.math.geom.Point2;
import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.math.geom.Vector2;
import io.anuke.arc.util.Log; import io.anuke.arc.util.Log;
import io.anuke.arc.util.Pack; import io.anuke.arc.util.Pack;
@@ -13,6 +14,7 @@ import io.anuke.arc.util.Time;
import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.entities.type.TileEntity;
import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.entities.type.Unit;
import io.anuke.mindustry.graphics.Layer; import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
import io.anuke.mindustry.type.Item; import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.Tile;
@@ -89,7 +91,6 @@ public class Conveyor extends Block{
ConveyorEntity entity = tile.entity(); ConveyorEntity entity = tile.entity();
entity.blendbits = 0; entity.blendbits = 0;
entity.blendsclx = entity.blendscly = 1; entity.blendsclx = entity.blendscly = 1;
entity.blendshadowrot = -1;
if(blends(tile, 2) && blends(tile, 1) && blends(tile, 3)){ if(blends(tile, 2) && blends(tile, 1) && blends(tile, 3)){
entity.blendbits = 3; entity.blendbits = 3;
@@ -103,13 +104,34 @@ public class Conveyor extends Block{
}else if(blends(tile, 1)){ }else if(blends(tile, 1)){
entity.blendbits = 1; entity.blendbits = 1;
entity.blendscly = -1; entity.blendscly = -1;
entity.blendshadowrot = 0;
}else if(blends(tile, 3)){ }else if(blends(tile, 3)){
entity.blendbits = 1; entity.blendbits = 1;
entity.blendshadowrot = 1;
} }
} }
@Override
public void getPlaceDraw(PlaceDraw draw, int rotation, int prevX, int prevY, int prevRotation){
draw.rotation = rotation;
draw.scalex = draw.scaley = 1;
int blendbits = 0;
if(blends(rotation, 1, prevX, prevY, prevRotation)){
blendbits = 1;
draw.scaley = -1;
}else if(blends(rotation, 3, prevX, prevY, prevRotation)){
blendbits = 1;
}
draw.rotation = rotation;
draw.region = regions[blendbits][0];
}
private boolean blends(int rotation, int offset, int prevX, int prevY, int prevRotation){
Point2 left = Geometry.d4(rotation - offset);
return left.equals(prevX, prevY) && prevRotation == Mathf.mod(rotation + offset, 4);
}
private boolean blends(Tile tile, int direction){ private boolean blends(Tile tile, int direction){
Tile other = tile.getNearby(Mathf.mod(tile.getRotation() - direction, 4)); Tile other = tile.getNearby(Mathf.mod(tile.getRotation() - direction, 4));
if(other != null) other = other.target(); if(other != null) other = other.target();
@@ -343,7 +365,6 @@ public class Conveyor extends Block{
byte lastInserted; byte lastInserted;
float minitem = 1; float minitem = 1;
int blendshadowrot = -1;
int blendbits; int blendbits;
int blendsclx, blendscly; int blendsclx, blendscly;

View File

@@ -143,6 +143,10 @@ public class PowerGraph{
} }
public void update(){ public void update(){
if(Core.graphics.getFrameId() == lastFrameUpdated){
return;
}
lastFrameUpdated = Core.graphics.getFrameId(); lastFrameUpdated = Core.graphics.getFrameId();
float powerNeeded = getPowerNeeded(); float powerNeeded = getPowerNeeded();
@@ -150,7 +154,7 @@ public class PowerGraph{
powerBalance.addValue((powerProduced - powerNeeded) / Time.delta()); powerBalance.addValue((powerProduced - powerNeeded) / Time.delta());
if(Core.graphics.getFrameId() == lastFrameUpdated || (consumers.size == 0 && producers.size == 0 && batteries.size == 0)){ if(consumers.size == 0 && producers.size == 0 && batteries.size == 0){
return; return;
} }

View File

@@ -28,7 +28,7 @@ public class ThermalGenerator extends PowerGenerator{
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid){ public void drawPlace(int x, int y, int rotation, boolean valid){
drawPlaceText(Core.bundle.format("blocks.efficiency", sumAttribute(Attribute.heat, x, y)*100, 1), x, y, valid); drawPlaceText(Core.bundle.formatDouble("blocks.efficiency", sumAttribute(Attribute.heat, x, y)*100, 1), x, y, valid);
} }
@Override @Override

View File

@@ -53,7 +53,7 @@ public class Cultivator extends GenericCrafter{
public void setBars(){ public void setBars(){
super.setBars(); super.setBars();
bars.add("multiplier", entity -> new Bar(() -> bars.add("multiplier", entity -> new Bar(() ->
Core.bundle.format("blocks.efficiency", Core.bundle.formatDouble("blocks.efficiency",
((((CultivatorEntity)entity).boost + 1f) * ((CultivatorEntity)entity).warmup)*100f,1), ((((CultivatorEntity)entity).boost + 1f) * ((CultivatorEntity)entity).warmup)*100f,1),
() -> Pal.ammo, () -> Pal.ammo,
() -> ((CultivatorEntity)entity).warmup)); () -> ((CultivatorEntity)entity).warmup));
@@ -61,7 +61,7 @@ public class Cultivator extends GenericCrafter{
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid){ public void drawPlace(int x, int y, int rotation, boolean valid){
drawPlaceText(Core.bundle.format("blocks.efficiency", (1+sumAttribute(Attribute.spores, x, y))*100, 1), x, y, valid); drawPlaceText(Core.bundle.formatDouble("blocks.efficiency", (1+sumAttribute(Attribute.spores, x, y))*100, 1), x, y, valid);
} }
@Override @Override

View File

@@ -42,7 +42,7 @@ public class SolidPump extends Pump{
@Override @Override
public void drawPlace(int x, int y, int rotation, boolean valid){ public void drawPlace(int x, int y, int rotation, boolean valid){
if(attribute != null){ if(attribute != null){
drawPlaceText(Core.bundle.format("blocks.efficiency", (sumAttribute(attribute, x, y) + 1f)*100, 1), x, y, valid); drawPlaceText(Core.bundle.formatDouble("blocks.efficiency", (sumAttribute(attribute, x, y) + 1f)*100, 1), x, y, valid);
} }
} }
@@ -50,7 +50,7 @@ public class SolidPump extends Pump{
public void setBars(){ public void setBars(){
super.setBars(); super.setBars();
bars.add("efficiency", entity -> new Bar(() -> bars.add("efficiency", entity -> new Bar(() ->
Core.bundle.format("blocks.efficiency", Core.bundle.formatDouble("blocks.efficiency",
((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100, 1), ((((SolidPumpEntity)entity).boost + 1f) * ((SolidPumpEntity)entity).warmup) * 100, 1),
() -> Pal.ammo, () -> Pal.ammo,
() -> ((SolidPumpEntity)entity).warmup)); () -> ((SolidPumpEntity)entity).warmup));

View File

@@ -47,6 +47,7 @@ public enum BlockStat{
reload(StatCategory.shooting), reload(StatCategory.shooting),
powerShot(StatCategory.shooting), powerShot(StatCategory.shooting),
targetsAir(StatCategory.shooting), targetsAir(StatCategory.shooting),
targetsGround(StatCategory.shooting),
boostItem(StatCategory.optional), boostItem(StatCategory.optional),
boostLiquid(StatCategory.optional),; boostLiquid(StatCategory.optional),;

View File

@@ -3,11 +3,11 @@ package io.anuke.mindustry.desktop;
import io.anuke.arc.ApplicationListener; import io.anuke.arc.ApplicationListener;
import io.anuke.arc.backends.lwjgl3.Lwjgl3Application; import io.anuke.arc.backends.lwjgl3.Lwjgl3Application;
import io.anuke.arc.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import io.anuke.arc.backends.lwjgl3.Lwjgl3ApplicationConfiguration;
import io.anuke.net.KryoClient;
import io.anuke.net.KryoServer;
import io.anuke.mindustry.Mindustry; import io.anuke.mindustry.Mindustry;
import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.net.KryoClient;
import io.anuke.net.KryoServer;
public class DesktopLauncher extends Lwjgl3Application{ public class DesktopLauncher extends Lwjgl3Application{