All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mmb.content.electric.machines.BlockGeneratorSolid Maven / Gradle / Ivy

Go to download

Dependency for the MultiMachineBuilder, a voxel game about building an industrial empire in a finite world. THIS RELEASE IS NOT PLAYABLE. To play the game, donwload from >ITCH.IO LINK HERE< or >GH releases link here<

The newest version!
/**
 * 
 */
package mmb.content.electric.machines;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.image.LookupOp;

import com.fasterxml.jackson.databind.node.ObjectNode;

import mmb.NN;
import mmb.Nil;
import mmb.cgui.BlockActivateListener;
import mmb.content.CraftingGroups;
import mmb.content.electric.Battery;
import mmb.content.electric.Electricity;
import mmb.content.electric.GUIGeneratorSolid;
import mmb.content.electric.VoltageTier;
import mmb.engine.block.BlockEntityRotary;
import mmb.engine.block.BlockEntry;
import mmb.engine.block.BlockType;
import mmb.engine.inv.Inventory;
import mmb.engine.inv.storage.SimpleInventory;
import mmb.engine.java2d.ColorMapper;
import mmb.engine.rotate.RotatedImageGroup;
import mmb.engine.rotate.Side;
import mmb.engine.texture.Textures;
import mmb.engine.worlds.MapProxy;
import mmb.engine.worlds.world.World;
import mmb.menu.world.window.WorldWindow;

/**
 * Burns solid fuels to generate electricity
 * @author oskar
 */
public class BlockGeneratorSolid extends BlockEntityRotary implements BlockActivateListener{
	//Standard generator definitions
	/** The texture for ULV furnace generator */
	@NN public static final BufferedImage img;
	@NN private static final RotatedImageGroup tex0;
	/** The texture for VLV furnace generator */
	@NN public static final BufferedImage img1;
	@NN private static final RotatedImageGroup tex1;
	/** The texture for LV furnace generator */
	@NN public static final BufferedImage img2;
	@NN private static final RotatedImageGroup tex2;
	
	//Turbogenerator definitions
	/** The texture foor VLV turbogenerator */
	@NN public static final BufferedImage turboimg;
	@NN private static final RotatedImageGroup turbotex0;
	/** The texture for LV turbogenerator */
	@NN public static final BufferedImage turboimg1;
	@NN private static final RotatedImageGroup turbotex1;
	/** The texture for MV turbogenerator*/
	@NN public static final BufferedImage turboimg2;
	@NN private static final RotatedImageGroup turbotex2;
	static {
		img = Textures.get("machine/coalgen.png");
		tex0 = RotatedImageGroup.create(img);
		ColorMapper mapper = ColorMapper.ofType(img.getType(), Color.RED, VoltageTier.V2.c);
		LookupOp op = new LookupOp(mapper, null);
		img1 = op.filter(img, null);
		tex1 = RotatedImageGroup.create(img1);
		mapper.setTo(VoltageTier.V3.c);
		img2 = op.filter(img, null);
		tex2 = RotatedImageGroup.create(img2);
		
		BufferedImage tmp = Textures.get("machine/turbogen.png");
		mapper.setTo(VoltageTier.V2.c);
		turboimg = op.filter(tmp, null);
		turbotex0 = RotatedImageGroup.create(turboimg);
		mapper.setTo(VoltageTier.V3.c);
		turboimg1 = op.filter(tmp, null);
		turbotex1 = RotatedImageGroup.create(turboimg1);
		mapper.setTo(VoltageTier.V4.c);
		turboimg2 = op.filter(tmp, null);
		turbotex2 = RotatedImageGroup.create(turboimg2);
	}
		
	//Block definition
	/** Voltage tier */
	@NN public final VoltageTier volt;
	@NN private final BlockType type;
	/** Fuel storage */
	@NN public final Battery fuel;
	/** Output buffer */
	@NN public final Battery buffer;
	/** Burn queue */
	@NN public final SimpleInventory inv = new SimpleInventory();
	@NN private final FuelBurner burner;
	/** 1-furnace generator, 2-turbogenerator */
	public final int mul;
	/**
	 * Creates a new furnace generator/turbogenerator
	 * @param mul 1-furnace generator, 2-turbogenerator
	 * @param volt voltage tier
	 * @param type block type
	 */
	public BlockGeneratorSolid(int mul, VoltageTier volt, BlockType type) {
		this.volt = volt;
		this.type = type;
		this.mul = mul;
		fuel = new Battery(Double.POSITIVE_INFINITY, 0, this, volt);
		fuel.pressureWt = 1;
		buffer = new Battery(200.0*mul, 0, this, volt);
		this.burner = new FuelBurner(1.5+volt.ordinal(), inv, fuel, CraftingGroups.furnaceFuels);
		resetBuffer();
	}

	//Inventory
	@Override
	public Inventory getInventory(Side s) {
		return inv.lockExtractions();
	}

	//Tick handler
	@Override
	public void onTick(MapProxy map) {
		burner.cycle();
		fuel.extractTo(buffer);
		Electricity.equatePPs(this, map, buffer, 0.999, -mul * volt.volts);
		Electricity to = getAtSide(getRotation().U()).getElectricalConnection(getRotation().D());
		if(to != null) buffer.extractTo(to);
		if(tab != null) tab.refresh();
	}
	
	//GUI
	GUIGeneratorSolid tab;
	@Override
	public void click(int blockX, int blockY, World map, @Nil WorldWindow window, double partX, double partY) {
		if(window == null) return;
		if(tab != null) return;
		tab = new GUIGeneratorSolid(window, this);
		window.openAndShowWindow(tab, type.title());
	}
	@SuppressWarnings("javadoc") //internal use only
	public void close(GUIGeneratorSolid tbb) {
		if(tab == tbb) tab = null;
	}

	//Block attributes
	@Override
	public BlockEntry blockCopy() {
		BlockGeneratorSolid copy = new BlockGeneratorSolid(mul, volt, type);
		copy.buffer.set(buffer);
		copy.fuel.set(fuel);
		copy.inv.set(inv);
		return copy;
	}
	@Override
	public RotatedImageGroup getImage() {
		if(mul == 2) {
			switch(volt) {
			case V2:
				return turbotex0;
			case V3:
				return turbotex1;
			case V4:
				return turbotex2;
			default:
				throw new IllegalStateException("Voltage "+volt.name+" is not supported by Turbo Generator");
			}
		}
		switch(volt) {
		case V1:
			return tex0;
		case V2:
			return tex1;
		case V3:
			return tex2;
		default:
			throw new IllegalStateException("Voltage "+volt.name+" is not supported by Furnace Generator");
		}
	}
	@Override
	public BlockType type() {
		return type;
	}

	//Electricity
	@Override
	public Electricity getElectricalConnection(Side s) {
		return Electricity.extractOnly(buffer);
	}
	
	//Serialization
	@Override
	protected void save1(ObjectNode node) {
		node.set("in", inv.save());
		node.set("energy", fuel.save());
		node.set("out", buffer.save());
	}
	@Override
	protected void load1(ObjectNode node) {
		inv.load(node.get("in"));
		fuel.load(node.get("energy"));
		buffer.load(node.get("out"));
		resetBuffer();
	}
	private void resetBuffer() {
		buffer.voltage = volt;
		buffer.maxPower = 50.0*mul;
		buffer.capacity = 10_000;
		buffer.pressureWt = buffer.maxPower * buffer.voltage.volts;
		fuel.voltage = volt;
		fuel.maxPower = Double.POSITIVE_INFINITY;
		fuel.capacity = 500_000;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy