490 lines
14 KiB
Java
490 lines
14 KiB
Java
|
package com.droidquest.items;
|
||
|
|
||
|
import java.awt.Color;
|
||
|
import java.awt.Dimension;
|
||
|
import java.awt.Graphics;
|
||
|
import java.awt.Graphics2D;
|
||
|
import java.awt.Rectangle;
|
||
|
import java.awt.image.BufferedImage;
|
||
|
|
||
|
import javax.swing.ImageIcon;
|
||
|
|
||
|
import com.droidquest.Room;
|
||
|
import com.droidquest.chipstuff.Port;
|
||
|
import com.droidquest.decorations.Spark;
|
||
|
import com.droidquest.devices.Device;
|
||
|
import com.droidquest.levels.Level;
|
||
|
import com.droidquest.materials.BatteryIn;
|
||
|
import com.droidquest.materials.BatteryOut;
|
||
|
import com.droidquest.materials.Material;
|
||
|
import com.droidquest.materials.PeriscopeDown;
|
||
|
import com.droidquest.materials.PeriscopeUp;
|
||
|
|
||
|
public class GenericRobot extends Item
|
||
|
{
|
||
|
public Device devices[] = new Device[10];
|
||
|
public boolean topBumper;
|
||
|
public boolean bottomBumper;
|
||
|
public boolean leftBumper;
|
||
|
public boolean rightBumper;
|
||
|
public boolean thrusterPower;
|
||
|
public boolean topThruster;
|
||
|
public boolean bottomThruster;
|
||
|
public boolean leftThruster;
|
||
|
public boolean rightThruster;
|
||
|
public boolean antenna;
|
||
|
public boolean broadcasting;
|
||
|
public int grabber; // use Port.ROT_ for rotations.
|
||
|
Color color;
|
||
|
public boolean periscope;
|
||
|
public int periscopeAnimation;
|
||
|
transient public boolean oldTopBumper;
|
||
|
transient public boolean oldBottomBumper;
|
||
|
transient public boolean oldLeftBumper;
|
||
|
transient public boolean oldRightBumper;
|
||
|
transient ImageIcon images[];
|
||
|
|
||
|
public GenericRobot(int X, int Y, Room r, Color c)
|
||
|
{
|
||
|
x=X; y=Y; room=r;
|
||
|
grabber = 1;
|
||
|
charge=100000;
|
||
|
color = c;
|
||
|
// orgX = 32; orgY = 24;
|
||
|
orgX = 14; orgY = 24;
|
||
|
// orgX = 14; orgY = 0;
|
||
|
width = 56; height = 42;
|
||
|
|
||
|
|
||
|
InternalRoom = new Room();
|
||
|
int[][] table = {
|
||
|
{0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0},
|
||
|
{0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0},
|
||
|
{0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
||
|
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
|
||
|
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
|
||
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||
|
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||
|
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
|
||
|
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1},
|
||
|
{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
|
||
|
{0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0},
|
||
|
{0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0}
|
||
|
};
|
||
|
InternalRoom.RoomArray = table;
|
||
|
|
||
|
Material mat1 = Material.FindSimiliar(new Material(color, false, true));
|
||
|
int mat1Index = level.materials.indexOf(mat1);
|
||
|
Material perUp = Material.FindSimiliar(new PeriscopeUp());
|
||
|
int perUpIndex = level.materials.indexOf(perUp);
|
||
|
Material perDown = Material.FindSimiliar(new PeriscopeDown());
|
||
|
int perDownIndex = level.materials.indexOf(perDown);
|
||
|
Material battIn = Material.FindSimiliar(new BatteryIn());
|
||
|
int battInIndex = level.materials.indexOf(battIn);
|
||
|
Material battOut = Material.FindSimiliar(new BatteryOut());
|
||
|
int battOutIndex = level.materials.indexOf(battOut);
|
||
|
((BatteryIn)battIn).robot = this;
|
||
|
((BatteryOut)battOut).robot = this;
|
||
|
|
||
|
for (int rY=0; rY<12; rY++)
|
||
|
for (int rX=0; rX<20; rX++)
|
||
|
if (InternalRoom.RoomArray[rY][rX]==1) InternalRoom.RoomArray[rY][rX] = mat1Index;
|
||
|
InternalRoom.RoomArray[2][17] = perUpIndex;
|
||
|
InternalRoom.RoomArray[2][16] = perDownIndex;
|
||
|
InternalRoom.RoomArray[3][17] = perDownIndex;
|
||
|
InternalRoom.RoomArray[9][2] = battOutIndex;
|
||
|
InternalRoom.RoomArray[9][3] = battInIndex;
|
||
|
InternalRoom.portalItem = this;
|
||
|
level.rooms.addElement(InternalRoom);
|
||
|
InternalRoom.upRoom = null;
|
||
|
InternalRoom.downRoom = null;
|
||
|
InternalRoom.leftRoom = null;
|
||
|
InternalRoom.rightRoom = null;
|
||
|
// leftPortal = new Rectangle (-14,0,8,10);
|
||
|
// rightPortal = new Rectangle (36,0,8,10);
|
||
|
// upPortal = new Rectangle (12,-18,12,8);
|
||
|
// downPortal = new Rectangle (10,24,12,8);
|
||
|
//
|
||
|
leftPortal = new Rectangle (-28,0,8,14);
|
||
|
rightPortal = new Rectangle (50,0,8,14);
|
||
|
upPortal = new Rectangle (10,-30,12,18);
|
||
|
downPortal = new Rectangle (10,24,12,18);
|
||
|
|
||
|
level.items.addElement(new PowerSwitch(17*28-4,9*32-4,InternalRoom));
|
||
|
|
||
|
GenerateIcons();
|
||
|
Animate();
|
||
|
}
|
||
|
|
||
|
public void GenerateIcons()
|
||
|
{
|
||
|
// orgX = 14; orgY = 24;
|
||
|
// width = 56; height = 42;
|
||
|
orgX = 14; orgY = 24;
|
||
|
width = 56; height = 44;
|
||
|
icons = new ImageIcon[1];
|
||
|
// icons[0]= new ImageIcon(new BufferedImage(122,92,BufferedImage.TYPE_4BYTE_ABGR));
|
||
|
icons[0]= new ImageIcon(new BufferedImage(84,84,BufferedImage.TYPE_4BYTE_ABGR));
|
||
|
currentIcon = icons[0].getImage();
|
||
|
((BatteryIn)level.materials.elementAt(InternalRoom.RoomArray[9][3])).robot = this;
|
||
|
((BatteryOut)level.materials.elementAt(InternalRoom.RoomArray[9][2])).robot = this;
|
||
|
images = new ImageIcon[10];
|
||
|
for (int a=0; a<10; a++)
|
||
|
{
|
||
|
// images[a] = new ImageIcon( new BufferedImage(122,92,BufferedImage.TYPE_4BYTE_ABGR));
|
||
|
images[a] = new ImageIcon( new BufferedImage(84,84,BufferedImage.TYPE_4BYTE_ABGR));
|
||
|
Graphics g;
|
||
|
try
|
||
|
{
|
||
|
g = images[a].getImage().getGraphics();
|
||
|
}
|
||
|
catch (NullPointerException e)
|
||
|
{
|
||
|
System.out.println("Could not get Graphics pointer to " + getClass() + "Image");
|
||
|
return;
|
||
|
}
|
||
|
Graphics2D g2 = (Graphics2D) g;
|
||
|
Color transparent = new Color(0,0,0,0);
|
||
|
g2.setBackground(transparent);
|
||
|
// g2.clearRect(0,0,122,92);
|
||
|
g2.clearRect(0,0,84,84);
|
||
|
|
||
|
switch (a)
|
||
|
{
|
||
|
case 0: // Robot Body
|
||
|
{
|
||
|
g.setColor(color);
|
||
|
int X=orgX+18;
|
||
|
int Y=orgY+6;
|
||
|
g.fillRect(X, Y, 22,32);
|
||
|
g.fillRect(X-4, Y+2, 30,28);
|
||
|
g.fillRect(X-8, Y+4, 38,24);
|
||
|
g.fillRect(X-12, Y+6, 46,20);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 1: // Grabber Up
|
||
|
g.setColor(Color.white);
|
||
|
{
|
||
|
int X=orgX+40;
|
||
|
int Y=orgY-16;
|
||
|
g.fillRect(X+0,Y+20,20,4);
|
||
|
g.fillRect(X+16,Y+16,4,8);
|
||
|
g.fillRect(X+12,Y+10,4,8);
|
||
|
g.fillRect(X+20,Y+10,4,8);
|
||
|
g.fillRect(X+12,Y+12,12,2);
|
||
|
g.fillRect(X+8,Y+2,4,10);
|
||
|
g.fillRect(X+24,Y+2,4,10);
|
||
|
g.fillRect(X+12,Y+0,4,4);
|
||
|
g.fillRect(X+20,Y+0,4,4);
|
||
|
break;
|
||
|
}
|
||
|
case 2: // Grabber Right
|
||
|
g.setColor(Color.white);
|
||
|
{
|
||
|
int X=orgX+46;
|
||
|
int Y=orgY+34;
|
||
|
g.fillRect(X+0,Y+0,4,10);
|
||
|
g.fillRect(X+0,Y+4,12,2);
|
||
|
g.fillRect(X+0,Y+8,12,2);
|
||
|
g.fillRect(X+8,Y+2,4,10);
|
||
|
g.fillRect(X+12,Y+0,4,4);
|
||
|
g.fillRect(X+12,Y+10,4,4);
|
||
|
g.fillRect(X+12,Y+0,12,2);
|
||
|
g.fillRect(X+12,Y+12,12,2);
|
||
|
g.fillRect(X+16,Y+0,4,4);
|
||
|
g.fillRect(X+16,Y+10,4,4);
|
||
|
g.fillRect(X+20,Y+2,4,4);
|
||
|
g.fillRect(X+20,Y+8,4,4);
|
||
|
}
|
||
|
break;
|
||
|
case 3: // Grabber Down
|
||
|
g.setColor(Color.white);
|
||
|
{
|
||
|
int X=orgX-10;
|
||
|
int Y=orgY+32;
|
||
|
g.fillRect(X+8,Y+0,12,4);
|
||
|
g.fillRect(X+8,Y+0,4,10);
|
||
|
g.fillRect(X+4,Y+8,4,8);
|
||
|
g.fillRect(X+12,Y+8,4,8);
|
||
|
g.fillRect(X+4,Y+12,12,2);
|
||
|
g.fillRect(X+0,Y+14,4,10);
|
||
|
g.fillRect(X+16,Y+14,4,10);
|
||
|
g.fillRect(X+4,Y+22,4,4);
|
||
|
g.fillRect(X+12,Y+22,4,4);
|
||
|
}
|
||
|
break;
|
||
|
case 4: // Grabber Left
|
||
|
g.setColor(Color.white);
|
||
|
{
|
||
|
int X=orgX-16;
|
||
|
int Y=orgY-6;
|
||
|
g.fillRect(X+24,Y+4,4,10);
|
||
|
g.fillRect(X+16,Y+4,12,2);
|
||
|
g.fillRect(X+16,Y+8,12,2);
|
||
|
g.fillRect(X+16,Y+2,4,10);
|
||
|
g.fillRect(X+12,Y+0,4,4);
|
||
|
g.fillRect(X+12,Y+10,4,4);
|
||
|
g.fillRect(X+4,Y+0,12,2);
|
||
|
g.fillRect(X+4,Y+12,12,2);
|
||
|
g.fillRect(X+4,Y+0,4,4);
|
||
|
g.fillRect(X+4,Y+10,4,4);
|
||
|
g.fillRect(X+0,Y+2,4,4);
|
||
|
g.fillRect(X+0,Y+8,4,4);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case 5: // Antenna Off
|
||
|
{
|
||
|
int X=orgX+14;
|
||
|
int Y=orgY-18;
|
||
|
g.setColor(Color.white);
|
||
|
g.fillRect(X,Y,12,6);
|
||
|
g.fillRect(X+4,Y+6,4,16);
|
||
|
}
|
||
|
break;
|
||
|
case 6: // Antenna On
|
||
|
{
|
||
|
int X=orgX+14;
|
||
|
int Y=orgY-18;
|
||
|
g.setColor(new Color(255,128,0));
|
||
|
g.fillRect(X,Y,12,6);
|
||
|
g.fillRect(X+4,Y+6,4,16);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 7: // Periscope Left
|
||
|
{
|
||
|
int X = orgX+40;
|
||
|
int Y = orgY+5;
|
||
|
g.fillRect(X-10,Y-24,6,14);
|
||
|
g.fillRect(X-6,Y-22,12,10);
|
||
|
g.fillRect(X+6,Y-20,4,6);
|
||
|
g.fillRect(X+2,Y-12,4,18);
|
||
|
}
|
||
|
break;
|
||
|
case 8: // Periscope Straight
|
||
|
{
|
||
|
int X = orgX+40;
|
||
|
int Y = orgY+5;
|
||
|
g.fillRect(X-2,Y-24,12,2);
|
||
|
g.fillRect(X-2,Y-14,12,2);
|
||
|
g.fillRect(X-6,Y-22,4,2);
|
||
|
g.fillRect(X-6,Y-16,4,2);
|
||
|
g.fillRect(X+10,Y-22,4,2);
|
||
|
g.fillRect(X+10,Y-16,4,2);
|
||
|
g.fillRect(X-10,Y-20,4,4);
|
||
|
g.fillRect(X+2,Y-20,4,4);
|
||
|
g.fillRect(X+14,Y-20,4,4);
|
||
|
g.fillRect(X+2,Y-12,4,18);
|
||
|
}
|
||
|
break;
|
||
|
case 9: // Periscope Right
|
||
|
{
|
||
|
int X = orgX+40;
|
||
|
int Y = orgY+5;
|
||
|
g.fillRect(X+14,Y-24,6,14);
|
||
|
g.fillRect(X+2,Y-22,12,10);
|
||
|
g.fillRect(X-2,Y-20,4,6);
|
||
|
g.fillRect(X+2,Y-12,4,18);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Animate()
|
||
|
{
|
||
|
// Do Thrusting
|
||
|
if (charge>0 && level.electricity && (carriedBy == null) && thrusterPower)
|
||
|
{
|
||
|
if (topThruster)
|
||
|
MoveDown(8);
|
||
|
if (rightThruster)
|
||
|
MoveLeft(8);
|
||
|
if (bottomThruster)
|
||
|
MoveUp(8);
|
||
|
if (leftThruster)
|
||
|
MoveRight(8);
|
||
|
}
|
||
|
|
||
|
if (charge>0 && level.electricity && thrusterPower)
|
||
|
{
|
||
|
Dimension d = GetXY();
|
||
|
int X = d.width;
|
||
|
int Y = d.height;
|
||
|
if (topThruster)
|
||
|
{
|
||
|
level.sparks.addElement(new Spark(X-orgX+32+level.random.nextInt(24),Y-orgY+24,0,-4,room));
|
||
|
level.sparks.addElement(new Spark(X-orgX+32+level.random.nextInt(24),Y-orgY+24,0,-4,room));
|
||
|
charge-=2;
|
||
|
}
|
||
|
if (rightThruster)
|
||
|
{
|
||
|
level.sparks.addElement(new Spark(X-orgX+74,Y-orgY+36+level.random.nextInt(20),4,0,room));
|
||
|
level.sparks.addElement(new Spark(X-orgX+74,Y-orgY+36+level.random.nextInt(20),4,0,room));
|
||
|
charge-=2;
|
||
|
}
|
||
|
if (bottomThruster)
|
||
|
{
|
||
|
level.sparks.addElement(new Spark(X-orgX+32+level.random.nextInt(24),Y-orgY+64,0,4,room));
|
||
|
level.sparks.addElement(new Spark(X-orgX+32+level.random.nextInt(24),Y-orgY+64,0,4,room));
|
||
|
charge-=2;
|
||
|
}
|
||
|
if (leftThruster)
|
||
|
{
|
||
|
level.sparks.addElement(new Spark(X-orgX+14,Y-orgY+36+level.random.nextInt(20),-4,0,room));
|
||
|
level.sparks.addElement(new Spark(X-orgX+14,Y-orgY+36+level.random.nextInt(20),-4,0,room));
|
||
|
charge-=2;
|
||
|
}
|
||
|
charge--;
|
||
|
if (charge<0) charge=0;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Draw Antenna sparks around Broadcasting Antenna
|
||
|
if (broadcasting && level.electricity)
|
||
|
{
|
||
|
Dimension d = GetXY();
|
||
|
level.sparks.addElement(new Spark(d.width-orgX+34,d.height-orgY+10,
|
||
|
level.random.nextInt(9)-4,
|
||
|
level.random.nextInt(9)-4,
|
||
|
room));
|
||
|
}
|
||
|
|
||
|
// Make sounds
|
||
|
if (topBumper)
|
||
|
if (oldTopBumper != topBumper)
|
||
|
level.PlaySound(room, Level.BUMPSOUND);
|
||
|
if (bottomBumper)
|
||
|
if (oldBottomBumper != bottomBumper)
|
||
|
level.PlaySound(room, Level.BUMPSOUND);
|
||
|
if (rightBumper)
|
||
|
if (oldRightBumper != rightBumper)
|
||
|
level.PlaySound(room, Level.BUMPSOUND);
|
||
|
if (leftBumper)
|
||
|
if (oldLeftBumper != leftBumper)
|
||
|
level.PlaySound(room, Level.BUMPSOUND);
|
||
|
if (broadcasting && level.electricity)
|
||
|
level.PlaySound(room, Level.BEEPSOUND);
|
||
|
oldTopBumper = topBumper;
|
||
|
oldBottomBumper = bottomBumper;
|
||
|
oldRightBumper = rightBumper;
|
||
|
oldLeftBumper = leftBumper;
|
||
|
|
||
|
}
|
||
|
|
||
|
public void Decorate()
|
||
|
{
|
||
|
// Paint background
|
||
|
Graphics g;
|
||
|
try
|
||
|
{
|
||
|
g = icons[0].getImage().getGraphics();
|
||
|
}
|
||
|
catch (NullPointerException e)
|
||
|
{
|
||
|
System.out.println("Could not get Graphics pointer to " + getClass() + "Image");
|
||
|
return;
|
||
|
}
|
||
|
Graphics2D g2 = (Graphics2D) g;
|
||
|
Color transparent = new Color(0,0,0,0);
|
||
|
g2.setBackground(transparent);
|
||
|
g2.clearRect(0,0,123,92);
|
||
|
|
||
|
// Paint Robot Body
|
||
|
g.drawImage(images[0].getImage(), 0, 0, level);
|
||
|
|
||
|
// Draw Bumpers
|
||
|
if (topBumper)
|
||
|
g.setColor(new Color(255,128,0));
|
||
|
else
|
||
|
g.setColor(Color.white);
|
||
|
g.fillRect(32,24,22,2);
|
||
|
|
||
|
if (bottomBumper)
|
||
|
g.setColor(new Color(255,128,0));
|
||
|
else
|
||
|
g.setColor(Color.white);
|
||
|
g.fillRect(32,66,22,2);
|
||
|
|
||
|
if (leftBumper)
|
||
|
g.setColor(new Color(255,128,0));
|
||
|
else
|
||
|
g.setColor(Color.white);
|
||
|
g.fillRect(12,36,4,20);
|
||
|
|
||
|
if (rightBumper)
|
||
|
g.setColor(new Color(255,128,0));
|
||
|
else
|
||
|
g.setColor(Color.white);
|
||
|
g.fillRect(70,36,4,20);
|
||
|
|
||
|
// Draw Antenna
|
||
|
if (antenna)
|
||
|
g.drawImage(images[6].getImage(), 0, 0, level);
|
||
|
else
|
||
|
g.drawImage(images[5].getImage(), 0, 0, level);
|
||
|
|
||
|
// Draw Grabber
|
||
|
g.setColor(Color.white);
|
||
|
switch (grabber)
|
||
|
{
|
||
|
case Port.ROT_UP:
|
||
|
g.drawImage(images[1].getImage(), 0, 0, level);
|
||
|
break;
|
||
|
case Port.ROT_RIGHT:
|
||
|
g.drawImage(images[2].getImage(), 0, 0, level);
|
||
|
break;
|
||
|
case Port.ROT_DOWN:
|
||
|
g.drawImage(images[3].getImage(), 0, 0, level);
|
||
|
break;
|
||
|
case Port.ROT_LEFT:
|
||
|
g.drawImage(images[4].getImage(), 0, 0, level);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Draw Periscope
|
||
|
// if (periscope)
|
||
|
if (level.currentViewer == this)
|
||
|
{
|
||
|
periscopeAnimation ++;
|
||
|
if (periscopeAnimation == 32) periscopeAnimation =0;
|
||
|
if (periscopeAnimation <8)
|
||
|
g.drawImage(images[7].getImage(), 0, 0, level);
|
||
|
if ((periscopeAnimation >=8 && periscopeAnimation <16)
|
||
|
|| periscopeAnimation >=24)
|
||
|
g.drawImage(images[8].getImage(), 0, 0, level);
|
||
|
if (periscopeAnimation >=16 && periscopeAnimation <24)
|
||
|
g.drawImage(images[9].getImage(), 0, 0, level);
|
||
|
}
|
||
|
|
||
|
// g.setColor(Color.magenta);
|
||
|
// g.drawRect(orgX+leftPortal.x, orgY+leftPortal.y,
|
||
|
// leftPortal.width+28, leftPortal.height+32);
|
||
|
// g.drawRect(orgX+rightPortal.x, orgY+rightPortal.y,
|
||
|
// rightPortal.width+28, rightPortal.height+32);
|
||
|
// g.drawRect(orgX+upPortal.x, orgY+upPortal.y,
|
||
|
// upPortal.width+28, upPortal.height+32);
|
||
|
// g.drawRect(orgX+downPortal.x, orgY+downPortal.y,
|
||
|
// downPortal.width+28, downPortal.height+32);
|
||
|
|
||
|
}
|
||
|
|
||
|
public boolean CanBePickedUp(Item item)
|
||
|
{
|
||
|
if (item.getClass().toString().endsWith("Robot"))
|
||
|
return false;
|
||
|
else
|
||
|
return super.CanBePickedUp(item);
|
||
|
}
|
||
|
|
||
|
public void Erase()
|
||
|
{
|
||
|
super.Erase();
|
||
|
devices = null;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|