2014-02-02 18:39:08 -03:00
|
|
|
package com.droidquest.devices;
|
|
|
|
|
2014-04-09 00:04:44 -03:00
|
|
|
import com.droidquest.chipstuff.Port;
|
|
|
|
import com.droidquest.items.Item;
|
|
|
|
import com.droidquest.items.ToolBox;
|
|
|
|
|
|
|
|
import javax.swing.*;
|
|
|
|
import java.awt.*;
|
2014-02-02 18:39:08 -03:00
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.ObjectInputStream;
|
|
|
|
import java.io.ObjectOutputStream;
|
|
|
|
|
2014-04-09 00:04:44 -03:00
|
|
|
public class Device extends Item {
|
|
|
|
// Base Class for the Logical Devices
|
|
|
|
|
|
|
|
transient Graphics g;
|
|
|
|
transient static Color transparent = new Color(0, 0, 0, 0);
|
|
|
|
public Port[] ports;
|
|
|
|
public int rotation; // 0=Up, 1=Right, 2=Down, 3=Left
|
|
|
|
// Reference to the toolbox means this device can be put inside the ToolBox
|
|
|
|
transient boolean goesInToolbox;
|
|
|
|
|
|
|
|
protected Device() {
|
|
|
|
// Constructor
|
|
|
|
rotation = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void writeRef(ObjectOutputStream s) throws IOException {
|
|
|
|
super.writeRef(s);
|
|
|
|
for (Port port : ports) {
|
|
|
|
port.writeRef(s);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void readRef(ObjectInputStream s) throws IOException {
|
|
|
|
super.readRef(s);
|
|
|
|
for (Port port : ports) {
|
|
|
|
port.readRef(s, level);
|
|
|
|
}
|
|
|
|
GenerateIcons();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void GenerateIcons() {
|
|
|
|
goesInToolbox = false;
|
|
|
|
if (ports != null) {
|
|
|
|
for (Port port : ports) {
|
|
|
|
port.myDevice = this;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
icons = new ImageIcon[2];
|
|
|
|
if (rotation % 2 == 0) {
|
|
|
|
icons[0] = new ImageIcon(new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR));
|
|
|
|
icons[1] = new ImageIcon(new BufferedImage(height, width, BufferedImage.TYPE_4BYTE_ABGR));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
icons[1] = new ImageIcon(new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR));
|
|
|
|
icons[0] = new ImageIcon(new BufferedImage(height, width, BufferedImage.TYPE_4BYTE_ABGR));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean Function() {
|
|
|
|
// Performs the function of the device, such as calculating the
|
|
|
|
// output based upon inputs, or handling external functions such as
|
|
|
|
// thrusting, touching walls, grabbing objects, antenna, etc...
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// Return False unless the device is a Node-like device and output
|
|
|
|
// has changed.
|
|
|
|
//
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Decorate() {
|
|
|
|
currentIcon = icons[rotation % 2].getImage();
|
|
|
|
try {
|
|
|
|
g = currentIcon.getGraphics();
|
|
|
|
}
|
|
|
|
catch (NullPointerException e) {
|
|
|
|
System.out.println("Could not get Graphics pointer to Device Image");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Graphics2D g2 = (Graphics2D) g;
|
|
|
|
g2.setBackground(transparent);
|
|
|
|
g2.clearRect(0, 0, width, height);
|
|
|
|
for (Port port : ports) {
|
|
|
|
port.Draw(g, rotation);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isDevice() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isNode() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void rotate(int dir) {
|
|
|
|
if (rotation == 0 && dir == -1) {
|
|
|
|
rotation = 3;
|
|
|
|
}
|
|
|
|
else if (rotation == 3 && dir == 1) {
|
|
|
|
rotation = 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rotation += dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
int oldW = width;
|
|
|
|
int oldH = height;
|
|
|
|
int temp = width;
|
|
|
|
width = height;
|
|
|
|
height = temp;
|
|
|
|
for (Port port : ports) {
|
|
|
|
int oldX = port.x * 2 + 1;
|
|
|
|
int oldY = port.y * 2 + 1;
|
|
|
|
temp = port.width;
|
|
|
|
port.width = port.height;
|
|
|
|
port.height = temp;
|
|
|
|
switch (dir) {
|
|
|
|
case 1: // Turn Right
|
|
|
|
oldX = oldX - oldW;
|
|
|
|
oldY = oldY - oldH;
|
|
|
|
port.x = (width - oldY) / 2;
|
|
|
|
port.y = (height + oldX) / 2;
|
|
|
|
break;
|
|
|
|
case -1: // Turn Left
|
|
|
|
oldX = oldX - oldW;
|
|
|
|
oldY = oldY - oldH;
|
|
|
|
port.x = (width + oldY) / 2;
|
|
|
|
port.y = (height - oldX) / 2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void IsDropped() {
|
|
|
|
super.IsDropped();
|
|
|
|
if (goesInToolbox) {
|
|
|
|
if (level.toolbox != null) {
|
|
|
|
if (((ToolBox) level.toolbox).open) {
|
|
|
|
if (Overlaps(level.toolbox)) {
|
|
|
|
// Remove all wires and delete device
|
|
|
|
for (Port port : ports) {
|
|
|
|
if (port.myWire != null) {
|
|
|
|
port.myWire.Remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
level.items.removeElement(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean CanBePickedUp(Item item) {
|
|
|
|
return !item.getClass().toString().endsWith("Robot") && super.CanBePickedUp(item);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Erase() {
|
|
|
|
super.Erase();
|
|
|
|
g = null;
|
|
|
|
for (Port port : ports) {
|
|
|
|
port.myDevice = null;
|
|
|
|
port.myWire = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void flip() {
|
2014-04-13 02:53:02 -03:00
|
|
|
// Just rotate twice to flip
|
|
|
|
rotate(1);
|
|
|
|
rotate(1);
|
2014-04-09 00:04:44 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
public Object clone() {
|
|
|
|
Device newDevice;
|
|
|
|
newDevice = (Device) super.clone();
|
|
|
|
newDevice.ports = null;
|
|
|
|
newDevice.GenerateIcons();
|
|
|
|
return newDevice;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2014-02-02 18:39:08 -03:00
|
|
|
|