Merge remote-tracking branch 'upstream/master'
# Conflicts: # core/assets/bundles/bundle_ja.properties
BIN
core/assets-raw/sprites/blocks/environment/snowrock1.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
core/assets-raw/sprites/blocks/environment/snowrock2.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
core/assets-raw/sprites/blocks/environment/sporerocks-large.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
core/assets-raw/sprites/blocks/environment/sporerocks1.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
core/assets-raw/sprites/blocks/environment/sporerocks2.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
@@ -203,6 +203,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Name:
|
||||
@@ -250,14 +256,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
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
|
||||
@@ -289,7 +299,7 @@ uncover = Uncover
|
||||
configure = Configure Loadout
|
||||
configure.locked = [LIGHT_GRAY]Unlock configuring loadout:\nWave {0}.
|
||||
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.resources = Resources Detected:
|
||||
add = Add...
|
||||
@@ -340,6 +350,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Power Capacity
|
||||
blocks.powershot = Power/Shot
|
||||
blocks.targetsair = Targets Air
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Range
|
||||
@@ -409,6 +420,7 @@ setting.autotarget.name = Auto-Target
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = None
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = training
|
||||
setting.difficulty.easy = easy
|
||||
setting.difficulty.normal = normal
|
||||
@@ -445,6 +457,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = Move x
|
||||
keybind.move_y.name = Move y
|
||||
keybind.select.name = Select/Shoot
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deselect
|
||||
@@ -563,6 +576,9 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
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-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
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.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í:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Šířka:
|
||||
height = Výška:
|
||||
menu = Hlavní menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Kapacita energie
|
||||
blocks.powershot = Energie na výstřel
|
||||
blocks.targetsair = Zaměřuje vzdušné jednotky
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Dostřel
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Automaticky zaměřuje
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = žádný
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = Trénink
|
||||
setting.difficulty.easy = lehká
|
||||
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_y.name = Pohyb na Y
|
||||
keybind.select.name = Vybrat/Střílet
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Odznačit
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Name:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Karten Name
|
||||
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.selectmap = Wähle eine Karte zum Laden:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Breite:
|
||||
height = Höhe:
|
||||
menu = Menü
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Kapazität
|
||||
blocks.powershot = Stromverbrauch/Schuss
|
||||
blocks.targetsair = Visiert Luft Einheiten an
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Reichweite
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Zielauswahl
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = kein
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = Training
|
||||
setting.difficulty.easy = Leicht
|
||||
setting.difficulty.normal = Normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = X-Achse
|
||||
keybind.move_y.name = Y-Achse
|
||||
keybind.select.name = Auswählen/Schießen
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Auswahl aufheben
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Nombre:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Nombre del Mapa:
|
||||
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.selectmap = Selecciona un mapa para cargar:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Ancho:
|
||||
height = Alto:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Capacidad de Energía
|
||||
blocks.powershot = Energía/Disparo
|
||||
blocks.targetsair = Apunta al Aire
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Rango
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto apuntado
|
||||
setting.fpscap.name = Máx FPS
|
||||
setting.fpscap.none = Nada
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = entrenamiento
|
||||
setting.difficulty.easy = fácil
|
||||
setting.difficulty.normal = normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = Mover x
|
||||
keybind.move_y.name = Mover y
|
||||
keybind.select.name = Seleccionar
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deseleccionar
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
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.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:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Largeur:
|
||||
height = Hauteur:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = capacité d'énergie
|
||||
blocks.powershot = Énergie/Tir
|
||||
blocks.targetsair = Cible les unités aériennes
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Portée
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Visée automatique
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = None
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = entraînement
|
||||
setting.difficulty.easy = facile
|
||||
setting.difficulty.normal = normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = mouvement x
|
||||
keybind.move_y.name = mouvement y
|
||||
keybind.select.name = sélectionner
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Déselectionner
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Nom:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Nom de la carte:
|
||||
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.selectmap = Sélectionnez une carte à charger:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Largeur:
|
||||
height = Hauteur:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Capacité d'énergie
|
||||
blocks.powershot = Énergie/Tir
|
||||
blocks.targetsair = Cible les unités aériennes
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Portée
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Visée automatique
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = Vide
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = Entraînement
|
||||
setting.difficulty.easy = Facile
|
||||
setting.difficulty.normal = Normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = Mouvement X
|
||||
keybind.move_y.name = Mouvement Y
|
||||
keybind.select.name = Sélectionner/Tirer
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Déselectionner
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Name:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Nama Peta:
|
||||
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.selectmap = Pilih peta yang akan dimuat:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Lebar:
|
||||
height = Tinggi:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Kapasitas Tenaga
|
||||
blocks.powershot = Tenaga/tembakan
|
||||
blocks.targetsair = Targets Air
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Range
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = None
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = training
|
||||
setting.difficulty.easy = mudah
|
||||
setting.difficulty.normal = normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = gerak_x
|
||||
keybind.move_y.name = gerak_y
|
||||
keybind.select.name = pilih
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deselect
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Nome:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Nome Mappa:
|
||||
editor.overwrite = [Accent]Attenzione!\nQuesto sovrascrive una mappa esistente.
|
||||
editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
|
||||
editor.selectmap = Seleziona una mappa da caricare:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Larghezza:
|
||||
height = Altezza:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Capacità Energetica
|
||||
blocks.powershot = Danno/Colpo
|
||||
blocks.targetsair = Attacca nemici aerei
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Raggio
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
|
||||
setting.fpscap.name = Limite FPS
|
||||
setting.fpscap.none = Niente
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = training
|
||||
setting.difficulty.easy = facile
|
||||
setting.difficulty.normal = medio
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = Sposta_x
|
||||
keybind.move_y.name = Sposta_y
|
||||
keybind.select.name = seleziona
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deselect
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -194,17 +194,23 @@ editor.oregen.info = 鉱石の生成:
|
||||
editor.mapinfo = マップ情報
|
||||
editor.author = 作者:
|
||||
editor.description = 説明:
|
||||
editor.waves = ウェーブ:
|
||||
waves.title = ウェーブ
|
||||
waves.remove = 削除
|
||||
waves.never = <永久>
|
||||
waves.every =
|
||||
waves.waves = ウェーブごとに出現
|
||||
waves.perspawn = スポーン
|
||||
waves.to = から
|
||||
waves.boss = ボス
|
||||
editor.default = [LIGHT_GRAY]<デフォルト>
|
||||
edit = 編集...
|
||||
editor.waves = Waves:
|
||||
waves.title = Waves
|
||||
waves.remove = Remove
|
||||
waves.never = <never>
|
||||
waves.every = every
|
||||
waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = 名前:
|
||||
editor.teams = チーム
|
||||
editor.elevation = 標高
|
||||
@@ -242,22 +248,26 @@ editor.mapname = マップ名:
|
||||
editor.overwrite = [accent]警告!\n存在するマップを上書きします。
|
||||
editor.overwrite.confirm = [scarlet]警告![] この名前のマップがすでに存在します。上書きしてもよろしいですか?
|
||||
editor.selectmap = 読み込むマップを選択:
|
||||
filters.empty = [LIGHT_GRAY]フィルターが設定されていません!下のボタンからフィルターを追加してください。
|
||||
filter.distort = ゆがみ
|
||||
filter.noise = ノイズ
|
||||
filter.ore = 鉱石
|
||||
filter.rivernoise = リバーノイズ
|
||||
filter.scatter = 分散
|
||||
filter.terrain = 地形
|
||||
filter.option.scale = スケール
|
||||
filter.option.mag = マグニチュード
|
||||
filter.option.threshold = スレッシュホールド
|
||||
filter.option.circle-scale = サークルスケール
|
||||
filter.option.octaves = オクターブ
|
||||
filter.option.falloff = フォールオフ
|
||||
filter.option.floor = 地面
|
||||
filter.option.wall = 壁
|
||||
filter.option.ore = 鉱石
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = 幅:
|
||||
height = 高さ:
|
||||
menu = メニュー
|
||||
@@ -336,8 +346,9 @@ blocks.poweroutput = 電力発電量: {0}
|
||||
blocks.powercapacity = 電力容量
|
||||
blocks.powershot = 電力/ショット
|
||||
blocks.targetsair = 対空攻撃
|
||||
blocks.items = アイテム: {0}
|
||||
blocks.itemsmoved = 輸送速度
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = 範囲
|
||||
blocks.size = 大きさ
|
||||
blocks.liquidcapacity = 液体容量
|
||||
@@ -405,6 +416,7 @@ setting.autotarget.name = 自動ターゲット
|
||||
setting.fpscap.name = 最大FPS
|
||||
setting.fpscap.none = なし
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = トレーニング
|
||||
setting.difficulty.easy = イージー
|
||||
setting.difficulty.normal = ノーマル
|
||||
@@ -441,8 +453,9 @@ keybind.screenshot.name = スクリーンショット
|
||||
keybind.move_x.name = 左右移動
|
||||
keybind.move_y.name = 上下移動
|
||||
keybind.select.name = 選択/ショット
|
||||
keybind.pick.name = ブロックを選ぶ
|
||||
keybind.break_block.name = ブロックを破壊
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = 選択解除
|
||||
keybind.shoot.name = ショット
|
||||
keybind.zoom_hold.name = ズーム長押し
|
||||
@@ -554,24 +567,26 @@ mech.ability = [LIGHT_GRAY]能力: {0}
|
||||
liquid.heatcapacity = [LIGHT_GRAY]熱容量: {0}
|
||||
liquid.viscosity = [LIGHT_GRAY]粘度: {0}
|
||||
liquid.temperature = [LIGHT_GRAY]温度: {0}
|
||||
block.grass.name = 草
|
||||
block.salt.name = 岩塩氷河
|
||||
block.sandrocks.name = 砂岩
|
||||
block.spore-pine.name = 胞子の松の木
|
||||
block.shale.name = 泥板岩
|
||||
block.shale-boulder.name = 泥板岩の丸石
|
||||
block.moss.name = コケ
|
||||
block.spore-moss.name = 胞子のコケ
|
||||
block.shalerocks.name = 泥板岩の岩
|
||||
block.scrap-wall.name = スクラップの壁
|
||||
block.scrap-wall-large.name = 大きなスクラップの壁
|
||||
block.scrap-wall-huge.name = とても大きなスクラップの壁
|
||||
block.scrap-wall-gigantic.name = 巨大なスクラップの壁
|
||||
block.thruster.name = スラスター
|
||||
block.kiln.name = かまど
|
||||
block.kiln.description = 砂と鉛を溶かしてメタガラスを生成します。少量の電力が必要です。
|
||||
block.graphite-press.name = 黒鉛圧縮機
|
||||
block.multi-press.name = 複合圧縮機
|
||||
block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
block.spore-moss.name = Spore Moss
|
||||
block.shalerocks.name = Shale Rocks
|
||||
block.scrap-wall.name = Scrap Wall
|
||||
block.scrap-wall-large.name = Large Scrap Wall
|
||||
block.scrap-wall-huge.name = Huge Scrap Wall
|
||||
block.scrap-wall-gigantic.name = Gigantic Scrap Wall
|
||||
block.thruster.name = Thruster
|
||||
block.kiln.name = Kiln
|
||||
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.spawn.name = 敵のスポーン
|
||||
block.core-shard.name = コア: シャード
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = 이름:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = 맵 이름:
|
||||
editor.overwrite = [accept]경고!이 명령은 기존 맵을 덮어씌우게 됩니다.
|
||||
editor.overwrite.confirm = [scarlet]경고![] 이 이름을 가진 맵이 이미 있습니다. 덮어 쓰시겠습니까?
|
||||
editor.selectmap = 불러올 맵 선택:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = 넓이:
|
||||
height = 높이:
|
||||
menu = 메뉴
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = 전력 출력: {0}
|
||||
blocks.powercapacity = 전력 용량
|
||||
blocks.powershot = 1발당 전력 소모량
|
||||
blocks.targetsair = 공중공격 가능
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = 이동 속도
|
||||
blocks.shootrange = 사거리
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = 자동 조준
|
||||
setting.fpscap.name = 최대 FPS
|
||||
setting.fpscap.none = 없음
|
||||
setting.fpscap.text = FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = 훈련
|
||||
setting.difficulty.easy = 쉬움
|
||||
setting.difficulty.normal = 보통
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = 맵 스크린샷
|
||||
keybind.move_x.name = 오른쪽/왼쪽 이동
|
||||
keybind.move_y.name = 위 / 아래 중간
|
||||
keybind.select.name = 선택
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = 블록 선택
|
||||
keybind.break_block.name = 블록 파괴
|
||||
keybind.deselect.name = 선택해제
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Name:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Map Name:
|
||||
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.selectmap = Select a map to load:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
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
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Power Capacity
|
||||
blocks.powershot = Power/Shot
|
||||
blocks.targetsair = Targets Air
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Range
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = None
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = training
|
||||
setting.difficulty.easy = easy
|
||||
setting.difficulty.normal = normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = Move x
|
||||
keybind.move_y.name = Move y
|
||||
keybind.select.name = Select/Shoot
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deselect
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Nazwa:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Nazwa 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.selectmap = Wybierz mapę do załadowania:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Szerokość:
|
||||
height = Wysokość:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Pojemność mocy
|
||||
blocks.powershot = moc/strzał
|
||||
blocks.targetsair = Może namierzać wrogów powietrznych
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Zasięg
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Automatyczne Celowanie
|
||||
setting.fpscap.name = Maksymalny FPS
|
||||
setting.fpscap.none = Nieograniczone
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = trening
|
||||
setting.difficulty.easy = łatwy
|
||||
setting.difficulty.normal = normalny
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Zrzut ekranu mapy
|
||||
keybind.move_x.name = Poruszanie w poziomie
|
||||
keybind.move_y.name = Poruszanie w pionie
|
||||
keybind.select.name = Zaznacz
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Wybierz Blok
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Odznacz
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Nome:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Nome do Mapa:
|
||||
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.selectmap = Selecione uma mapa para carregar:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Largura:
|
||||
height = Altura:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Capacidade de Energia
|
||||
blocks.powershot = Energia/tiro
|
||||
blocks.targetsair = Mirar no ar
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Alcance
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Alvo automatico
|
||||
setting.fpscap.name = FPS Maximo
|
||||
setting.fpscap.none = Nenhum
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = treinamento
|
||||
setting.difficulty.easy = Fácil
|
||||
setting.difficulty.normal = Normal
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = mover_x
|
||||
keybind.move_y.name = mover_y
|
||||
keybind.select.name = selecionar
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deselecionar
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Название:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Название карты:
|
||||
editor.overwrite = [accent]Внимание! \nЭто перезапишет уже существующую карту.
|
||||
editor.overwrite.confirm = [scarlet]Осторожно![] Карта с таким названием уже существует. Вы действительно хотите её перезаписать?
|
||||
editor.selectmap = Выберите карту для загрузки:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Ширина:
|
||||
height = Высота:
|
||||
menu = Меню
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Выходная энергия: {0}
|
||||
blocks.powercapacity = Вместимость энергии
|
||||
blocks.powershot = Энергия/выстрел
|
||||
blocks.targetsair = Атакует воздуш. юнитов
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Скорость перемещения
|
||||
blocks.shootrange = Радиус действия
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Авто-цель
|
||||
setting.fpscap.name = Макс. FPS
|
||||
setting.fpscap.none = Неограниченный
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = обучение
|
||||
setting.difficulty.easy = легко
|
||||
setting.difficulty.normal = нормально
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Скриншот карты
|
||||
keybind.move_x.name = Движение по оси x
|
||||
keybind.move_y.name = Движение по оси y
|
||||
keybind.select.name = Выбор/Выстрел
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Выбрать блок
|
||||
keybind.break_block.name = Разрушить блок
|
||||
keybind.deselect.name = Отмена
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = isim:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Harita ismi:
|
||||
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.selectmap = Yukleyecek bir harita sec:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Genislik:
|
||||
height = Yukseklik:
|
||||
menu = Menu
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Guc kapasitesi
|
||||
blocks.powershot = Guc/Saldiri hizi
|
||||
blocks.targetsair = Havayi hedef alir mi?
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Menzil
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = Yok
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = training
|
||||
setting.difficulty.easy = kolay
|
||||
setting.difficulty.normal = orta
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = Sol/Sag hareket
|
||||
keybind.move_y.name = Yukari/asagi hareket
|
||||
keybind.select.name = Sec/silahi sik
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Eldeki yapiyi birak
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Name:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Harita Adı
|
||||
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.selectmap = Yüklenecek bir harita seçin:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Genişliği:
|
||||
height = Boy:
|
||||
menu = Menü
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = Güç kapasitesi
|
||||
blocks.powershot = Güç / atış
|
||||
blocks.targetsair = Targets Air
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = Range
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Auto-Target
|
||||
setting.fpscap.name = Max FPS
|
||||
setting.fpscap.none = None
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = training
|
||||
setting.difficulty.easy = kolay
|
||||
setting.difficulty.normal = orta
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Map Screenshot
|
||||
keybind.move_x.name = sağ / sol
|
||||
keybind.move_y.name = yukarı / aşağı
|
||||
keybind.select.name = seçmek
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = Deselect
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = Назва:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = Название карты:
|
||||
editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу карту.
|
||||
editor.overwrite.confirm = [scarlet]Попередження![] Карта з такою назвою вже існує. Ви впевнені, що хочете переписати її?
|
||||
editor.selectmap = Виберіть мапу для завантаження:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = Ширина:
|
||||
height = Висота:
|
||||
menu = Меню
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Вихідна енергія: {0}
|
||||
blocks.powercapacity = Місткість енергії
|
||||
blocks.powershot = Енергія/постріл
|
||||
blocks.targetsair = Атакуе повітряних ворогів
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Швидкість переміщення
|
||||
blocks.shootrange = Діапазон дії
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = Авто-ціль
|
||||
setting.fpscap.name = Макс. FPS
|
||||
setting.fpscap.none = Необмежений
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = навчання
|
||||
setting.difficulty.easy = легка
|
||||
setting.difficulty.normal = нормальна
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = Скріншот мапи
|
||||
keybind.move_x.name = Рух по осі x
|
||||
keybind.move_y.name = Рух по осі x
|
||||
keybind.select.name = Вибір/Постріл
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Вибрати блок
|
||||
keybind.break_block.name = Зламати блок
|
||||
keybind.deselect.name = Скасувати
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = 名字:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = 地图名字:
|
||||
editor.overwrite = [accent]警告!\n这将会覆盖一个已经存在的地图。
|
||||
editor.overwrite.confirm = [scarlet]警告![] 存在同名地图,确定要覆盖?
|
||||
editor.selectmap = 选择一个地图加载:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = 宽度:
|
||||
height = 高度:
|
||||
menu = 菜单
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = 能量容量
|
||||
blocks.powershot = 能量/发射
|
||||
blocks.targetsair = 攻击空中单位
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = 移动速度
|
||||
blocks.shootrange = 范围
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = 自动发射
|
||||
setting.fpscap.name = 最高 FPS
|
||||
setting.fpscap.none = 无
|
||||
setting.fpscap.text = {0} FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = 训练
|
||||
setting.difficulty.easy = 简单
|
||||
setting.difficulty.normal = 普通
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = 地图截图
|
||||
keybind.move_x.name = 水平移动
|
||||
keybind.move_y.name = 垂直移动
|
||||
keybind.select.name = 选择
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = 选择方块
|
||||
keybind.break_block.name = 破坏方块
|
||||
keybind.deselect.name = 取消
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
@@ -201,6 +201,12 @@ waves.waves = wave(s)
|
||||
waves.perspawn = per spawn
|
||||
waves.to = to
|
||||
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>
|
||||
edit = Edit...
|
||||
editor.name = 名稱:
|
||||
@@ -240,6 +246,7 @@ editor.mapname = 地圖名稱:
|
||||
editor.overwrite = [accent]警告!這將會覆蓋現有的地圖。
|
||||
editor.overwrite.confirm = [scarlet]警告![]同名地圖存在,確定要覆蓋現有地圖?
|
||||
editor.selectmap = 選取要載入的地圖:
|
||||
filters.empty = [LIGHT_GRAY]No filters! Add one with the button below.
|
||||
filter.distort = Distort
|
||||
filter.noise = Noise
|
||||
filter.ore = Ore
|
||||
@@ -247,14 +254,18 @@ filter.rivernoise = River Noise
|
||||
filter.scatter = Scatter
|
||||
filter.terrain = Terrain
|
||||
filter.option.scale = Scale
|
||||
filter.option.chance = Chance
|
||||
filter.option.mag = Magnitude
|
||||
filter.option.threshold = Threshold
|
||||
filter.option.circle-scale = Circle Scale
|
||||
filter.option.octaves = Octaves
|
||||
filter.option.falloff = Falloff
|
||||
filter.option.block = Block
|
||||
filter.option.floor = Floor
|
||||
filter.option.wall = Wall
|
||||
filter.option.ore = Ore
|
||||
filter.option.floor2 = Secondary Floor
|
||||
filter.option.threshold2 = Secondary Threshold
|
||||
width = 寬度:
|
||||
height = 長度:
|
||||
menu = 主選單
|
||||
@@ -333,6 +344,7 @@ blocks.poweroutput = Power Output: {0}
|
||||
blocks.powercapacity = 蓄電量
|
||||
blocks.powershot = 能量/射擊
|
||||
blocks.targetsair = 攻擊空中目標
|
||||
blocks.targetsground = Targets Ground
|
||||
blocks.items = Items: {0}
|
||||
blocks.itemsmoved = Move Speed
|
||||
blocks.shootrange = 範圍
|
||||
@@ -402,6 +414,7 @@ setting.autotarget.name = 自動射擊
|
||||
setting.fpscap.name = 最大FPS
|
||||
setting.fpscap.none = 没有
|
||||
setting.fpscap.text = {0}FPS
|
||||
setting.swapdiagonal.name = Always Diagonal Placement
|
||||
setting.difficulty.training = 訓練
|
||||
setting.difficulty.easy = 簡單
|
||||
setting.difficulty.normal = 普通
|
||||
@@ -438,6 +451,7 @@ keybind.screenshot.name = 地圖截圖
|
||||
keybind.move_x.name = 水平移動
|
||||
keybind.move_y.name = 垂直移動
|
||||
keybind.select.name = 選取
|
||||
keybind.diagonal_placement.name = Diagonal Placement
|
||||
keybind.pick.name = Pick Block
|
||||
keybind.break_block.name = Break Block
|
||||
keybind.deselect.name = 取消選取
|
||||
@@ -555,6 +569,8 @@ block.grass.name = Grass
|
||||
block.salt.name = Salt
|
||||
block.sandrocks.name = Sand Rocks
|
||||
block.spore-pine.name = Spore Pine
|
||||
block.sporerocks.name = Spore Rocks
|
||||
block.rock.name = Rock
|
||||
block.shale.name = Shale
|
||||
block.shale-boulder.name = Shale Boulder
|
||||
block.moss.name = Moss
|
||||
|
||||
|
Before Width: | Height: | Size: 500 B After Width: | Height: | Size: 501 B |
|
Before Width: | Height: | Size: 1.0 MiB After Width: | Height: | Size: 1.1 MiB |
|
Before Width: | Height: | Size: 238 KiB After Width: | Height: | Size: 239 KiB |
|
Before Width: | Height: | Size: 192 KiB After Width: | Height: | Size: 209 KiB |
@@ -66,6 +66,8 @@ public class Vars{
|
||||
public static final float finalWorldBounds = worldBounds + 500;
|
||||
/**ticks spent out of bound until self destruct.*/
|
||||
public static final float boundsCountdown = 60*7;
|
||||
/**for map generator dialog*/
|
||||
public static boolean updateEditorOnChange = false;
|
||||
/**size of tiles in units*/
|
||||
public static final int tilesize = 8;
|
||||
/**all choosable player colors in join/host dialog*/
|
||||
|
||||
@@ -27,6 +27,7 @@ public class WaveSpawner{
|
||||
private Array<FlyerSpawn> flySpawns = new Array<>();
|
||||
private Array<GroundSpawn> groundSpawns = new Array<>();
|
||||
private IntArray loadedSpawns = new IntArray();
|
||||
private boolean spawning = false;
|
||||
|
||||
public WaveSpawner(){
|
||||
Events.on(WorldLoadEvent.class, e -> reset());
|
||||
@@ -57,6 +58,7 @@ public class WaveSpawner{
|
||||
}
|
||||
|
||||
public void spawnEnemies(){
|
||||
spawning = true;
|
||||
|
||||
for(SpawnGroup group : state.rules.spawns){
|
||||
int spawned = group.getUnitsSpawned(state.wave);
|
||||
@@ -90,7 +92,7 @@ public class WaveSpawner{
|
||||
BaseUnit unit = group.createUnit(waveTeam);
|
||||
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));
|
||||
//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(){
|
||||
|
||||
@@ -36,9 +36,9 @@ public class Blocks implements ContentList{
|
||||
|
||||
//environment
|
||||
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,
|
||||
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks,
|
||||
metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, rock, snowrock,
|
||||
|
||||
//ores
|
||||
oreCopper, oreLead, oreScrap, oreCoal, oreTitanium, oreThorium,
|
||||
@@ -189,11 +189,6 @@ public class Blocks implements ContentList{
|
||||
variants = 0;
|
||||
}};
|
||||
|
||||
iceSnow = new Floor("ice-snow"){{
|
||||
variants = 3;
|
||||
attributes.set(Attribute.water, 0.3f);
|
||||
}};
|
||||
|
||||
snow = new Floor("snow"){{
|
||||
attributes.set(Attribute.water, 0.2f);
|
||||
}};
|
||||
@@ -205,6 +200,12 @@ public class Blocks implements ContentList{
|
||||
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"){{
|
||||
variants = 1;
|
||||
fillsTile = false;
|
||||
@@ -214,6 +215,18 @@ public class Blocks implements ContentList{
|
||||
variants = 2;
|
||||
}};
|
||||
|
||||
sporerocks = new StaticWall("sporerocks"){{
|
||||
variants = 2;
|
||||
}};
|
||||
|
||||
rock = new Rock("rock"){{
|
||||
variants = 2;
|
||||
}};
|
||||
|
||||
snowrock = new Rock("snowrock"){{
|
||||
variants = 2;
|
||||
}};
|
||||
|
||||
icerocks = new StaticWall("icerocks"){{
|
||||
variants = 2;
|
||||
}};
|
||||
@@ -269,6 +282,7 @@ public class Blocks implements ContentList{
|
||||
sporeMoss = new Floor("spore-moss"){{
|
||||
variants = 3;
|
||||
attributes.set(Attribute.spores, 0.3f);
|
||||
edgeStyle = "blocky";
|
||||
}};
|
||||
|
||||
metalFloor = new Floor("metal-floor"){{
|
||||
@@ -694,7 +708,7 @@ public class Blocks implements ContentList{
|
||||
}};
|
||||
|
||||
junction = new Junction("junction"){{
|
||||
requirements(Category.distribution, ItemStack.with(Items.copper, 3));
|
||||
requirements(Category.distribution, ItemStack.with(Items.copper, 3), true);
|
||||
speed = 26;
|
||||
capacity = 32;
|
||||
health = 25;
|
||||
@@ -1061,29 +1075,30 @@ public class Blocks implements ContentList{
|
||||
range = 95f;
|
||||
shootCone = 15f;
|
||||
ammoUseEffect = Fx.shellEjectSmall;
|
||||
health = 210;
|
||||
health = 250;
|
||||
inaccuracy = 2f;
|
||||
rotatespeed = 10f;
|
||||
}};
|
||||
|
||||
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(
|
||||
Items.scrap, Bullets.flakScrap,
|
||||
Items.lead, Bullets.flakLead
|
||||
);
|
||||
reload = 45f;
|
||||
reload = 43f;
|
||||
range = 160f;
|
||||
size = 2;
|
||||
burstSpacing = 5f;
|
||||
shots = 2;
|
||||
targetGround = false;
|
||||
|
||||
recoil = 2f;
|
||||
rotatespeed = 10f;
|
||||
inaccuracy = 18f;
|
||||
inaccuracy = 17f;
|
||||
shootCone = 35f;
|
||||
|
||||
health = 220*size*size;
|
||||
health = 260*size*size;
|
||||
}};
|
||||
|
||||
hail = new ArtilleryTurret("hail"){{
|
||||
@@ -1098,7 +1113,7 @@ public class Blocks implements ContentList{
|
||||
range = 230f;
|
||||
inaccuracy = 1f;
|
||||
shootCone = 10f;
|
||||
health = 120;
|
||||
health = 260;
|
||||
}};
|
||||
|
||||
wave = new LiquidTurret("wave"){{
|
||||
@@ -1116,7 +1131,7 @@ public class Blocks implements ContentList{
|
||||
shootCone = 50f;
|
||||
shootEffect = Fx.shootLiquid;
|
||||
range = 100f;
|
||||
health = 360;
|
||||
health = 250*size*size;
|
||||
|
||||
drawer = (tile, entity) -> {
|
||||
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;
|
||||
heatColor = Color.RED;
|
||||
size = 2;
|
||||
health = 320;
|
||||
health = 280*size*size;
|
||||
targetAir = false;
|
||||
}};
|
||||
|
||||
@@ -1165,6 +1180,7 @@ public class Blocks implements ContentList{
|
||||
heatColor = Color.RED;
|
||||
recoil = 1f;
|
||||
size = 1;
|
||||
health = 260;
|
||||
}};
|
||||
|
||||
swarmer = new BurstTurret("swarmer"){{
|
||||
@@ -1181,7 +1197,7 @@ public class Blocks implements ContentList{
|
||||
range = 140f;
|
||||
xRand = 6f;
|
||||
size = 2;
|
||||
health = 380;
|
||||
health = 300*size*size;
|
||||
}};
|
||||
|
||||
salvo = new BurstTurret("salvo"){{
|
||||
|
||||
@@ -36,7 +36,7 @@ public class Mechs implements ContentList{
|
||||
speed = 0.5f;
|
||||
boostSpeed = 0.85f;
|
||||
engineColor = Color.valueOf("ffd37f");
|
||||
health = 250f;
|
||||
health = 300f;
|
||||
|
||||
weapon = new Weapon("blaster"){{
|
||||
length = 1.5f;
|
||||
@@ -62,7 +62,7 @@ public class Mechs implements ContentList{
|
||||
boostSpeed = 0.95f;
|
||||
itemCapacity = 15;
|
||||
mass = 0.9f;
|
||||
health = 220f;
|
||||
health = 250f;
|
||||
weaponOffsetX = -1;
|
||||
weaponOffsetY = -1;
|
||||
engineColor = Color.valueOf("d3ddff");
|
||||
|
||||
@@ -43,20 +43,22 @@ public class TechTree implements ContentList{
|
||||
});
|
||||
|
||||
node(duo, () -> {
|
||||
node(hail, () -> {
|
||||
node(scatter, () -> {
|
||||
node(hail, () -> {
|
||||
|
||||
node(salvo, () -> {
|
||||
node(swarmer, () -> {
|
||||
node(cyclone, () -> {
|
||||
node(spectre, () -> {
|
||||
node(salvo, () -> {
|
||||
node(swarmer, () -> {
|
||||
node(cyclone, () -> {
|
||||
node(spectre, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
node(ripple, () -> {
|
||||
node(fuse, () -> {
|
||||
node(ripple, () -> {
|
||||
node(fuse, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -257,7 +259,7 @@ public class TechTree implements ContentList{
|
||||
private TechNode node(Block block, Runnable children){
|
||||
ItemStack[] requirements = new ItemStack[block.buildRequirements.length];
|
||||
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);
|
||||
|
||||
@@ -16,13 +16,13 @@ public class Zones implements ContentList{
|
||||
@Override
|
||||
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);
|
||||
startingItems = ItemStack.list(Items.copper, 100);
|
||||
alwaysUnlocked = true;
|
||||
conditionWave = 5;
|
||||
launchPeriod = 5;
|
||||
resources = new Item[]{Items.copper, Items.scrap};
|
||||
resources = new Item[]{Items.copper, Items.scrap, Items.lead};
|
||||
rules = () -> new Rules(){{
|
||||
waves = 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);
|
||||
conditionWave = 10;
|
||||
itemRequirements = ItemStack.with(Items.copper, 2000);
|
||||
|
||||
@@ -212,7 +212,7 @@ public class MapEditor{
|
||||
|
||||
if(tile.block().isMultiblock()){
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,12 @@ import io.anuke.arc.function.Supplier;
|
||||
import io.anuke.arc.graphics.Pixmap;
|
||||
import io.anuke.arc.graphics.Pixmap.Format;
|
||||
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.util.Scaling;
|
||||
import io.anuke.arc.util.async.AsyncExecutor;
|
||||
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.GenerateFilter.GenerateInput;
|
||||
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.blocks.Floor;
|
||||
|
||||
import static io.anuke.mindustry.Vars.mobile;
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class MapGenerateDialog extends FloatingDialog{
|
||||
@@ -48,8 +50,10 @@ public class MapGenerateDialog extends FloatingDialog{
|
||||
shown(this::setup);
|
||||
addCloseButton();
|
||||
buttons.addButton("$editor.apply", () -> {
|
||||
apply();
|
||||
hide();
|
||||
ui.loadAnd(() -> {
|
||||
apply();
|
||||
hide();
|
||||
});
|
||||
}).size(160f, 64f);
|
||||
buttons.addButton("$editor.randomize", () -> {
|
||||
for(GenerateFilter filter : filters){
|
||||
@@ -75,15 +79,20 @@ public class MapGenerateDialog extends FloatingDialog{
|
||||
cont.clear();
|
||||
cont.table("flat", t -> {
|
||||
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);
|
||||
}).grow();
|
||||
|
||||
update();
|
||||
|
||||
buffer1 = create();
|
||||
buffer2 = create();
|
||||
|
||||
update();
|
||||
rebuildFilters();
|
||||
}
|
||||
|
||||
@@ -186,6 +195,16 @@ public class MapGenerateDialog extends FloatingDialog{
|
||||
result.get();
|
||||
}
|
||||
|
||||
buffer1 = null;
|
||||
buffer2 = null;
|
||||
generating = false;
|
||||
if(pixmap != null){
|
||||
pixmap.dispose();
|
||||
texture.dispose();
|
||||
pixmap = null;
|
||||
texture = null;
|
||||
}
|
||||
|
||||
//writeback buffer
|
||||
DummyTile[][] writeTiles = new DummyTile[editor.width()][editor.height()];
|
||||
|
||||
@@ -196,7 +215,7 @@ public class MapGenerateDialog extends FloatingDialog{
|
||||
}
|
||||
|
||||
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
|
||||
for(int x = 0; x < editor.width(); x++){
|
||||
for(int y = 0; y < editor.height(); y++){
|
||||
@@ -215,10 +234,10 @@ public class MapGenerateDialog extends FloatingDialog{
|
||||
DummyTile write = writeTiles[x][y];
|
||||
|
||||
tile.setRotation((byte)write.rotation);
|
||||
tile.setFloor((Floor)write.floor);
|
||||
tile.setBlock(write.block);
|
||||
tile.setTeam(write.team);
|
||||
tile.setOre(write.ore);
|
||||
tile.setFloor((Floor)content.block(write.floor));
|
||||
tile.setBlock(content.block(write.block));
|
||||
tile.setTeam(Team.all[write.team]);
|
||||
tile.setOre(content.block(write.ore));
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -239,74 +258,81 @@ public class MapGenerateDialog extends FloatingDialog{
|
||||
Array<GenerateFilter> copy = new Array<>(filters);
|
||||
|
||||
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 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){
|
||||
input.setFilter(filter, (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, 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);
|
||||
Core.app.post(() -> {
|
||||
texture.draw(pixmap, 0, 0);
|
||||
generating = false;
|
||||
});
|
||||
}catch(Exception e){
|
||||
generating = false;
|
||||
});
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
public static class DummyTile{
|
||||
public Block block = Blocks.air, ore = Blocks.air, floor = Blocks.air;
|
||||
public Team team = Team.none;
|
||||
public int rotation;
|
||||
public byte block, floor, ore, team, rotation;
|
||||
|
||||
void set(Block floor, Block wall, Block ore, Team team, int rotation){
|
||||
this.floor = floor;
|
||||
this.block = wall;
|
||||
this.ore = ore;
|
||||
this.team = team;
|
||||
this.rotation = rotation;
|
||||
this.floor = floor.id;
|
||||
this.block = wall.id;
|
||||
this.ore = ore.id;
|
||||
this.team = (byte)team.ordinal();
|
||||
this.rotation = (byte)rotation;
|
||||
}
|
||||
|
||||
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){
|
||||
|
||||
@@ -267,7 +267,9 @@ public class MapView extends Element implements GestureListener{
|
||||
Draw.color(Pal.remove);
|
||||
Lines.stroke(2f);
|
||||
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();
|
||||
|
||||
if(!ScissorStack.pushScissors(rect.set(x, y, width, height))){
|
||||
|
||||
@@ -3,6 +3,7 @@ package io.anuke.mindustry.editor;
|
||||
import io.anuke.arc.Core;
|
||||
import io.anuke.arc.collection.Array;
|
||||
import io.anuke.arc.graphics.Color;
|
||||
import io.anuke.arc.input.KeyCode;
|
||||
import io.anuke.arc.math.Mathf;
|
||||
import io.anuke.arc.scene.ui.TextField.TextFieldFilter;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
@@ -37,13 +38,49 @@ public class WaveInfoDialog extends FloatingDialog{
|
||||
this.editor = editor;
|
||||
|
||||
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();
|
||||
buttons.addButton("$settings.reset", () -> ui.showConfirm("$confirm", "$settings.clear.confirm", () ->{
|
||||
groups = null;
|
||||
buildGroups();
|
||||
})).size(270f, 64f);
|
||||
buttons.addButton("$waves.edit", () -> {
|
||||
FloatingDialog dialog = new FloatingDialog("$waves.edit");
|
||||
dialog.addCloseButton();
|
||||
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(){
|
||||
@@ -61,7 +98,7 @@ public class WaveInfoDialog extends FloatingDialog{
|
||||
}).growX().height(70f);
|
||||
}).width(390f).growY();
|
||||
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.addButton("-", () -> {}).update(t -> {
|
||||
if(t.getClickListener().isPressed()){
|
||||
@@ -108,16 +145,16 @@ public class WaveInfoDialog extends FloatingDialog{
|
||||
|
||||
t.row();
|
||||
t.table(spawns -> {
|
||||
spawns.addField("" + group.begin, TextFieldFilter.digitsOnly, text -> {
|
||||
spawns.addField("" + (group.begin + 1), TextFieldFilter.digitsOnly, text -> {
|
||||
if(Strings.canParsePostiveInt(text)){
|
||||
group.begin = Strings.parseInt(text);
|
||||
group.begin = Strings.parseInt(text) - 1;
|
||||
updateWaves();
|
||||
}
|
||||
}).width(100f);
|
||||
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)){
|
||||
group.end = Strings.parseInt(text);
|
||||
group.end = Strings.parseInt(text) - 1;
|
||||
updateWaves();
|
||||
}else if(text.isEmpty()){
|
||||
group.end = never;
|
||||
@@ -205,7 +242,7 @@ public class WaveInfoDialog extends FloatingDialog{
|
||||
for(int i = start; i < displayed + start; i ++){
|
||||
int wave = i;
|
||||
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();
|
||||
|
||||
int[] spawned = new int[Vars.content.getBy(ContentType.unit).size];
|
||||
|
||||
@@ -4,6 +4,8 @@ import io.anuke.mindustry.editor.MapGenerateDialog.DummyTile;
|
||||
import io.anuke.mindustry.editor.generation.FilterOption.SliderOption;
|
||||
import io.anuke.mindustry.world.blocks.Floor;
|
||||
|
||||
import static io.anuke.mindustry.Vars.content;
|
||||
|
||||
public class DistortFilter extends GenerateFilter{
|
||||
float scl = 40, mag = 5;
|
||||
|
||||
@@ -16,10 +18,10 @@ public class DistortFilter extends GenerateFilter{
|
||||
|
||||
@Override
|
||||
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;
|
||||
if(!tile.block.synthetic() && !in.block.synthetic()) in.block = tile.block;
|
||||
if(!((Floor)in.floor).isLiquid) in.ore = tile.ore;
|
||||
in.floor = content.block(tile.floor);
|
||||
if(!content.block(tile.block).synthetic() && !in.block.synthetic()) in.block = content.block(tile.block);
|
||||
if(!((Floor)in.floor).isLiquid) in.ore = content.block(tile.ore);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,8 @@ import io.anuke.mindustry.world.Block.Icon;
|
||||
import io.anuke.mindustry.world.blocks.Floor;
|
||||
import io.anuke.mindustry.world.blocks.OreBlock;
|
||||
|
||||
import static io.anuke.mindustry.Vars.updateEditorOnChange;
|
||||
|
||||
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> wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Icon.full));
|
||||
@@ -40,7 +42,11 @@ public abstract class FilterOption{
|
||||
table.row();
|
||||
Slider slider = table.addSlider(min, max, (max-min)/200f, setter).growX().get();
|
||||
slider.setValue(getter.get());
|
||||
slider.changed(changed);
|
||||
if(updateEditorOnChange){
|
||||
slider.changed(changed);
|
||||
}else{
|
||||
slider.released(changed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ public abstract class GenerateFilter{
|
||||
public Floor srcfloor;
|
||||
public Block srcblock;
|
||||
public Block srcore;
|
||||
public int x, y;
|
||||
public int x, y, width, height, scaling;
|
||||
|
||||
public MapEditor editor;
|
||||
public Block floor, block, ore;
|
||||
@@ -74,14 +74,17 @@ public abstract class GenerateFilter{
|
||||
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.width = width;
|
||||
this.height = height;
|
||||
this.scaling = scaling;
|
||||
noise.setSeed(filter.seed);
|
||||
pnoise.setSeed((int)(filter.seed + 1));
|
||||
}
|
||||
|
||||
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{
|
||||
|
||||
@@ -45,7 +45,7 @@ import static io.anuke.mindustry.Vars.*;
|
||||
public interface BuilderTrait extends Entity, TeamTrait{
|
||||
//these are not instance variables!
|
||||
Vector2[] tmptr = new Vector2[]{new Vector2(), new Vector2(), new Vector2(), new Vector2()};
|
||||
float placeDistance = 150f;
|
||||
float placeDistance = 220f;
|
||||
float mineDistance = 70f;
|
||||
Array<BuildRequest> removal = new Array<>();
|
||||
|
||||
|
||||
@@ -32,20 +32,18 @@ public abstract class FlyingUnit extends BaseUnit{
|
||||
target = null;
|
||||
}
|
||||
|
||||
if(target == null){
|
||||
retarget(() -> {
|
||||
targetClosest();
|
||||
|
||||
retarget(() -> {
|
||||
targetClosest();
|
||||
if(target == null) targetClosestEnemyFlag(BlockFlag.producer);
|
||||
if(target == null) targetClosestEnemyFlag(BlockFlag.turret);
|
||||
|
||||
if(target == null) targetClosestEnemyFlag(BlockFlag.producer);
|
||||
if(target == null) targetClosestEnemyFlag(BlockFlag.turret);
|
||||
if(target == null){
|
||||
setState(patrol);
|
||||
}
|
||||
});
|
||||
|
||||
if(target == null){
|
||||
setState(patrol);
|
||||
}
|
||||
});
|
||||
|
||||
}else{
|
||||
if(target != null){
|
||||
attack(type.attackLength);
|
||||
|
||||
if((Angles.near(angleTo(target), rotation, type.shootCone) || getWeapon().ignoreRotation) //bombers and such don't care about rotation
|
||||
|
||||
@@ -9,9 +9,13 @@ import io.anuke.arc.graphics.g2d.*;
|
||||
import io.anuke.arc.math.Angles;
|
||||
import io.anuke.arc.math.Mathf;
|
||||
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.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.mindustry.content.Fx;
|
||||
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.graphics.Pal;
|
||||
import io.anuke.mindustry.input.Binding;
|
||||
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
|
||||
import io.anuke.mindustry.io.TypeIO;
|
||||
import io.anuke.mindustry.net.Net;
|
||||
import io.anuke.mindustry.net.NetConnection;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Block.Icon;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
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. */
|
||||
public void drawBuildRequests(){
|
||||
BuildRequest last = null;
|
||||
for(BuildRequest request : getPlaceQueue()){
|
||||
if(getCurrentRequest() == request && request.progress > 0.001f) continue;
|
||||
|
||||
@@ -426,32 +431,37 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
|
||||
|
||||
Lines.square(
|
||||
request.x * tilesize + block.offset(),
|
||||
request.y * tilesize + block.offset(),
|
||||
rad);
|
||||
request.y * tilesize + block.offset(), rad);
|
||||
}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();
|
||||
PlaceDraw draw = PlaceDraw.instance;
|
||||
|
||||
Draw.rect(request.block.icon(Icon.full),
|
||||
request.x * tilesize + request.block.offset(),
|
||||
request.y * tilesize + request.block.offset(), rad*2, rad*2, request.block.rotate ? request.rotation * 90 : 0);
|
||||
draw.scalex = 1;
|
||||
draw.scaley = 1;
|
||||
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);
|
||||
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(
|
||||
request.x * tilesize + request.block.offset(),
|
||||
request.y * tilesize + request.block.offset(),
|
||||
rad);
|
||||
last = request;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -584,6 +594,8 @@ public class Player extends Unit implements BuilderTrait, ShooterTrait{
|
||||
|
||||
if(!ui.chatfrag.chatOpen()){
|
||||
velocity.add(movement.x, movement.y);
|
||||
}else{
|
||||
isShooting = false;
|
||||
}
|
||||
float prex = x, prey = y;
|
||||
updateVelocityStatus();
|
||||
|
||||
@@ -30,7 +30,7 @@ public class Stats{
|
||||
|
||||
//each new launch period adds onto the rank 'points'
|
||||
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;
|
||||
@@ -42,7 +42,7 @@ public class Stats{
|
||||
frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size;
|
||||
}
|
||||
|
||||
score += frac*2.0f;
|
||||
score += frac*1.6f;
|
||||
|
||||
if(!launched){
|
||||
score *= 0.5f;
|
||||
|
||||
@@ -15,6 +15,7 @@ public enum Binding implements KeyBind{
|
||||
deselect(KeyCode.MOUSE_RIGHT),
|
||||
break_block(KeyCode.MOUSE_RIGHT),
|
||||
rotate(new Axis(KeyCode.SCROLL)),
|
||||
diagonal_placement(KeyCode.CONTROL_LEFT),
|
||||
pick(KeyCode.MOUSE_MIDDLE),
|
||||
dash(KeyCode.SHIFT_LEFT),
|
||||
gridMode(KeyCode.GRAVE),
|
||||
|
||||
@@ -5,7 +5,6 @@ import io.anuke.arc.Graphics.Cursor;
|
||||
import io.anuke.arc.Graphics.Cursor.SystemCursor;
|
||||
import io.anuke.arc.graphics.g2d.Draw;
|
||||
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.geom.Geometry;
|
||||
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.net.Net;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Block.Icon;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
@@ -34,33 +32,35 @@ public class DesktopInput extends InputHandler{
|
||||
/**Animation scale for line.*/
|
||||
private float selectScale;
|
||||
|
||||
private int prevX, prevY, prevRotation;
|
||||
|
||||
public DesktopInput(Player player){
|
||||
super(player);
|
||||
}
|
||||
|
||||
/**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)){
|
||||
block.getPlaceDraw(placeDraw, rotation, prevX, prevY, prevRotation);
|
||||
|
||||
Draw.color();
|
||||
|
||||
TextureRegion region = block.icon(Icon.full);
|
||||
|
||||
Draw.rect(region, x * tilesize + block.offset(), y * tilesize + block.offset(),
|
||||
region.getWidth() * selectScale * Draw.scl,
|
||||
region.getHeight() * selectScale * Draw.scl, block.rotate ? rotation * 90 : 0);
|
||||
Draw.rect(placeDraw.region, x * tilesize + block.offset(), y * tilesize + block.offset(),
|
||||
placeDraw.region.getWidth() * selectScale * Draw.scl * placeDraw.scalex,
|
||||
placeDraw.region.getHeight() * selectScale * 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;
|
||||
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();
|
||||
}else{
|
||||
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);
|
||||
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)
|
||||
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){
|
||||
int x = selectX + i * Mathf.sign(cursorX - selectX) * Mathf.num(result.isX());
|
||||
int y = selectY + i * Mathf.sign(cursorY - selectY) * Mathf.num(!result.isX());
|
||||
|
||||
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);
|
||||
iterateLine(selectX, selectY, cursorX, cursorY, l -> {
|
||||
if(l.last && block.rotate){
|
||||
drawArrow(block, l.x, l.y, l.rotation);
|
||||
}
|
||||
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){
|
||||
NormalizeDrawResult result = PlaceUtils.normalizeDrawArea(Blocks.air, selectX, selectY, cursorX, cursorY, false, maxLength, 1f);
|
||||
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);
|
||||
}else if(isPlacing()){
|
||||
if(block.rotate){
|
||||
Draw.color(!validPlace(cursorX, cursorY, block, rotation) ? Pal.removeBack : Pal.accentBack);
|
||||
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);
|
||||
drawArrow(block, cursorX, cursorY, rotation);
|
||||
}
|
||||
drawPlace(cursorX, cursorY, block, rotation);
|
||||
drawPlace(cursorX, cursorY, block, rotation, cursorX, cursorY, 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));
|
||||
|
||||
if(player.isDead()) return;
|
||||
if(player.isDead()){
|
||||
cursorType = SystemCursor.arrow;
|
||||
return;
|
||||
}
|
||||
|
||||
pollInput();
|
||||
|
||||
@@ -190,9 +170,7 @@ public class DesktopInput extends InputHandler{
|
||||
|
||||
Tile cursor = tileAt(Core.input.mouseX(), Core.input.mouseY());
|
||||
|
||||
if(player.isDead()){
|
||||
cursorType = SystemCursor.arrow;
|
||||
}else if(cursor != null){
|
||||
if(cursor != null){
|
||||
cursor = cursor.target();
|
||||
|
||||
cursorType = cursor.block().getCursor(cursor);
|
||||
@@ -255,20 +233,13 @@ public class DesktopInput extends InputHandler{
|
||||
selectY = tileY(Core.input.mouseY());
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, true, maxLength);
|
||||
|
||||
for(int i = 0; i <= result.getLength(); i += block.size){
|
||||
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);
|
||||
}
|
||||
iterateLine(selectX, selectY, cursorX, cursorY, l -> {
|
||||
rotation = l.rotation;
|
||||
tryPlaceBlock(l.x, l.y);
|
||||
});
|
||||
}else if(mode == breaking){ //touch up while breaking, break everything in selection
|
||||
NormalizeResult result = PlaceUtils.normalizeArea(selectX, selectY, cursorX, cursorY, rotation, false, maxLength);
|
||||
for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){
|
||||
@@ -287,7 +258,6 @@ public class DesktopInput extends InputHandler{
|
||||
|
||||
mode = none;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -312,5 +282,4 @@ public class DesktopInput extends InputHandler{
|
||||
droppingItem = false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,13 +3,19 @@ package io.anuke.mindustry.input;
|
||||
import io.anuke.annotations.Annotations.Loc;
|
||||
import io.anuke.annotations.Annotations.Remote;
|
||||
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.g2d.Draw;
|
||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||
import io.anuke.arc.input.InputProcessor;
|
||||
import io.anuke.arc.math.Angles;
|
||||
import io.anuke.arc.math.Mathf;
|
||||
import io.anuke.arc.math.geom.Point2;
|
||||
import io.anuke.arc.math.geom.Vector2;
|
||||
import io.anuke.arc.scene.ui.layout.Table;
|
||||
import io.anuke.arc.util.Time;
|
||||
import io.anuke.arc.util.Tmp;
|
||||
import io.anuke.mindustry.content.Blocks;
|
||||
import io.anuke.mindustry.content.Fx;
|
||||
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.type.Player;
|
||||
import io.anuke.mindustry.gen.Call;
|
||||
import io.anuke.mindustry.graphics.Pal;
|
||||
import io.anuke.mindustry.net.Net;
|
||||
import io.anuke.mindustry.net.ValidateException;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
@@ -44,6 +51,9 @@ public abstract class InputHandler implements InputProcessor{
|
||||
public int rotation;
|
||||
public boolean droppingItem;
|
||||
|
||||
protected PlaceDraw placeDraw = new PlaceDraw();
|
||||
private PlaceLine line = new PlaceLine();
|
||||
|
||||
public InputHandler(Player player){
|
||||
this.player = player;
|
||||
}
|
||||
@@ -337,4 +347,67 @@ public abstract class InputHandler implements InputProcessor{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@ import io.anuke.mindustry.input.PlaceUtils.NormalizeDrawResult;
|
||||
import io.anuke.mindustry.input.PlaceUtils.NormalizeResult;
|
||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Block.Icon;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
@@ -50,7 +49,6 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
//gesture data
|
||||
private Vector2 vector = new Vector2();
|
||||
private float lastDistance = -1f;
|
||||
private boolean canPan;
|
||||
/** Set of completed guides. */
|
||||
private ObjectSet<String> guides = new ObjectSet<>();
|
||||
|
||||
@@ -62,6 +60,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
/** Animation data for crosshair. */
|
||||
private float crosshairScale;
|
||||
private TargetTrait lastTarget;
|
||||
/** Used for shifting build requests.*/
|
||||
private float shiftDeltaX, shiftDeltaY;
|
||||
|
||||
/** List of currently selected tiles to place. */
|
||||
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. */
|
||||
private PlaceRequest lastPlaced;
|
||||
|
||||
private int prevX, prevY, prevRotation;
|
||||
|
||||
public MobileInput(Player player){
|
||||
super(player);
|
||||
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);
|
||||
}
|
||||
|
||||
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){
|
||||
if(!guides.contains(type) && !Core.settings.getBool(type, false)){
|
||||
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){
|
||||
if(!block.rotate) return;
|
||||
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);
|
||||
//endregion
|
||||
//region UI and drawing
|
||||
|
||||
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 drawRequest(PlaceRequest request, PlaceRequest prev){
|
||||
Tile tile = request.tile();
|
||||
|
||||
if(!request.remove){
|
||||
if(prev != null){
|
||||
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
|
||||
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.redness = Mathf.lerpDelta(request.redness, 0f, 0.2f);
|
||||
|
||||
drawRequest(request);
|
||||
drawRequest(request, null);
|
||||
}
|
||||
|
||||
PlaceRequest last = null;
|
||||
|
||||
//draw list of requests
|
||||
for(PlaceRequest request : selection){
|
||||
Tile tile = request.tile();
|
||||
@@ -336,17 +354,19 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
|
||||
if(!request.remove && request == lastPlaced && request.block != null){
|
||||
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);
|
||||
drawRequest(request);
|
||||
drawRequest(request, last);
|
||||
|
||||
//draw last placed request
|
||||
if(!request.remove && request == lastPlaced && request.block != null){
|
||||
Draw.mixcol();
|
||||
request.block.drawPlace(tile.x, tile.y, rotation, validPlace(tile.x, tile.y, request.block, rotation));
|
||||
}
|
||||
|
||||
last = request;
|
||||
}
|
||||
|
||||
Draw.mixcol();
|
||||
@@ -357,51 +377,23 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
int tileX = tileX(Core.input.mouseX());
|
||||
int tileY = tileY(Core.input.mouseY());
|
||||
|
||||
//draw placing
|
||||
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);
|
||||
|
||||
NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, true, maxLength);
|
||||
|
||||
{
|
||||
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);
|
||||
iterateLine(lineStartX, lineStartY, tileX, tileY, l -> {
|
||||
if(l.last && block.rotate){
|
||||
drawArrow(block, l.x, l.y, l.rotation);
|
||||
}
|
||||
}
|
||||
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){
|
||||
//draw breaking
|
||||
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 tileY = tileY(screenY);
|
||||
|
||||
if(mode == placing && block != null){
|
||||
|
||||
//normalize area
|
||||
NormalizeResult result = PlaceUtils.normalizeArea(lineStartX, lineStartY, tileX, tileY, rotation, true, 100);
|
||||
|
||||
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;
|
||||
|
||||
if(mode == placing && isPlacing()){
|
||||
iterateLine(lineStartX, lineStartY, tileX, tileY, l -> {
|
||||
PlaceRequest request = new PlaceRequest(l.x, l.y, block, l.rotation);
|
||||
request.scale = 1f;
|
||||
selection.add(request);
|
||||
});
|
||||
}else if(mode == breaking){
|
||||
//normalize area
|
||||
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();
|
||||
|
||||
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;
|
||||
selection.add(request);
|
||||
}
|
||||
@@ -589,11 +565,11 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
removeRequest(getRequest(cursor));
|
||||
}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
|
||||
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())){
|
||||
//add to selection queue if it's a valid BREAK position
|
||||
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())){
|
||||
tryBeginMine(cursor);
|
||||
}
|
||||
@@ -701,10 +677,21 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
}
|
||||
|
||||
if(selecting){ //pan all requests
|
||||
for(PlaceRequest req : selection){
|
||||
if(req.remove) continue; //don't shift removal requests
|
||||
req.x += deltaX;
|
||||
req.y += deltaY;
|
||||
shiftDeltaX += deltaX;
|
||||
shiftDeltaY += 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{
|
||||
//pan player
|
||||
@@ -715,6 +702,12 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean panStop(float x, float y, int pointer, KeyCode button){
|
||||
shiftDeltaX = shiftDeltaY = 0f;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean zoom(float initialDistance, float distance){
|
||||
if(lastDistance == -1) lastDistance = initialDistance;
|
||||
@@ -727,8 +720,8 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
|
||||
//endregion
|
||||
|
||||
class PlaceRequest{
|
||||
float x, y;
|
||||
private class PlaceRequest{
|
||||
int x, y;
|
||||
Block block;
|
||||
int rotation;
|
||||
boolean remove;
|
||||
@@ -737,7 +730,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
float scale;
|
||||
float redness;
|
||||
|
||||
PlaceRequest(float x, float y, Block block, int rotation){
|
||||
PlaceRequest(int x, int y, Block block, int rotation){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.block = block;
|
||||
@@ -745,14 +738,14 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
this.remove = false;
|
||||
}
|
||||
|
||||
PlaceRequest(float x, float y){
|
||||
PlaceRequest(int x, int y){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.remove = true;
|
||||
}
|
||||
|
||||
Tile tile(){
|
||||
return world.tileWorld(x - (block == null ? 0 : block.offset()), y - (block == null ? 0 : block.offset()));
|
||||
return world.tile(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,44 @@
|
||||
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.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;
|
||||
|
||||
public class PlaceUtils{
|
||||
private static final NormalizeResult result = new NormalizeResult();
|
||||
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.
|
||||
|
||||
@@ -25,7 +25,7 @@ import static io.anuke.mindustry.Vars.world;
|
||||
public class MapGenerator extends Generator{
|
||||
private Map map;
|
||||
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;
|
||||
/**How much the landscape is randomly distorted.*/
|
||||
public float distortion = 3;
|
||||
@@ -99,6 +99,10 @@ public class MapGenerator extends Generator{
|
||||
enemies.add(new Point2(x, y));
|
||||
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){
|
||||
tile.setFloor(tiles[newX][newY].floor());
|
||||
tile.setOre(tiles[newX][newY].ore());
|
||||
}
|
||||
|
||||
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)){
|
||||
tile.setBlock(decor.wall);
|
||||
}else if(tile.floor() == decor.floor && decor.wall instanceof Floor && Mathf.chance(decor.chance)){
|
||||
|
||||
@@ -124,6 +124,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
||||
|
||||
game.screenshakePref();
|
||||
game.checkPref("effects", true);
|
||||
game.checkPref("swapdiagonal", false);
|
||||
if(mobile){
|
||||
game.checkPref("autotarget", true);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import io.anuke.arc.Core;
|
||||
import io.anuke.arc.Events;
|
||||
import io.anuke.arc.collection.Array;
|
||||
import io.anuke.arc.graphics.Color;
|
||||
import io.anuke.arc.input.KeyCode;
|
||||
import io.anuke.arc.math.Interpolation;
|
||||
import io.anuke.arc.math.Mathf;
|
||||
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.ui.Bar;
|
||||
import io.anuke.mindustry.ui.IntFormat;
|
||||
import io.anuke.mindustry.ui.dialogs.FloatingDialog;
|
||||
|
||||
import static io.anuke.mindustry.Vars.*;
|
||||
|
||||
@@ -222,16 +224,37 @@ public class HudFragment extends Fragment{
|
||||
//launch button
|
||||
parent.fill(t -> {
|
||||
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.visible(() ->
|
||||
world.isZone() &&
|
||||
world.getZone().metCondition() &&
|
||||
!Net.client() &&
|
||||
state.wave % world.getZone().launchPeriod == 0 &&
|
||||
state.wavetime < state.rules.waveSpacing * launchWaveMultiplier - 70);
|
||||
state.wave % world.getZone().launchPeriod == 0 && !world.spawner.isSpawning());
|
||||
|
||||
button.update(() -> {
|
||||
if(world.getZone() == null){
|
||||
@@ -444,6 +467,6 @@ public class HudFragment extends Fragment{
|
||||
}
|
||||
}).growY().fillX().right().width(40f)
|
||||
.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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import io.anuke.mindustry.game.UnlockableContent;
|
||||
import io.anuke.mindustry.graphics.CacheLayer;
|
||||
import io.anuke.mindustry.graphics.Layer;
|
||||
import io.anuke.mindustry.graphics.Pal;
|
||||
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
|
||||
import io.anuke.mindustry.type.*;
|
||||
import io.anuke.mindustry.ui.Bar;
|
||||
import io.anuke.mindustry.ui.ContentDisplay;
|
||||
@@ -269,6 +270,7 @@ public class Block extends BlockStorage{
|
||||
|
||||
public float sumAttribute(Attribute attr, int x, int y){
|
||||
Tile tile = world.tile(x, y);
|
||||
if(tile == null) return 0;
|
||||
float sum = 0;
|
||||
for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){
|
||||
sum += other.floor().attributes.get(attr);
|
||||
@@ -546,6 +548,12 @@ public class Block extends BlockStorage{
|
||||
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!*/
|
||||
public TextureRegion editorIcon(){
|
||||
if(editorIcon == null) editorIcon = Core.atlas.find(name + "-icon-editor");
|
||||
|
||||
@@ -87,6 +87,14 @@ public class Tile implements Position, TargetTrait{
|
||||
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){
|
||||
if(x == cx && y <= cy - 1) return 1;
|
||||
if(x == cx && y >= cy + 1) return 3;
|
||||
@@ -95,6 +103,14 @@ public class Tile implements Position, TargetTrait{
|
||||
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")
|
||||
public <T extends TileEntity> T entity(){
|
||||
return (T) entity;
|
||||
|
||||
@@ -109,12 +109,13 @@ public class Floor extends Block{
|
||||
Mathf.random.setSeed(tile.pos());
|
||||
|
||||
Draw.rect(variantRegions[Mathf.randomSeed(tile.pos(), 0, Math.max(0, variantRegions.length - 1))], tile.worldx(), tile.worldy());
|
||||
|
||||
drawEdges(tile);
|
||||
|
||||
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
|
||||
floor.draw(tile);
|
||||
}
|
||||
|
||||
drawEdges(tile);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ public abstract class Turret extends Block{
|
||||
protected float shootShake = 0f;
|
||||
protected float xRand = 0f;
|
||||
protected boolean targetAir = true;
|
||||
protected boolean targetGround = true;
|
||||
|
||||
protected Vector2 tr = 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.shots, shots, StatUnit.none);
|
||||
stats.add(BlockStat.targetsAir, targetAir);
|
||||
stats.add(BlockStat.targetsGround, targetGround);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -201,7 +203,7 @@ public abstract class Turret extends Block{
|
||||
TurretEntity entity = tile.entity();
|
||||
|
||||
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){
|
||||
|
||||
@@ -6,6 +6,7 @@ import io.anuke.arc.graphics.g2d.Draw;
|
||||
import io.anuke.arc.graphics.g2d.TextureRegion;
|
||||
import io.anuke.arc.math.Mathf;
|
||||
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.util.Log;
|
||||
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.Unit;
|
||||
import io.anuke.mindustry.graphics.Layer;
|
||||
import io.anuke.mindustry.input.InputHandler.PlaceDraw;
|
||||
import io.anuke.mindustry.type.Item;
|
||||
import io.anuke.mindustry.world.Block;
|
||||
import io.anuke.mindustry.world.Tile;
|
||||
@@ -89,7 +91,6 @@ public class Conveyor extends Block{
|
||||
ConveyorEntity entity = tile.entity();
|
||||
entity.blendbits = 0;
|
||||
entity.blendsclx = entity.blendscly = 1;
|
||||
entity.blendshadowrot = -1;
|
||||
|
||||
if(blends(tile, 2) && blends(tile, 1) && blends(tile, 3)){
|
||||
entity.blendbits = 3;
|
||||
@@ -103,13 +104,34 @@ public class Conveyor extends Block{
|
||||
}else if(blends(tile, 1)){
|
||||
entity.blendbits = 1;
|
||||
entity.blendscly = -1;
|
||||
entity.blendshadowrot = 0;
|
||||
}else if(blends(tile, 3)){
|
||||
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){
|
||||
Tile other = tile.getNearby(Mathf.mod(tile.getRotation() - direction, 4));
|
||||
if(other != null) other = other.target();
|
||||
@@ -343,7 +365,6 @@ public class Conveyor extends Block{
|
||||
byte lastInserted;
|
||||
float minitem = 1;
|
||||
|
||||
int blendshadowrot = -1;
|
||||
int blendbits;
|
||||
int blendsclx, blendscly;
|
||||
|
||||
|
||||
@@ -143,6 +143,10 @@ public class PowerGraph{
|
||||
}
|
||||
|
||||
public void update(){
|
||||
if(Core.graphics.getFrameId() == lastFrameUpdated){
|
||||
return;
|
||||
}
|
||||
|
||||
lastFrameUpdated = Core.graphics.getFrameId();
|
||||
|
||||
float powerNeeded = getPowerNeeded();
|
||||
@@ -150,7 +154,7 @@ public class PowerGraph{
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ public class ThermalGenerator extends PowerGenerator{
|
||||
|
||||
@Override
|
||||
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
|
||||
|
||||
@@ -53,7 +53,7 @@ public class Cultivator extends GenericCrafter{
|
||||
public void setBars(){
|
||||
super.setBars();
|
||||
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),
|
||||
() -> Pal.ammo,
|
||||
() -> ((CultivatorEntity)entity).warmup));
|
||||
@@ -61,7 +61,7 @@ public class Cultivator extends GenericCrafter{
|
||||
|
||||
@Override
|
||||
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
|
||||
|
||||
@@ -42,7 +42,7 @@ public class SolidPump extends Pump{
|
||||
@Override
|
||||
public void drawPlace(int x, int y, int rotation, boolean valid){
|
||||
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(){
|
||||
super.setBars();
|
||||
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),
|
||||
() -> Pal.ammo,
|
||||
() -> ((SolidPumpEntity)entity).warmup));
|
||||
|
||||
@@ -47,6 +47,7 @@ public enum BlockStat{
|
||||
reload(StatCategory.shooting),
|
||||
powerShot(StatCategory.shooting),
|
||||
targetsAir(StatCategory.shooting),
|
||||
targetsGround(StatCategory.shooting),
|
||||
|
||||
boostItem(StatCategory.optional),
|
||||
boostLiquid(StatCategory.optional),;
|
||||
|
||||