Large cliff crusher block / Erekir ammo tweaks / Android file chooser fixes

This commit is contained in:
Anuken
2025-01-07 20:35:35 -05:00
parent 6c1952c674
commit a84a99aed6
17 changed files with 178 additions and 19 deletions

View File

@@ -239,6 +239,8 @@ public class Turret extends ReloadTurret{
public float heatReq;
public float[] sideHeat = new float[4];
float lastRangeChange;
@Override
public float estimateDps(){
if(!hasAmmo()) return 0f;
@@ -316,6 +318,11 @@ public class Turret extends ReloadTurret{
};
}
@Override
public float fogRadius(){
return (range + (hasAmmo() ? peekAmmo().rangeChange : 0f)) / tilesize * fogRadiusMultiplier;
}
@Override
public float progress(){
return Mathf.clamp(reloadCounter / reload);
@@ -415,6 +422,14 @@ public class Turret extends ReloadTurret{
//turret always reloads regardless of whether it's targeting something
updateReload();
if(state.rules.fog){
float newRange = hasAmmo() ? peekAmmo().rangeChange : 0f;
if(newRange != lastRangeChange){
lastRangeChange = newRange;
fogControl.forceUpdate(team, this);
}
}
if(hasAmmo()){
if(Float.isNaN(reloadCounter)) reloadCounter = 0;

View File

@@ -17,6 +17,7 @@ import mindustry.graphics.*;
import mindustry.type.*;
import mindustry.ui.*;
import mindustry.world.*;
import mindustry.world.consumers.*;
import mindustry.world.meta.*;
import static mindustry.Vars.*;
@@ -30,6 +31,8 @@ public class WallCrafter extends Block{
/** Time to produce one item at 100% efficiency. */
public float drillTime = 150f;
/** How many times faster the drill will progress when boosted by liquid. */
public float liquidBoostIntensity = 1.6f;
/** Effect randomly played while drilling. */
public Effect updateEffect = Fx.mineWallSmall;
public float updateEffectChance = 0.02f;
@@ -39,6 +42,14 @@ public class WallCrafter extends Block{
public Item output = Items.sand;
public float boostItemUseTime = 120f;
/** How many times faster the drill will progress when boosted by items. Note: Using item and liquid boosters at once is not supported. */
public float itemBoostIntensity = 1.6f;
public @Nullable Consume itemConsumer;
public boolean hasLiquidBooster;
public final int timerUse = timers ++;
public WallCrafter(String name){
super(name);
@@ -67,6 +78,31 @@ public class WallCrafter extends Block{
stats.add(Stat.output, output);
stats.add(Stat.tiles, StatValues.blocks(attribute, floating, 1f, true, false));
stats.add(Stat.drillSpeed, 60f / drillTime * size, StatUnit.itemsSecond);
boolean consItems = itemConsumer != null;
if(consItems) stats.timePeriod = boostItemUseTime;
if(consItems && itemConsumer instanceof ConsumeItems coni){
stats.remove(Stat.booster);
stats.add(Stat.booster, StatValues.itemBoosters("{0}" + StatUnit.timesSpeed.localized(), stats.timePeriod, itemBoostIntensity, 0f, coni.items, i -> Structs.contains(coni.items, s -> s.item == i)));
}
if(liquidBoostIntensity != 1 && findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) instanceof ConsumeLiquidBase consBase){
stats.remove(Stat.booster);
stats.add(Stat.booster,
StatValues.speedBoosters("{0}" + StatUnit.timesSpeed.localized(),
consBase.amount,
liquidBoostIntensity, false, consBase::consumes)
);
}
}
@Override
public void init(){
super.init();
hasLiquidBooster = findConsumer(f -> f instanceof ConsumeLiquidBase && f.booster) != null;
}
@Override
@@ -151,6 +187,7 @@ public class WallCrafter extends Block{
super.updateTile();
boolean cons = shouldConsume();
boolean itemValid = itemConsumer != null && itemConsumer.efficiency(this) > 0;
warmup = Mathf.approachDelta(warmup, Mathf.num(efficiency > 0), 1f / 40f);
float dx = Geometry.d4x(rotation) * 0.5f, dy = Geometry.d4y(rotation) * 0.5f;
@@ -164,7 +201,11 @@ public class WallCrafter extends Block{
dest.block().mapColor
);
}
}, null);
}, null) * Mathf.lerp(1f, liquidBoostIntensity, hasLiquidBooster ? optionalEfficiency : 0f) * (itemValid ? itemBoostIntensity : 1f);
if(itemValid && eff * efficiency > 0 && timer(timerUse, boostItemUseTime)){
consume();
}
lastEfficiency = eff * timeScale * efficiency;
@@ -173,16 +214,16 @@ public class WallCrafter extends Block{
time %= drillTime;
}
totalTime += edelta() * warmup;
totalTime += edelta() * warmup * (eff <= 0f ? 0f : 1f);
if(timer(timerDump, dumpTime)){
dump();
dump(output);
}
}
@Override
public boolean shouldConsume(){
return items.total() < itemCapacity;
return items.get(output) < itemCapacity;
}
@Override

View File

@@ -50,4 +50,9 @@ public class ConsumeLiquid extends ConsumeLiquidBase{
public void display(Stats stats){
stats.add(booster ? Stat.booster : Stat.input, liquid, amount * 60f, true);
}
@Override
public boolean consumes(Liquid liquid){
return liquid == this.liquid;
}
}

View File

@@ -1,5 +1,6 @@
package mindustry.world.consumers;
import mindustry.type.*;
import mindustry.world.*;
public abstract class ConsumeLiquidBase extends Consume{
@@ -16,4 +17,6 @@ public abstract class ConsumeLiquidBase extends Consume{
public void apply(Block block){
block.hasLiquids = true;
}
public abstract boolean consumes(Liquid liquid);
}

View File

@@ -53,7 +53,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
if(ed <= 0.00000001f) return 0f;
return liq != null ? Math.min(build.liquids.get(liq) / (amount * ed * multiplier.get(build)), 1f) : 0f;
}
public @Nullable Liquid getConsumed(Building build){
if(filter.get(build.liquids.current()) && build.liquids.currentAmount() > 0){
return build.liquids.current();
@@ -74,4 +74,9 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{
public void display(Stats stats){
stats.add(booster ? Stat.booster : Stat.input, StatValues.liquids(filter, amount * 60f, true));
}
@Override
public boolean consumes(Liquid liquid){
return filter.get(liquid);
}
}