Implementation of #7325

This commit is contained in:
Anuken 2022-10-04 12:06:00 -04:00
parent 12e5dbf287
commit be5eac5335
14 changed files with 67 additions and 22 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 756 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1605,6 +1605,7 @@ block.electric-heater.name = Electric Heater
block.slag-heater.name = Slag Heater block.slag-heater.name = Slag Heater
block.phase-heater.name = Phase Heater block.phase-heater.name = Phase Heater
block.heat-redirector.name = Heat Redirector block.heat-redirector.name = Heat Redirector
block.heat-router.name = Heat Router
block.slag-incinerator.name = Slag Incinerator block.slag-incinerator.name = Slag Incinerator
block.carbide-crucible.name = Carbide Crucible block.carbide-crucible.name = Carbide Crucible
block.slag-centrifuge.name = Slag Centrifuge block.slag-centrifuge.name = Slag Centrifuge
@ -1964,6 +1965,7 @@ block.electric-heater.description = Applies heat to structures. Requires large a
block.slag-heater.description = Applies heat to structures. Requires slag. block.slag-heater.description = Applies heat to structures. Requires slag.
block.phase-heater.description = Applies heat to structures. Requires phase fabric. block.phase-heater.description = Applies heat to structures. Requires phase fabric.
block.heat-redirector.description = Redirects accumulated heat to other blocks. block.heat-redirector.description = Redirects accumulated heat to other blocks.
block.heat-router.description = Spreads accumulated heat in three output directions.
block.electrolyzer.description = Converts water into hydrogen and ozone gas. Outputs resulting gases in two opposite directions, marked by corresponding colors. block.electrolyzer.description = Converts water into hydrogen and ozone gas. Outputs resulting gases in two opposite directions, marked by corresponding colors.
block.atmospheric-concentrator.description = Concentrates nitrogen from the atmosphere. Requires heat. block.atmospheric-concentrator.description = Concentrates nitrogen from the atmosphere. Requires heat.
block.surge-crucible.description = Forms surge alloy from slag and silicon. Requires heat. block.surge-crucible.description = Forms surge alloy from slag and silicon. Requires heat.

View File

@ -580,3 +580,4 @@
63103=neoplasia-reactor|block-neoplasia-reactor-ui 63103=neoplasia-reactor|block-neoplasia-reactor-ui
63102=sand-floor|block-sand-floor-ui 63102=sand-floor|block-sand-floor-ui
63101=crystalline-vent|block-crystalline-vent-ui 63101=crystalline-vent|block-crystalline-vent-ui
63100=heat-router|block-heat-router-ui

Binary file not shown.

View File

@ -153,6 +153,7 @@ public class RtsAI{
} }
Building defend = null; Building defend = null;
boolean defendingCore = false;
//there is something to defend, see if it's worth the time //there is something to defend, see if it's worth the time
if(damaged.size > 0){ if(damaged.size > 0){
@ -182,6 +183,10 @@ public class RtsAI{
if(debug){ if(debug){
Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), 8f, best.x, best.y); Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), 8f, best.x, best.y);
} }
if(best instanceof CoreBuild){
defendingCore = true;
}
} }
} }
@ -241,7 +246,9 @@ public class RtsAI{
} }
//assign a flag, so it will be "mobilized" more easily later //assign a flag, so it will be "mobilized" more easily later
unit.flag = 1; if(!defendingCore){
unit.flag = 1;
}
} }
} }
} }

View File

@ -73,7 +73,7 @@ public class Blocks{
melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge, melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge,
//crafting - erekir //crafting - erekir
siliconArcFurnace, electrolyzer, oxidationChamber, atmosphericConcentrator, electricHeater, slagHeater, phaseHeater, heatRedirector, slagIncinerator, siliconArcFurnace, electrolyzer, oxidationChamber, atmosphericConcentrator, electricHeater, slagHeater, phaseHeater, heatRedirector, heatRouter, slagIncinerator,
carbideCrucible, slagCentrifuge, surgeCrucible, cyanogenSynthesizer, phaseSynthesizer, heatReactor, carbideCrucible, slagCentrifuge, surgeCrucible, cyanogenSynthesizer, phaseSynthesizer, heatReactor,
//sandbox //sandbox
@ -1316,6 +1316,17 @@ public class Blocks{
regionRotated1 = 1; regionRotated1 = 1;
}}; }};
heatRouter = new HeatConductor("heat-router"){{
requirements(Category.crafting, with(Items.tungsten, 10, Items.graphite, 10));
researchCostMultiplier = 10f;
size = 3;
drawer = new DrawMulti(new DrawDefault(), new DrawHeatOutput(-1, false), new DrawHeatOutput(), new DrawHeatOutput(1, false), new DrawHeatInput("-heat"));
regionRotated1 = 1;
splitHeat = true;
}};
slagIncinerator = new ItemIncinerator("slag-incinerator"){{ slagIncinerator = new ItemIncinerator("slag-incinerator"){{
requirements(Category.crafting, with(Items.tungsten, 15)); requirements(Category.crafting, with(Items.tungsten, 15));
size = 1; size = 1;

View File

@ -220,6 +220,10 @@ public class ErekirTechTree{
}); });
}); });
}); });
node(heatRouter, () -> {
});
}); });
}); });
}); });

View File

@ -351,7 +351,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
return calculateHeat(sideHeat, null); return calculateHeat(sideHeat, null);
} }
//TODO can cameFrom be an IntSet?
public float calculateHeat(float[] sideHeat, @Nullable IntSet cameFrom){ public float calculateHeat(float[] sideHeat, @Nullable IntSet cameFrom){
Arrays.fill(sideHeat, 0f); Arrays.fill(sideHeat, 0f);
if(cameFrom != null) cameFrom.clear(); if(cameFrom != null) cameFrom.clear();
@ -360,22 +359,31 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
for(var edge : block.getEdges()){ for(var edge : block.getEdges()){
Building build = nearby(edge.x, edge.y); Building build = nearby(edge.x, edge.y);
if(build != null && build.team == team && build instanceof HeatBlock heater && (!build.block.rotate || (relativeTo(build) + 2) % 4 == build.rotation)){ //TODO hacky if(build != null && build.team == team && build instanceof HeatBlock heater){
//if there's a cycle, ignore its heat boolean split = build.block instanceof HeatConductor cond && cond.splitHeat;
if(!(build instanceof HeatConductorBuild hc && hc.cameFrom.contains(id()))){ // non-routers must face us, routers must face away - next to a redirector, they're forced to face away due to cycles anyway
//heat is distributed across building size if(!build.block.rotate || (!split && (relativeTo(build) + 2) % 4 == build.rotation) || (split && relativeTo(build) != build.rotation)){ //TODO hacky
float add = heater.heat() / build.block.size;
sideHeat[Mathf.mod(relativeTo(build), 4)] += add; //if there's a cycle, ignore its heat
heat += add; if(!(build instanceof HeatConductorBuild hc && hc.cameFrom.contains(id()))){
} //heat is distributed across building size
float add = heater.heat() / build.block.size;
if(split){
//heat routers split heat across 3 surfaces
add /= 3f;
}
//register traversed cycles sideHeat[Mathf.mod(relativeTo(build), 4)] += add;
if(cameFrom != null){ heat += add;
cameFrom.add(build.id); }
if(build instanceof HeatConductorBuild hc){
cameFrom.addAll(hc.cameFrom); //register traversed cycles
if(cameFrom != null){
cameFrom.add(build.id);
if(build instanceof HeatConductorBuild hc){
cameFrom.addAll(hc.cameFrom);
}
} }
} }
} }

View File

@ -14,6 +14,7 @@ import mindustry.world.draw.*;
public class HeatConductor extends Block{ public class HeatConductor extends Block{
public float visualMaxHeat = 15f; public float visualMaxHeat = 15f;
public DrawBlock drawer = new DrawDefault(); public DrawBlock drawer = new DrawDefault();
public boolean splitHeat = false;
public HeatConductor(String name){ public HeatConductor(String name){
super(name); super(name);
@ -90,7 +91,7 @@ public class HeatConductor extends Block{
@Override @Override
public float heatFrac(){ public float heatFrac(){
return heat / visualMaxHeat; return (heat / visualMaxHeat) / (splitHeat ? 3f : 1);
} }
} }
} }

View File

@ -17,17 +17,28 @@ public class DrawHeatOutput extends DrawBlock{
public Color heatColor = new Color(1f, 0.22f, 0.22f, 0.8f); public Color heatColor = new Color(1f, 0.22f, 0.22f, 0.8f);
public float heatPulse = 0.3f, heatPulseScl = 10f, glowMult = 1.2f; public float heatPulse = 0.3f, heatPulseScl = 10f, glowMult = 1.2f;
public int rotOffset = 0;
public boolean drawGlow = true;
public DrawHeatOutput(){}
public DrawHeatOutput(int rotOffset, boolean drawGlow){
this.rotOffset = rotOffset;
this.drawGlow = drawGlow;
}
@Override @Override
public void draw(Building build){ public void draw(Building build){
Draw.rect(build.rotation > 1 ? top2 : top1, build.x, build.y, build.rotdeg()); float rotdeg = (build.rotation + rotOffset) * 90;
Draw.rect(Mathf.mod((build.rotation + rotOffset), 4) > 1 ? top2 : top1, build.x, build.y, rotdeg);
if(build instanceof HeatBlock heater && heater.heat() > 0){ if(build instanceof HeatBlock heater && heater.heat() > 0){
Draw.z(Layer.blockAdditive); Draw.z(Layer.blockAdditive);
Draw.blend(Blending.additive); Draw.blend(Blending.additive);
Draw.color(heatColor, heater.heatFrac() * (heatColor.a * (1f - heatPulse + Mathf.absin(heatPulseScl, heatPulse)))); Draw.color(heatColor, heater.heatFrac() * (heatColor.a * (1f - heatPulse + Mathf.absin(heatPulseScl, heatPulse))));
if(heat.found()) Draw.rect(heat, build.x, build.y, build.rotdeg()); if(heat.found()) Draw.rect(heat, build.x, build.y, rotdeg);
Draw.color(Draw.getColor().mul(glowMult)); Draw.color(Draw.getColor().mul(glowMult));
if(glow.found()) Draw.rect(glow, build.x, build.y); if(drawGlow && glow.found()) Draw.rect(glow, build.x, build.y);
Draw.blend(); Draw.blend();
Draw.color(); Draw.color();
} }
@ -35,7 +46,7 @@ public class DrawHeatOutput extends DrawBlock{
@Override @Override
public void drawPlan(Block block, BuildPlan plan, Eachable<BuildPlan> list){ public void drawPlan(Block block, BuildPlan plan, Eachable<BuildPlan> list){
Draw.rect(plan.rotation > 1 ? top2 : top1, plan.drawx(), plan.drawy(), plan.rotation * 90); Draw.rect(Mathf.mod((plan.rotation + rotOffset), 4) > 1 ? top2 : top1, plan.drawx(), plan.drawy(), (plan.rotation + rotOffset) * 90);
} }
@Override @Override
@ -48,4 +59,4 @@ public class DrawHeatOutput extends DrawBlock{
//TODO currently no icons due to concerns with rotation //TODO currently no icons due to concerns with rotation
} }