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

mmb.content.ppipe.PlayerPipeShunt 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<

There is a newer version: 0.6
Show newest version
/**
 * 
 */
package mmb.content.ppipe;

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

import mmb.NN;
import mmb.engine.block.BlockEntry;
import mmb.engine.block.BlockType;
import mmb.engine.rotate.ChirotatedImageGroup;
import mmb.engine.rotate.Side;
import mmb.engine.worlds.MapProxy;
import mmb.engine.worlds.world.WorldUtils;

/**
 * @author oskar
 *
 */
public class PlayerPipeShunt extends AbstractPlayerPipe {
	//Constructors
	/**
	 * Creates a player pipe which combines two pipes into one. It has connections (R → D of length 0.8) and ({@code mainDir} → D of length {@code mainLen})
	 * @param mainLen length of main branch
	 * @param mainDir direction of main branch
	 * @param typ block type
	 */
	public PlayerPipeShunt(double mainLen, Side mainDir, BlockType typ) {
		type = typ;
		main = mainDir;
		tunnelM = new TunnelHelper(mainDir, Side.D);
		tunnelM.path.length = mainLen;
		tunnelS = new TunnelHelper(Side.R, Side.D);
		tunnelS.path.length = 0.8;
	}
	/*
	 * Chirotation: El
	 * Main side: U
	 * Down: FWD
	 */
	@Override
	protected void initConnections(int x, int y) {
		//Common
		Side dw = getChirotation().D();
		double oxc = dw.sideOffsetX;
		double oyc = dw.sideOffsetY;
		boolean dir = toggle ^ state;
		sides.set(Side.D, dir?tunnelM.BWD:tunnelS.BWD);
		
		//Main
		sides.set(main, tunnelM.FWD);
		Side art = getChirotation().apply(main);
		double oxm = art.sideOffsetX;
		double oym = art.sideOffsetY;
		tunnelM.path.beginX = oxm + x;
		tunnelM.path.beginY = oym + y;
		tunnelM.path.endX = oxc + x;
		tunnelM.path.endY = oyc + y;
		
		//Side
		sides.set(Side.R, tunnelS.FWD);
		Side rw = getChirotation().R();
		double oxs = rw.sideOffsetX;
		double oys = rw.sideOffsetY;
		tunnelS.path.beginX = oxs + x;
		tunnelS.path.beginY = oys + y;
		tunnelS.path.endX = oxc + x;
		tunnelS.path.endY = oyc + y;
	}
	
	//Contents
	private boolean toggle;
	/** @return the toggle */
	public boolean isToggle() {
		return toggle;
	}
	/**
	 * @param toggle the toggle to set
	 */
	public void setToggle(boolean toggle) {
		if(this.toggle == toggle) return;
		this.toggle = toggle;
		initConnections(posX(), posY());
	}
	
	private boolean state;
	
	@NN private final Side main;
	@NN protected final PipeTunnel tunnelM;
	@NN protected final PipeTunnel tunnelS; 
	
	//Block methods
	@NN private final BlockType type;
	@Override
	public BlockType type() {
		return type;
	}
	@NN private static final ChirotatedImageGroup img0 = ChirotatedImageGroup.create("machine/switch straight.png");
	@NN private static final ChirotatedImageGroup img1 = ChirotatedImageGroup.create("machine/switch turn.png");
	@Override
	public ChirotatedImageGroup getImage() {
		boolean dir = toggle ^ state;
		return dir?img0:img1;
	}
	@Override
	public BlockEntry blockCopy() {
		double mainLen = tunnelM.path.length;
		PlayerPipeShunt copy = new PlayerPipeShunt(mainLen, main, type);
		return copy;
	}
	@Override
	public void onTick(MapProxy map) {
		boolean oldState = state;
		state = WorldUtils.hasIncomingSignal(this);
		if(state != oldState) initConnections(posX(), posY());
	}
	
	//Serialization
	@Override
	protected void save1(ObjectNode node) {
		node.put("toggle", toggle);
	}
	@Override
	protected void load1(ObjectNode node) {
		JsonNode value = node.get("toggle");
		if(value != null) toggle = value.asBoolean();
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy