Merge remote-tracking branch 'upstream/master'

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -203,6 +203,12 @@ waves.waves = wave(s)
waves.perspawn = per spawn
waves.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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 = コア: シャード

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 B

After

Width:  |  Height:  |  Size: 501 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 209 KiB

View File

@@ -66,6 +66,8 @@ public class Vars{
public static final float finalWorldBounds = worldBounds + 500;
/**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*/

View File

@@ -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(){

View File

@@ -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"){{

View File

@@ -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");

View File

@@ -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);

View File

@@ -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);

View File

@@ -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));
}
}

View File

@@ -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){

View File

@@ -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))){

View File

@@ -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];

View File

@@ -4,6 +4,8 @@ import io.anuke.mindustry.editor.MapGenerateDialog.DummyTile;
import io.anuke.mindustry.editor.generation.FilterOption.SliderOption;
import io.anuke.mindustry.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);
}
}

View File

@@ -12,6 +12,8 @@ import io.anuke.mindustry.world.Block.Icon;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.blocks.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);
}
}
}

View File

@@ -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{

View File

@@ -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<>();

View File

@@ -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

View File

@@ -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();

View File

@@ -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;

View File

@@ -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),

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}

View File

@@ -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.

View File

@@ -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)){

View File

@@ -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);
}

View File

@@ -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));
}
}

View File

@@ -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");

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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){

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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));

View File

@@ -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),;