mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-02-13 12:16:53 +07:00
Implementation of #7325
This commit is contained in:
parent
12e5dbf287
commit
be5eac5335
BIN
core/assets-raw/sprites/blocks/production/heat-router-glow.png
Normal file
BIN
core/assets-raw/sprites/blocks/production/heat-router-glow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
BIN
core/assets-raw/sprites/blocks/production/heat-router-heat.png
Normal file
BIN
core/assets-raw/sprites/blocks/production/heat-router-heat.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
BIN
core/assets-raw/sprites/blocks/production/heat-router-top1.png
Normal file
BIN
core/assets-raw/sprites/blocks/production/heat-router-top1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 729 B |
BIN
core/assets-raw/sprites/blocks/production/heat-router-top2.png
Normal file
BIN
core/assets-raw/sprites/blocks/production/heat-router-top2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 756 B |
BIN
core/assets-raw/sprites/blocks/production/heat-router.png
Normal file
BIN
core/assets-raw/sprites/blocks/production/heat-router.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.7 KiB |
@ -1605,6 +1605,7 @@ block.electric-heater.name = Electric Heater
|
||||
block.slag-heater.name = Slag Heater
|
||||
block.phase-heater.name = Phase Heater
|
||||
block.heat-redirector.name = Heat Redirector
|
||||
block.heat-router.name = Heat Router
|
||||
block.slag-incinerator.name = Slag Incinerator
|
||||
block.carbide-crucible.name = Carbide Crucible
|
||||
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.phase-heater.description = Applies heat to structures. Requires phase fabric.
|
||||
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.atmospheric-concentrator.description = Concentrates nitrogen from the atmosphere. Requires heat.
|
||||
block.surge-crucible.description = Forms surge alloy from slag and silicon. Requires heat.
|
||||
|
@ -580,3 +580,4 @@
|
||||
63103=neoplasia-reactor|block-neoplasia-reactor-ui
|
||||
63102=sand-floor|block-sand-floor-ui
|
||||
63101=crystalline-vent|block-crystalline-vent-ui
|
||||
63100=heat-router|block-heat-router-ui
|
||||
|
Binary file not shown.
@ -153,6 +153,7 @@ public class RtsAI{
|
||||
}
|
||||
|
||||
Building defend = null;
|
||||
boolean defendingCore = false;
|
||||
|
||||
//there is something to defend, see if it's worth the time
|
||||
if(damaged.size > 0){
|
||||
@ -182,6 +183,10 @@ public class RtsAI{
|
||||
if(debug){
|
||||
Vars.ui.showLabel("Defend, dst = " + (int)(best.dst(ax, ay)), 8f, best.x, best.y);
|
||||
}
|
||||
|
||||
if(best instanceof CoreBuild){
|
||||
defendingCore = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -241,10 +246,12 @@ public class RtsAI{
|
||||
}
|
||||
|
||||
//assign a flag, so it will be "mobilized" more easily later
|
||||
if(!defendingCore){
|
||||
unit.flag = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return anyDefend;
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ public class Blocks{
|
||||
melter, separator, disassembler, sporePress, pulverizer, incinerator, coalCentrifuge,
|
||||
|
||||
//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,
|
||||
|
||||
//sandbox
|
||||
@ -1316,6 +1316,17 @@ public class Blocks{
|
||||
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"){{
|
||||
requirements(Category.crafting, with(Items.tungsten, 15));
|
||||
size = 1;
|
||||
|
@ -220,6 +220,10 @@ public class ErekirTechTree{
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
node(heatRouter, () -> {
|
||||
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -351,7 +351,6 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
return calculateHeat(sideHeat, null);
|
||||
}
|
||||
|
||||
//TODO can cameFrom be an IntSet?
|
||||
public float calculateHeat(float[] sideHeat, @Nullable IntSet cameFrom){
|
||||
Arrays.fill(sideHeat, 0f);
|
||||
if(cameFrom != null) cameFrom.clear();
|
||||
@ -360,12 +359,20 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
|
||||
for(var edge : block.getEdges()){
|
||||
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){
|
||||
|
||||
boolean split = build.block instanceof HeatConductor cond && cond.splitHeat;
|
||||
// non-routers must face us, routers must face away - next to a redirector, they're forced to face away due to cycles anyway
|
||||
if(!build.block.rotate || (!split && (relativeTo(build) + 2) % 4 == build.rotation) || (split && relativeTo(build) != build.rotation)){ //TODO hacky
|
||||
|
||||
//if there's a cycle, ignore its heat
|
||||
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;
|
||||
}
|
||||
|
||||
sideHeat[Mathf.mod(relativeTo(build), 4)] += add;
|
||||
heat += add;
|
||||
@ -380,6 +387,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return heat;
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@ import mindustry.world.draw.*;
|
||||
public class HeatConductor extends Block{
|
||||
public float visualMaxHeat = 15f;
|
||||
public DrawBlock drawer = new DrawDefault();
|
||||
public boolean splitHeat = false;
|
||||
|
||||
public HeatConductor(String name){
|
||||
super(name);
|
||||
@ -90,7 +91,7 @@ public class HeatConductor extends Block{
|
||||
|
||||
@Override
|
||||
public float heatFrac(){
|
||||
return heat / visualMaxHeat;
|
||||
return (heat / visualMaxHeat) / (splitHeat ? 3f : 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -17,17 +17,28 @@ public class DrawHeatOutput extends DrawBlock{
|
||||
public Color heatColor = new Color(1f, 0.22f, 0.22f, 0.8f);
|
||||
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
|
||||
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){
|
||||
Draw.z(Layer.blockAdditive);
|
||||
Draw.blend(Blending.additive);
|
||||
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));
|
||||
if(glow.found()) Draw.rect(glow, build.x, build.y);
|
||||
if(drawGlow && glow.found()) Draw.rect(glow, build.x, build.y);
|
||||
Draw.blend();
|
||||
Draw.color();
|
||||
}
|
||||
@ -35,7 +46,7 @@ public class DrawHeatOutput extends DrawBlock{
|
||||
|
||||
@Override
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user