WIP heat reactor system
This commit is contained in:
@@ -593,6 +593,17 @@ public class Block extends UnlockableContent{
|
||||
return (hasItems && itemCapacity > 0);
|
||||
}
|
||||
|
||||
/** sets {@param out} to the index-th side outside of this block, using the given rotation. */
|
||||
public void nearbySide(int x, int y, int rotation, int index, Point2 out){
|
||||
int cornerX = x - (size-1)/2, cornerY = y - (size-1)/2, s = size;
|
||||
switch(rotation){
|
||||
case 0 -> out.set(cornerX + s, cornerY + index);
|
||||
case 1 -> out.set(cornerX + index, cornerY + s);
|
||||
case 2 -> out.set(cornerX - 1, cornerY + index);
|
||||
case 3 -> out.set(cornerX + index, cornerY - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/** Iterate through ever grid position taken up by this block. */
|
||||
public void iterateTaken(int x, int y, Intc2 placer){
|
||||
if(isMultiblock()){
|
||||
|
||||
14
core/src/mindustry/world/blocks/heat/HeatBlock.java
Normal file
14
core/src/mindustry/world/blocks/heat/HeatBlock.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package mindustry.world.blocks.heat;
|
||||
|
||||
/** Basic interface for any block that produces or requires heat.*/
|
||||
public interface HeatBlock{
|
||||
float heat();
|
||||
|
||||
//potentially unnecessary
|
||||
/*
|
||||
void heat(float value);
|
||||
|
||||
default void addHeat(float amount){
|
||||
heat(heat() + amount);
|
||||
}*/
|
||||
}
|
||||
131
core/src/mindustry/world/blocks/heat/HeatProducer.java
Normal file
131
core/src/mindustry/world/blocks/heat/HeatProducer.java
Normal file
@@ -0,0 +1,131 @@
|
||||
package mindustry.world.blocks.heat;
|
||||
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.util.*;
|
||||
import arc.util.io.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.entities.units.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.logic.*;
|
||||
import mindustry.ui.*;
|
||||
import mindustry.world.*;
|
||||
import mindustry.world.blocks.power.NuclearReactor.*;
|
||||
import mindustry.world.meta.*;
|
||||
|
||||
public class HeatProducer extends Block{
|
||||
public float heatOutput = 10f;
|
||||
public float warmupRate = 0.25f;
|
||||
public float consumeTime = 100;
|
||||
|
||||
public @Load("@-heat") TextureRegion heatRegion;
|
||||
public @Load("@-glow") TextureRegion glowRegion;
|
||||
public @Load("@-top1") TextureRegion topRegion1;
|
||||
public @Load("@-top2") TextureRegion topRegion2;
|
||||
public Color heatColor = new Color(1f, 0.22f, 0.22f, 0.8f);
|
||||
public float heatPulse = 0.3f, heatPulseScl = 10f, glowMult = 1.2f;
|
||||
|
||||
public HeatProducer(String name){
|
||||
super(name);
|
||||
|
||||
update = solid = rotate = true;
|
||||
canOverdrive = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStats(){
|
||||
stats.timePeriod = consumeTime;
|
||||
super.setStats();
|
||||
stats.add(Stat.productionTime, consumeTime / 60f, StatUnit.seconds);
|
||||
//TODO heat prod stats
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBars(){
|
||||
super.setBars();
|
||||
|
||||
bars.add("heat", (NuclearReactorBuild entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.heat));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawRequestRegion(BuildPlan req, Eachable<BuildPlan> list){
|
||||
Draw.rect(region, req.drawx(), req.drawy());
|
||||
Draw.rect(req.rotation > 1 ? topRegion2 : topRegion1, req.drawx(), req.drawy(), req.rotation * 90);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public TextureRegion[] icons(){
|
||||
return new TextureRegion[]{region, topRegion1};
|
||||
}
|
||||
|
||||
public class HeatProducerBuild extends Building implements HeatBlock{
|
||||
public float heat;
|
||||
public float progress;
|
||||
|
||||
@Override
|
||||
public void updateTile(){
|
||||
if(consValid()){
|
||||
progress += getProgressIncrease(consumeTime);
|
||||
|
||||
if(progress >= 1f){
|
||||
consume();
|
||||
progress -= 1f;
|
||||
}
|
||||
}
|
||||
|
||||
//heat approaches target at the same speed regardless of efficiency
|
||||
heat = Mathf.approachDelta(heat, heatOutput * efficiency() * Mathf.num(consValid()), warmupRate * delta());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(){
|
||||
Draw.rect(region, x, y);
|
||||
|
||||
Draw.rect(rotation > 1 ? topRegion2 : topRegion1, x, y, rotdeg());
|
||||
|
||||
if(heat > 0){
|
||||
Draw.z(Layer.blockAdditive);
|
||||
Draw.blend(Blending.additive);
|
||||
Draw.color(heatColor, heat / heatOutput * (heatColor.a * (1f - heatPulse + Mathf.absin(heatPulseScl, heatPulse))));
|
||||
Draw.rect(heatRegion, x, y, rotdeg());
|
||||
Draw.color(Draw.getColor().mul(glowMult));
|
||||
Draw.rect(glowRegion, x, y);
|
||||
Draw.blend();
|
||||
Draw.color();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double sense(LAccess sensor){
|
||||
if(sensor == LAccess.progress) return Mathf.clamp(progress);
|
||||
return super.sense(sensor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldAmbientSound(){
|
||||
return cons.valid();
|
||||
}
|
||||
|
||||
@Override
|
||||
public float heat(){
|
||||
return heat;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(Writes write){
|
||||
super.write(write);
|
||||
write.f(progress);
|
||||
write.f(heat);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(Reads read, byte revision){
|
||||
super.read(read, revision);
|
||||
progress = read.f();
|
||||
heat = read.f();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -83,7 +83,7 @@ public class BeamDrill extends Block{
|
||||
int count = 0;
|
||||
|
||||
for(int i = 0; i < size; i++){
|
||||
getLaserPos(x, y, rotation, i, Tmp.p1);
|
||||
nearbySide(x, y, rotation, i, Tmp.p1);
|
||||
|
||||
int j = 0;
|
||||
Item found = null;
|
||||
@@ -139,7 +139,7 @@ public class BeamDrill extends Block{
|
||||
@Override
|
||||
public boolean canPlaceOn(Tile tile, Team team, int rotation){
|
||||
for(int i = 0; i < size; i++){
|
||||
getLaserPos(tile.x, tile.y, rotation, i, Tmp.p1);
|
||||
nearbySide(tile.x, tile.y, rotation, i, Tmp.p1);
|
||||
for(int j = 0; j < range; j++){
|
||||
Tile other = world.tile(Tmp.p1.x + Geometry.d4x(rotation)*j, Tmp.p1.y + Geometry.d4y(rotation)*j);
|
||||
if(other != null && other.solid()){
|
||||
@@ -155,16 +155,6 @@ public class BeamDrill extends Block{
|
||||
return false;
|
||||
}
|
||||
|
||||
void getLaserPos(int tx, int ty, int rotation, int i, Point2 out){
|
||||
int cornerX = tx - (size-1)/2, cornerY = ty - (size-1)/2, s = size;
|
||||
switch(rotation){
|
||||
case 0 -> out.set(cornerX + s, cornerY + i);
|
||||
case 1 -> out.set(cornerX + i, cornerY + s);
|
||||
case 2 -> out.set(cornerX - 1, cornerY + i);
|
||||
case 3 -> out.set(cornerX + i, cornerY - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public class BeamDrillBuild extends Building{
|
||||
public Tile[] facing = new Tile[size];
|
||||
public Point2[] lasers = new Point2[size];
|
||||
@@ -306,7 +296,7 @@ public class BeamDrill extends Block{
|
||||
void updateLasers(){
|
||||
for(int i = 0; i < size; i++){
|
||||
if(lasers[i] == null) lasers[i] = new Point2();
|
||||
getLaserPos(tileX(), tileY(), rotation, i, lasers[i]);
|
||||
nearbySide(tileX(), tileY(), rotation, i, lasers[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user