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

View File

@@ -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,22 +359,31 @@ 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){
//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;
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
sideHeat[Mathf.mod(relativeTo(build), 4)] += add;
heat += add;
}
//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;
}
//register traversed cycles
if(cameFrom != null){
cameFrom.add(build.id);
if(build instanceof HeatConductorBuild hc){
cameFrom.addAll(hc.cameFrom);
sideHeat[Mathf.mod(relativeTo(build), 4)] += add;
heat += add;
}
//register traversed cycles
if(cameFrom != null){
cameFrom.add(build.id);
if(build instanceof HeatConductorBuild hc){
cameFrom.addAll(hc.cameFrom);
}
}
}
}