More Dark UI in stats display (#8473)

* The Dark UI Menace

* Attack of the Dark UI
This commit is contained in:
JniTrRny
2023-04-07 06:07:24 +07:00
committed by GitHub
parent cdb9fa0d7d
commit 6dc3b7e729
14 changed files with 161 additions and 64 deletions

View File

@@ -619,7 +619,7 @@ public class UnitType extends UnlockableContent{
if(mineTier >= 1){
stats.addPercent(Stat.mineSpeed, mineSpeed);
stats.add(Stat.mineTier, StatValues.blocks(b ->
stats.add(Stat.mineTier, StatValues.drillables(mineSpeed, 1f, 1, null, b ->
b.itemDrop != null &&
(b instanceof Floor f && (((f.wallOre && mineWalls) || (!f.wallOre && mineFloor))) ||
(!(b instanceof Floor) && mineWalls)) &&

View File

@@ -65,6 +65,13 @@ public class BuildTurret extends BaseTurret{
}};
}
@Override
public void setStats(){
super.setStats();
stats.addPercent(Stat.buildSpeed, buildSpeed);
}
@Override
public TextureRegion[] icons(){
return new TextureRegion[]{baseRegion, region};

View File

@@ -100,8 +100,9 @@ public class ForceProjector extends Block{
stats.add(Stat.cooldownTime, (int) (shieldHealth / cooldownBrokenBase / 60f), StatUnit.seconds);
if(consItems){
stats.add(Stat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks);
stats.add(Stat.boostEffect, phaseShieldBoost, StatUnit.shieldHealth);
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.itemBoosters("+{0} " + StatUnit.shieldHealth.localized(), stats.timePeriod, phaseShieldBoost, phaseRadiusBoost, ((ConsumeItems)findConsumer(f -> f instanceof ConsumeItems)).items, this::consumesItem));
stats.add(Stat.booster, StatValues.speedBoosters("", coolantConsumption, Float.MAX_VALUE, true, this::consumesLiquid));
}
}

View File

@@ -11,6 +11,7 @@ import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.logic.*;
import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -53,8 +54,8 @@ public class MendProjector extends Block{
stats.add(Stat.repairTime, (int)(100f / healPercent * reload / 60f), StatUnit.seconds);
stats.add(Stat.range, range / tilesize, StatUnit.blocks);
stats.add(Stat.boostEffect, phaseRangeBoost / tilesize, StatUnit.blocks);
stats.add(Stat.boostEffect, (phaseBoost + healPercent) / healPercent, StatUnit.timesSpeed);
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.itemBoosters("{0}" + StatUnit.timesSpeed.localized(), stats.timePeriod, (phaseBoost + healPercent) / healPercent, phaseRangeBoost, ((ConsumeItems)findConsumer(f -> f instanceof ConsumeItems)).items, this::consumesItem));
}
@Override

View File

@@ -13,6 +13,7 @@ import mindustry.graphics.*;
import mindustry.logic.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -68,8 +69,8 @@ public class OverdriveProjector extends Block{
stats.add(Stat.productionTime, useTime / 60f, StatUnit.seconds);
if(hasBoost){
stats.add(Stat.boostEffect, (range + phaseRangeBoost) / tilesize, StatUnit.blocks);
stats.add(Stat.boostEffect, "+" + (int)((speedBoost + speedBoostPhase) * 100f - 100) + "%");
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.itemBoosters("+{0}%", stats.timePeriod, speedBoostPhase * 100f, phaseRangeBoost, ((ConsumeItems)findConsumer(f -> f instanceof ConsumeItems)).items, this::consumesItem));
}
}

View File

@@ -18,6 +18,7 @@ public class ReloadTurret extends BaseTurret{
super.setStats();
if(coolant != null){
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.boosters(reload, coolant.amount, coolantMultiplier, true, l -> l.coolant && consumesLiquid(l)));
}
}

View File

@@ -17,6 +17,7 @@ import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.blocks.environment.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -110,11 +111,12 @@ public class BeamDrill extends Block{
public void setStats(){
super.setStats();
stats.add(Stat.drillTier, StatValues.blocks(b -> (b instanceof Floor f && f.wallOre && f.itemDrop != null && f.itemDrop.hardness <= tier) || (b instanceof StaticWall w && w.itemDrop != null && w.itemDrop.hardness <= tier)));
stats.add(Stat.drillTier, StatValues.drillables(drillTime, 0f, size, drillMultipliers, b -> (b instanceof Floor f && f.wallOre && f.itemDrop != null && f.itemDrop.hardness <= tier) || (b instanceof StaticWall w && w.itemDrop != null && w.itemDrop.hardness <= tier)));
stats.add(Stat.drillSpeed, 60f / drillTime * size, StatUnit.itemsSecond);
if(optionalBoostIntensity != 1){
stats.add(Stat.boostEffect, optionalBoostIntensity, StatUnit.timesSpeed);
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.speedBoosters("{0}" + StatUnit.timesSpeed.localized(), ((ConsumeLiquidBase)findConsumer(f -> f instanceof ConsumeLiquidBase)).amount, optionalBoostIntensity, false, l -> (consumesLiquid(l) && (findConsumer(f -> f instanceof ConsumeLiquid).booster || ((ConsumeLiquid)findConsumer(f -> f instanceof ConsumeLiquid)).liquid != l))));
}
}

View File

@@ -19,6 +19,7 @@ import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.blocks.environment.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -170,12 +171,13 @@ public class Drill extends Block{
public void setStats(){
super.setStats();
stats.add(Stat.drillTier, StatValues.blocks(b -> b instanceof Floor f && !f.wallOre && f.itemDrop != null &&
stats.add(Stat.drillTier, StatValues.drillables(drillTime, hardnessDrillMultiplier, size * size, drillMultipliers, b -> b instanceof Floor f && !f.wallOre && f.itemDrop != null &&
f.itemDrop.hardness <= tier && f.itemDrop != blockedItem && (indexer.isBlockPresent(f) || state.isMenu())));
stats.add(Stat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond);
if(liquidBoostIntensity != 1){
stats.add(Stat.boostEffect, liquidBoostIntensity * liquidBoostIntensity, StatUnit.timesSpeed);
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.speedBoosters("{0}" + StatUnit.timesSpeed.localized(), ((ConsumeLiquidBase)findConsumer(f -> f instanceof ConsumeLiquidBase)).amount, liquidBoostIntensity * liquidBoostIntensity, false, this::consumesLiquid));
}
}

View File

@@ -95,6 +95,20 @@ public class CoreBlock extends StorageBlock{
super.setStats();
stats.remove(Stat.buildTime);
stats.add(Stat.unitType, table -> {
table.row();
table.table(Styles.grayPanel, b -> {
b.image(unitType.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit);
b.table(info -> {
info.add(unitType.localizedName).left();
if(Core.settings.getBool("console")){
info.row();
info.add(unitType.name).left().color(Color.lightGray);
}
});
b.button("?", Styles.flatBordert, () -> ui.content.show(unitType)).size(40f).pad(10).right().grow().visible(() -> unitType.unlockedNow());
}).growX().pad(5).row();
});
}
@Override

View File

@@ -1,5 +1,6 @@
package mindustry.world.blocks.units;
import arc.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
@@ -70,7 +71,8 @@ public class RepairTurret extends Block{
stats.add(Stat.repairSpeed, repairSpeed * 60f, StatUnit.perSecond);
if(acceptCoolant){
stats.add(Stat.booster, StatValues.strengthBoosters(coolantMultiplier, this::consumesLiquid));
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.speedBoosters(Core.bundle.get("bar.strength"), coolantUse, coolantMultiplier, true, this::consumesLiquid));
}
}

View File

@@ -90,6 +90,7 @@ public class Stat implements Comparable<Stat>{
shieldHealth = new Stat("shieldHealth", StatCat.function),
cooldownTime = new Stat("cooldownTime", StatCat.function),
moduleTier = new Stat("moduletier", StatCat.function),
unitType = new Stat("unittype", StatCat.function),
booster = new Stat("booster", StatCat.optional),
boostEffect = new Stat("boostEffect", StatCat.optional),

View File

@@ -16,9 +16,9 @@ public class StatUnit{
blocksSquared = new StatUnit("blocksSquared"),
tilesSecond = new StatUnit("tilesSecond"),
powerSecond = new StatUnit("powerSecond", "[accent]" + Iconc.power + "[]"),
liquidSecond = new StatUnit("liquidSecond"),
liquidSecond = new StatUnit("liquidSecond", "[sky]" + Iconc.liquid + "[]"),
itemsSecond = new StatUnit("itemsSecond"),
liquidUnits = new StatUnit("liquidUnits"),
liquidUnits = new StatUnit("liquidUnits", "[sky]" + Iconc.liquid + "[]"),
powerUnits = new StatUnit("powerUnits", "[accent]" + Iconc.power + "[]"),
heatUnits = new StatUnit("heatUnits", "[red]" + Iconc.waves + "[]"),
degrees = new StatUnit("degrees"),

View File

@@ -2,6 +2,7 @@ package mindustry.world.meta;
import arc.*;
import arc.func.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.math.*;
import arc.scene.ui.*;
@@ -235,6 +236,32 @@ public class StatValues{
return content(list.as());
}
public static StatValue drillables(float drillTime, float drillMultiplier, float size, ObjectFloatMap<Item> multipliers, Boolf<Block> filter){
return table -> {
table.row();
table.table(c -> {
int i = 0;
for(Block block : content.blocks()){
if(!filter.get(block)) continue;
c.table(Styles.grayPanel, b -> {
b.image(block.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit);
b.table(info -> {
info.left();
info.add(block.localizedName).left().row();
info.add(block.itemDrop.emoji()).left();
}).grow();
if(multipliers != null){
b.add(Strings.autoFixed(60f / (Math.max(drillTime + drillMultiplier * block.itemDrop.hardness, drillTime) / multipliers.get(block.itemDrop, 1f)) * size, 2) + StatUnit.perSecond.localized())
.right().pad(10f).padRight(15f).color(Color.lightGray);
}
}).growX().pad(5);
if(++i % 2 == 0) c.row();
}
}).growX().colspan(table.getColumns());
};
}
public static StatValue boosters(float reload, float maxUsed, float multiplier, boolean baseReload, Boolf<Liquid> filter){
return table -> {
table.row();
@@ -242,41 +269,78 @@ public class StatValues{
for(Liquid liquid : content.liquids()){
if(!filter.get(liquid)) continue;
c.image(liquid.uiIcon).size(3 * 8).scaling(Scaling.fit).padRight(4).right().top();
c.add(liquid.localizedName).padRight(10).left().top();
c.table(Tex.underline, bt -> {
bt.left().defaults().padRight(3).left();
c.table(Styles.grayPanel, b -> {
b.image(liquid.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit);
b.table(info -> {
info.add(liquid.localizedName).left().row();
info.add(Strings.autoFixed(maxUsed * 60f, 1) + StatUnit.perSecond.localized()).left().color(Color.lightGray);
});
float reloadRate = (baseReload ? 1f : 0f) + maxUsed * multiplier * liquid.heatCapacity;
float standardReload = baseReload ? reload : reload / (maxUsed * multiplier * 0.4f);
float result = standardReload / (reload / reloadRate);
bt.add(Core.bundle.format("bullet.reload", Strings.autoFixed(result * 100, 1)));
}).left().padTop(-9);
c.row();
b.table(bt -> {
bt.right().defaults().padRight(3).left();
float reloadRate = (baseReload ? 1f : 0f) + maxUsed * multiplier * liquid.heatCapacity;
float standardReload = baseReload ? reload : reload / (maxUsed * multiplier * 0.4f);
float result = standardReload / (reload / reloadRate);
bt.add(Core.bundle.format("bullet.reload", Strings.autoFixed(result * 100, 1))).pad(5);
}).right().grow().pad(10f).padRight(15f);
}).growX().pad(5).row();
}
}).colspan(table.getColumns());
}).growX().colspan(table.getColumns());
table.row();
};
}
public static StatValue strengthBoosters(float multiplier, Boolf<Liquid> filter){
public static StatValue speedBoosters(String unit, float amount, float speed, boolean strength, Boolf<Liquid> filter){
return table -> {
table.row();
table.table(c -> {
for(Liquid liquid : content.liquids()){
if(!filter.get(liquid)) continue;
c.image(liquid.uiIcon).size(3 * 8).scaling(Scaling.fit).padRight(4).right().top();
c.add(liquid.localizedName).padRight(10).left().top();
c.table(Tex.underline, bt -> {
bt.left().defaults().padRight(3).left();
c.table(Styles.grayPanel, b -> {
b.image(liquid.uiIcon).size(40).pad(10f).left().scaling(Scaling.fit);
b.table(info -> {
info.add(liquid.localizedName).left().row();
info.add(Strings.autoFixed(amount * 60f, 1) + StatUnit.perSecond.localized()).left().color(Color.lightGray);
});
float newRate = (1f + multiplier * liquid.heatCapacity);
bt.add(Core.bundle.format("bar.strength", Strings.autoFixed(newRate, 2)));
}).left().padTop(-9);
c.row();
b.table(bt -> {
bt.right().defaults().padRight(3).left();
if(speed != Float.MAX_VALUE) bt.add(unit.replace("{0}", "[stat]" + Strings.autoFixed(speed * (strength ? liquid.heatCapacity : 1f) + (strength ? 1f : 0f), 2) + "[lightgray]")).pad(5);
}).right().grow().pad(10f).padRight(15f);
}).growX().pad(5).row();
}
}).colspan(table.getColumns());
}).growX().colspan(table.getColumns());
table.row();
};
}
public static StatValue itemBoosters(String unit, float timePeriod, float speedBoost, float rangeBoost, ItemStack[] items, Boolf<Item> filter){
return table -> {
table.row();
table.table(c -> {
for(Item item : content.items()){
if(!filter.get(item)) continue;
c.table(Styles.grayPanel, b -> {
for(ItemStack stack : items){
if(timePeriod < 0){
b.add(new ItemDisplay(stack.item, stack.amount, true)).pad(20f).left();
}else{
b.add(new ItemDisplay(stack.item, stack.amount, timePeriod, true)).pad(20f).left();
}
if(items.length > 1) b.row();
}
b.table(bt -> {
bt.right().defaults().padRight(3).left();
if(rangeBoost != 0) bt.add("[lightgray]+[stat]" + Strings.autoFixed(rangeBoost / tilesize, 2) + "[lightgray] " + StatUnit.blocks.localized()).row();
if(speedBoost != 0) bt.add("[lightgray]" + unit.replace("{0}", "[stat]" + Strings.autoFixed(speedBoost, 2) + "[lightgray]"));
}).right().grow().pad(10f).padRight(15f);
}).growX().pad(5).padBottom(-5).row();
}
}).growX().colspan(table.getColumns());
table.row();
};
}
@@ -468,4 +532,4 @@ public class StatValues{
private static TextureRegion icon(UnlockableContent t){
return t.uiIcon;
}
}
}