Made nuclear reactor functional, better multiblock support

This commit is contained in:
Anuken
2017-10-24 21:32:44 -04:00
parent 2447f240fa
commit 0d750b509f
9 changed files with 100 additions and 12 deletions

View File

@@ -67,6 +67,7 @@ import io.anuke.ucore.entities.Entity;
* Amount of tiles (int)
* (tile list)
* Tile position, as a single integer, in the format x+y*width
* Tile link - byte
* Tile type (boolean)- whether the block has a tile entity attached
* Block ID - the block ID
* (the following only applies to tile entity blocks)
@@ -81,7 +82,7 @@ import io.anuke.ucore.entities.Entity;
*/
public class SaveIO{
/**Save file version ID. Should be incremented every breaking release.*/
private static final int fileVersionID = 7;
private static final int fileVersionID = 8;
//TODO automatic registration of types?
private static final Array<Class<? extends Enemy>> enemyIDs = Array.with(
@@ -229,6 +230,7 @@ public class SaveIO{
if(tile.breakable()){
stream.writeInt(x + y*World.width()); //tile pos
stream.writeByte(tile.link);
stream.writeBoolean(tile.entity != null); //whether it has a tile entity
stream.writeInt(tile.block().id); //block ID
@@ -367,11 +369,13 @@ public class SaveIO{
for(int i = 0; i < tiles; i ++){
int pos = stream.readInt();
byte link = stream.readByte();
boolean hasEntity = stream.readBoolean();
int blockid = stream.readInt();
Tile tile = World.tile(pos % World.width(), pos / World.width());
tile.setBlock(Block.getByID(blockid));
tile.link = link;
if(hasEntity){
byte rotation = stream.readByte();

View File

@@ -70,7 +70,7 @@ public class Generator{
floor = Blocks.titanium;
}
if(Noise.nnoise(x + 99999, y + 99999, 6, 1) > 0.254){
if(Noise.nnoise(x + 99999, y + 99999, 6, 1) > 0.256){
floor = Blocks.uranium;
}
}

View File

@@ -16,7 +16,7 @@ public class Tile{
private Block block = Blocks.air;
/**The coordinates of the core tile this is linked to, in the form of two bytes packed into one.
* This is relative to the block it is linked to; negate coords to find the link.*/
private byte link = 0;
public byte link = 0;
public TileEntity entity;
public short x, y;
public byte rotation, dump;

View File

@@ -142,6 +142,7 @@ public class ProductionBlocks{
resource = Blocks.uranium;
result = Item.uranium;
formalName = "uranium drill";
time = 7;
}},
titaniumdrill = new Drill("titaniumdrill"){{
@@ -182,11 +183,15 @@ public class ProductionBlocks{
powerCapacity = 40f;
}
},
nuclearReactor = new LiquidPowerGenerator("nuclearreactor"){
nuclearReactor = new LiquidItemPowerGenerator("nuclearreactor"){
{
width = 2;
height = 2;
generateLiquid = Liquid.water;
generateItem = Item.uranium;
itemCapacity = 60;
itemInput = 6;
inputLiquid = 2f;
health = 340;
breaktime *= 2.2f;
powerCapacity = 100f;

View File

@@ -1,5 +1,6 @@
package io.anuke.mindustry.world.blocks.types;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
@@ -18,6 +19,16 @@ public class BlockPart extends Block implements PowerAcceptor, LiquidAcceptor{
public void draw(Tile tile){
//do nothing
}
@Override
public void handleItem(Tile tile, Item item, Tile source){
tile.getLinked().block().handleItem(tile.getLinked(), item, source);
}
@Override
public boolean acceptItem(Item item, Tile dest, Tile source){
return dest.getLinked().block().acceptItem(item, dest.getLinked(), source);
}
@Override
public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){

View File

@@ -5,6 +5,7 @@ import java.io.DataOutputStream;
import java.io.IOException;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.Bullet;
@@ -44,13 +45,16 @@ public class Turret extends Block{
@Override
public void draw(Tile tile){
Draw.rect("block", tile.worldx(), tile.worldy());
Vector2 offset = getPlaceOffset();
Draw.rect("block", tile.worldx() + offset.x, tile.worldy() + offset.y);
}
@Override
public void drawOver(Tile tile){
TurretEntity entity = tile.entity();
Draw.rect(name(), tile.worldx(), tile.worldy(), entity.rotation - 90);
Vector2 offset = getPlaceOffset();
Draw.rect(name(), tile.worldx() + offset.x, tile.worldy() + offset.y, entity.rotation - 90);
if(Vars.debug && drawDebug){
drawTargeting(tile);
@@ -59,8 +63,10 @@ public class Turret extends Block{
@Override
public void drawPixelOverlay(Tile tile){
Vector2 offset = getPlaceOffset();
Draw.color("green");
Draw.dashcircle(tile.worldx(), tile.worldy(), range);
Draw.dashcircle(tile.worldx() + offset.x, tile.worldy() + offset.y, range);
Draw.reset();
TurretEntity entity = tile.entity();
@@ -69,7 +75,7 @@ public class Turret extends Block{
if(fract > 0)
fract = Mathf.clamp(fract, 0.24f, 1f);
Vars.renderer.drawBar(Color.GREEN, tile.worldx(), tile.worldy() + 6, fract);
Vars.renderer.drawBar(Color.GREEN, tile.worldx() + offset.x, tile.worldy() + 6 + offset.y, fract);
}
@Override

View File

@@ -0,0 +1,57 @@
package io.anuke.mindustry.world.blocks.types.production;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.resource.Item;
import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
public class LiquidItemPowerGenerator extends LiquidPowerGenerator{
public Item generateItem;
public int itemInput = 5;
public int itemCapacity = 30;
public LiquidItemPowerGenerator(String name) {
super(name);
}
@Override
public void drawPixelOverlay(Tile tile){
super.drawPixelOverlay(tile);
TileEntity entity = tile.entity();
Vector2 offset = getPlaceOffset();
Vars.renderer.drawBar(Color.GREEN, tile.worldx() + offset.x, tile.worldy() + 6 +
offset.y + height*Vars.tilesize/2f, (float)entity.totalItems() / itemCapacity);
}
@Override
public void update(Tile tile){
LiquidPowerEntity entity = tile.entity();
if(entity.liquidAmount >= inputLiquid && entity.hasItem(generateItem, itemInput)
&& Timers.get(tile, "consume", generateTime)){
entity.liquidAmount -= inputLiquid;
entity.power += generatePower;
Vector2 offset = getPlaceOffset();
Effects.effect(generateEffect, tile.worldx() + offset.x, tile.worldy() + offset.y);
}
if(Timers.get(tile, "generate", generateTime)){
distributePower(tile);
}
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
return item == generateItem && tile.entity.totalItems() < itemCapacity;
}
}

View File

@@ -11,6 +11,7 @@ import io.anuke.mindustry.resource.Liquid;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.types.LiquidAcceptor;
import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Timers;
public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
@@ -19,8 +20,9 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
/**Power to generate per generateInput.*/
public float generatePower = 1f;
/**How much liquid to consume to get one generatePower.*/
public float generateInput = 1f;
public float inputLiquid = 1f;
public float liquidCapacity = 30f;
public String generateEffect = "generate";
public LiquidPowerGenerator(String name) {
super(name);
@@ -46,12 +48,15 @@ public class LiquidPowerGenerator extends Generator implements LiquidAcceptor{
public void update(Tile tile){
LiquidPowerEntity entity = tile.entity();
if(entity.liquidAmount >= generateInput && Timers.get(tile, "generate", generateTime)){
entity.liquidAmount -= generateInput;
if(entity.liquidAmount >= inputLiquid && Timers.get(tile, "consume", generateTime)){
entity.liquidAmount -= inputLiquid;
entity.power += generatePower;
Vector2 offset = getPlaceOffset();
Effects.effect(generateEffect, tile.worldx() + offset.x, tile.worldy() + offset.y);
}
if(Timers.get(tile, "generate", generateTime)){
if(Timers.get(tile, "consume", generateTime)){
distributePower(tile);
}
}