Settings menu layout improved / Rule dialog improvements
BIN
core/assets-raw/sprites/ui/check-disabled.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
core/assets-raw/sprites/ui/check-on-disabled.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
core/assets-raw/sprites/ui/underline-disabled.9.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
@@ -442,14 +442,14 @@ setting.difficulty.name = Difficulty:
|
|||||||
setting.screenshake.name = Screen Shake
|
setting.screenshake.name = Screen Shake
|
||||||
setting.effects.name = Display Effects
|
setting.effects.name = Display Effects
|
||||||
setting.sensitivity.name = Controller Sensitivity
|
setting.sensitivity.name = Controller Sensitivity
|
||||||
setting.saveinterval.name = Autosave Interval
|
setting.saveinterval.name = Save Interval
|
||||||
setting.seconds = {0} Seconds
|
setting.seconds = {0} Seconds
|
||||||
setting.fullscreen.name = Fullscreen
|
setting.fullscreen.name = Fullscreen
|
||||||
setting.borderless.name = Borderless Window
|
setting.borderless.name = Borderless Window
|
||||||
setting.fps.name = Show FPS
|
setting.fps.name = Show FPS
|
||||||
setting.vsync.name = VSync
|
setting.vsync.name = VSync
|
||||||
setting.lasers.name = Show Power Lasers
|
setting.lasers.name = Show Power Lasers
|
||||||
setting.pixelate.name = Pixelate [LIGHT_GRAY](may decrease performance, disables animations)
|
setting.pixelate.name = Pixelate[LIGHT_GRAY] (disables animations)
|
||||||
setting.minimap.name = Show Minimap
|
setting.minimap.name = Show Minimap
|
||||||
setting.musicvol.name = Music Volume
|
setting.musicvol.name = Music Volume
|
||||||
setting.mutemusic.name = Mute Music
|
setting.mutemusic.name = Mute Music
|
||||||
@@ -520,6 +520,7 @@ rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec)
|
|||||||
rules.buildcostmultiplier = Build Cost Multiplier
|
rules.buildcostmultiplier = Build Cost Multiplier
|
||||||
rules.buildspeedmultiplier = Build Speed Multiplier
|
rules.buildspeedmultiplier = Build Speed Multiplier
|
||||||
rules.waitForWaveToEnd = Waves wait for enemies
|
rules.waitForWaveToEnd = Waves wait for enemies
|
||||||
|
rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles)
|
||||||
rules.respawns = Max respawns per wave
|
rules.respawns = Max respawns per wave
|
||||||
rules.limitedRespawns = Limit Respawns
|
rules.limitedRespawns = Limit Respawns
|
||||||
rules.title.waves = Waves
|
rules.title.waves = Waves
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 280 KiB |
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 382 KiB After Width: | Height: | Size: 381 KiB |
|
Before Width: | Height: | Size: 340 KiB After Width: | Height: | Size: 342 KiB |
|
Before Width: | Height: | Size: 373 KiB After Width: | Height: | Size: 373 KiB |
@@ -281,6 +281,7 @@
|
|||||||
font: default-font-chat,
|
font: default-font-chat,
|
||||||
fontColor: white,
|
fontColor: white,
|
||||||
disabledFontColor: gray,
|
disabledFontColor: gray,
|
||||||
|
disabledBackground: underline-disabled,
|
||||||
selection: selection,
|
selection: selection,
|
||||||
background: underline,
|
background: underline,
|
||||||
invalidBackground: underline-red,
|
invalidBackground: underline-red,
|
||||||
@@ -305,9 +306,12 @@
|
|||||||
checkboxOff: check-off,
|
checkboxOff: check-off,
|
||||||
checkboxOnOver: check-on-over,
|
checkboxOnOver: check-on-over,
|
||||||
checkboxOver: check-over,
|
checkboxOver: check-over,
|
||||||
|
checkboxOnDisabled: check-on-disabled,
|
||||||
|
checkboxOffDisabled: check-disabled,
|
||||||
font: default-font,
|
font: default-font,
|
||||||
fontColor: white,
|
fontColor: white,
|
||||||
disabledFontColor: gray
|
disabledFontColor: gray,
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import java.io.*;
|
|||||||
import static io.anuke.mindustry.Vars.*;
|
import static io.anuke.mindustry.Vars.*;
|
||||||
|
|
||||||
public class WaveSpawner{
|
public class WaveSpawner{
|
||||||
private static final float shockwaveBase = 380f, shockwaveRand = 0f, maxShockwaveDst = shockwaveBase + shockwaveRand;
|
|
||||||
private Array<FlyerSpawn> flySpawns = new Array<>();
|
private Array<FlyerSpawn> flySpawns = new Array<>();
|
||||||
private Array<GroundSpawn> groundSpawns = new Array<>();
|
private Array<GroundSpawn> groundSpawns = new Array<>();
|
||||||
private IntArray loadedSpawns = new IntArray();
|
private IntArray loadedSpawns = new IntArray();
|
||||||
@@ -56,7 +55,7 @@ public class WaveSpawner{
|
|||||||
|
|
||||||
/** @return true if the player is near a ground spawn point. */
|
/** @return true if the player is near a ground spawn point. */
|
||||||
public boolean playerNear(){
|
public boolean playerNear(){
|
||||||
return groundSpawns.count(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < maxShockwaveDst) > 0;
|
return groundSpawns.count(g -> Mathf.dst(g.x * tilesize, g.y * tilesize, player.x, player.y) < state.rules.dropZoneRadius) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void spawnEnemies(){
|
public void spawnEnemies(){
|
||||||
@@ -98,7 +97,7 @@ public class WaveSpawner{
|
|||||||
}
|
}
|
||||||
Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawn.x * tilesize, spawn.y * tilesize));
|
Time.run(20f, () -> Effects.effect(Fx.spawnShockwave, spawn.x * tilesize, spawn.y * tilesize));
|
||||||
//would be interesting to see player structures survive this without hacks
|
//would be interesting to see player structures survive this without hacks
|
||||||
Time.run(40f, () -> Damage.damage(waveTeam, spawn.x * tilesize, spawn.y * tilesize, shockwaveBase + Mathf.random(shockwaveRand), 99999999f, true));
|
Time.run(40f, () -> Damage.damage(waveTeam, spawn.x * tilesize, spawn.y * tilesize, state.rules.dropZoneRadius, 99999999f, true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ public class Rules{
|
|||||||
public float buildSpeedMultiplier = 1f;
|
public float buildSpeedMultiplier = 1f;
|
||||||
/** No-build zone around enemy core radius. */
|
/** No-build zone around enemy core radius. */
|
||||||
public float enemyCoreBuildRadius = 400f;
|
public float enemyCoreBuildRadius = 400f;
|
||||||
|
/** Radius around enemy wave drop zones.*/
|
||||||
|
public float dropZoneRadius = 380f;
|
||||||
/** Player respawn time in ticks. */
|
/** Player respawn time in ticks. */
|
||||||
public float respawnTime = 60 * 4;
|
public float respawnTime = 60 * 4;
|
||||||
/** Time between waves in ticks. */
|
/** Time between waves in ticks. */
|
||||||
|
|||||||
@@ -1,13 +1,9 @@
|
|||||||
package io.anuke.mindustry.ui.dialogs;
|
package io.anuke.mindustry.ui.dialogs;
|
||||||
|
|
||||||
import io.anuke.arc.function.BooleanConsumer;
|
import io.anuke.arc.function.*;
|
||||||
import io.anuke.arc.function.BooleanProvider;
|
|
||||||
import io.anuke.arc.function.FloatConsumer;
|
|
||||||
import io.anuke.arc.function.FloatProvider;
|
|
||||||
import io.anuke.arc.graphics.Color;
|
import io.anuke.arc.graphics.Color;
|
||||||
import io.anuke.arc.scene.ui.layout.Table;
|
import io.anuke.arc.scene.ui.layout.Table;
|
||||||
import io.anuke.arc.util.Strings;
|
import io.anuke.arc.util.Strings;
|
||||||
import io.anuke.arc.util.Structs;
|
|
||||||
import io.anuke.mindustry.core.Platform;
|
import io.anuke.mindustry.core.Platform;
|
||||||
import io.anuke.mindustry.game.Gamemode;
|
import io.anuke.mindustry.game.Gamemode;
|
||||||
import io.anuke.mindustry.game.Rules;
|
import io.anuke.mindustry.game.Rules;
|
||||||
@@ -44,37 +40,48 @@ public class CustomRulesDialog extends FloatingDialog{
|
|||||||
}).size(300f, 50f);
|
}).size(300f, 50f);
|
||||||
main.left().defaults().fillX().left().pad(5);
|
main.left().defaults().fillX().left().pad(5);
|
||||||
main.row();
|
main.row();
|
||||||
|
|
||||||
title("$rules.title.waves");
|
title("$rules.title.waves");
|
||||||
check("$rules.waves", b -> rules.waves = b, () -> rules.waves, ()-> true);
|
check("$rules.waves", b -> rules.waves = b, () -> rules.waves);
|
||||||
check("$rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer, () -> rules.waves);
|
check("$rules.wavetimer", b -> rules.waveTimer = b, () -> rules.waveTimer, () -> rules.waves);
|
||||||
check("$rules.waitForWaveToEnd", b -> rules.waitForWaveToEnd = b, () -> rules.waitForWaveToEnd, () -> rules.waves);
|
check("$rules.waitForWaveToEnd", b -> rules.waitForWaveToEnd = b, () -> rules.waitForWaveToEnd, () -> rules.waves);
|
||||||
number("$rules.wavespacing", f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> rules.waves);
|
number("$rules.wavespacing", false, f -> rules.waveSpacing = f * 60f, () -> rules.waveSpacing / 60f, () -> rules.waves);
|
||||||
|
number("$rules.dropzoneradius", false, f -> rules.dropZoneRadius = f * tilesize, () -> rules.dropZoneRadius / tilesize, () -> rules.waves);
|
||||||
|
|
||||||
title("$rules.title.respawns");
|
title("$rules.title.respawns");
|
||||||
check("$rules.limitedRespawns", b -> rules.limitedRespawns= b, () -> rules.limitedRespawns, () -> true);
|
check("$rules.limitedRespawns", b -> rules.limitedRespawns= b, () -> rules.limitedRespawns);
|
||||||
integer("$rules.respawns", f -> rules.respawns = (int) f, () -> rules.respawns, () -> rules.limitedRespawns);
|
number("$rules.respawns", true, f -> rules.respawns = (int) f, () -> rules.respawns, () -> rules.limitedRespawns);
|
||||||
number("$rules.respawntime", f -> rules.respawnTime = f * 60f, () -> rules.respawnTime / 60f, () -> true);
|
number("$rules.respawntime", f -> rules.respawnTime = f * 60f, () -> rules.respawnTime / 60f);
|
||||||
|
|
||||||
title("$rules.title.resourcesbuilding");
|
title("$rules.title.resourcesbuilding");
|
||||||
check("$rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources, () -> true);
|
check("$rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources);
|
||||||
number("$rules.buildcostmultiplier", f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources);
|
number("$rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources);
|
||||||
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier, () -> true);
|
number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier);
|
||||||
|
|
||||||
title("$rules.title.player");
|
title("$rules.title.player");
|
||||||
number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier, () -> true);
|
number("$rules.playerdamagemultiplier", f -> rules.playerDamageMultiplier = f, () -> rules.playerDamageMultiplier);
|
||||||
number("$rules.playerhealthmultiplier", f -> rules.playerHealthMultiplier = f, () -> rules.playerHealthMultiplier, () -> true);
|
number("$rules.playerhealthmultiplier", f -> rules.playerHealthMultiplier = f, () -> rules.playerHealthMultiplier);
|
||||||
|
|
||||||
title("$rules.title.unit");
|
title("$rules.title.unit");
|
||||||
check("$rules.unitdrops", b -> rules.unitDrops = b, () -> rules.unitDrops, ()->true);
|
check("$rules.unitdrops", b -> rules.unitDrops = b, () -> rules.unitDrops, ()->true);
|
||||||
number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier, ()->true);
|
number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier);
|
||||||
number("$rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier, ()->true);
|
number("$rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier);
|
||||||
number("$rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier, ()->true);
|
number("$rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier);
|
||||||
|
|
||||||
title("$rules.title.enemy");
|
title("$rules.title.enemy");
|
||||||
number("$rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200), ()->true);
|
number("$rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200));
|
||||||
}
|
}
|
||||||
|
|
||||||
void number(String text, FloatConsumer cons, FloatProvider prov, BooleanProvider condition){
|
void number(String text, FloatConsumer cons, FloatProvider prov){
|
||||||
|
number(text, false, cons, prov, () -> true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void number(String text, boolean integer, FloatConsumer cons, FloatProvider prov, BooleanProvider condition){
|
||||||
main.table(t -> {
|
main.table(t -> {
|
||||||
t.left();
|
t.left();
|
||||||
t.add(text).left().padRight(5)
|
t.add(text).left().padRight(5)
|
||||||
.update(a->a.setColor(condition.get() ? Color.WHITE : Color.GRAY));
|
.update(a->a.setColor(condition.get() ? Color.WHITE : Color.GRAY));
|
||||||
Platform.instance.addDialog(t.addField(prov.get() + "", s -> cons.accept(Strings.parseFloat(s)))
|
Platform.instance.addDialog(t.addField((integer ? (int)prov.get() : prov.get()) + "", s -> cons.accept(Strings.parseFloat(s)))
|
||||||
.padRight(100f)
|
.padRight(100f)
|
||||||
.update(a -> a.setDisabled(!condition.get()))
|
.update(a -> a.setDisabled(!condition.get()))
|
||||||
.valid(Strings::canParsePositiveFloat).width(120f) .left().get());
|
.valid(Strings::canParsePositiveFloat).width(120f) .left().get());
|
||||||
@@ -82,17 +89,8 @@ public class CustomRulesDialog extends FloatingDialog{
|
|||||||
main.row();
|
main.row();
|
||||||
}
|
}
|
||||||
|
|
||||||
void integer(String text, FloatConsumer cons, FloatProvider prov, BooleanProvider condition){
|
void check(String text, BooleanConsumer cons, BooleanProvider prov){
|
||||||
main.table(t -> {
|
check(text, cons, prov, () -> true);
|
||||||
t.left();
|
|
||||||
t.add(text).left().padRight(5)
|
|
||||||
.update(a->a.setColor(condition.get() ? Color.WHITE : Color.GRAY));
|
|
||||||
Platform.instance.addDialog(t.addField(((int) prov.get()) + "", s -> cons.accept(Strings.parseFloat(s)))
|
|
||||||
.padRight(100f)
|
|
||||||
.update(a -> a.setDisabled(!condition.get()))
|
|
||||||
.valid(Strings::canParsePostiveInt).width(120f) .left().get());
|
|
||||||
}).padTop(0);
|
|
||||||
main.row();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void check(String text, BooleanConsumer cons, BooleanProvider prov, BooleanProvider condition){
|
void check(String text, BooleanConsumer cons, BooleanProvider prov, BooleanProvider condition){
|
||||||
|
|||||||
@@ -49,8 +49,7 @@ public class SettingsMenuDialog extends SettingsDialog{
|
|||||||
setFillParent(true);
|
setFillParent(true);
|
||||||
title.setAlignment(Align.center);
|
title.setAlignment(Align.center);
|
||||||
titleTable.row();
|
titleTable.row();
|
||||||
titleTable.add(new Image("white"))
|
titleTable.add(new Image("white")).growX().height(3f).pad(4f).get().setColor(Pal.accent);
|
||||||
.growX().height(3f).pad(4f).get().setColor(Pal.accent);
|
|
||||||
|
|
||||||
cont.clearChildren();
|
cont.clearChildren();
|
||||||
cont.remove();
|
cont.remove();
|
||||||
|
|||||||