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; } }