package com.droidquest.levels; import java.awt.Image; import java.awt.image.ImageObserver; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.HashMap; import java.util.Random; import java.util.Vector; import com.droidquest.Room; import com.droidquest.RoomDisplay; import com.droidquest.devices.SmallChip; import com.droidquest.SoundClip; import com.droidquest.Wire; import com.droidquest.chipstuff.Port; import com.droidquest.materials.Portal; import com.droidquest.devices.Device; import com.droidquest.items.Initializer; import com.droidquest.items.Item; import com.droidquest.items.ToolBox; import com.droidquest.materials.Material; public class Level implements ImageObserver, Serializable { public Item player; public Item gameCursor; public Item solderingPen; public Item remote; public Item toolbox; public Item currentViewer; public Item helpCam; public Item paintbrush; public transient Portal portal; public boolean electricity; public Vector rooms = new Vector(); public Vector materials = new Vector(); public Vector items = new Vector(); public Vector sparks = new Vector(); public transient RoomDisplay roomdisplay; public transient Vector invRooms = new Vector(); public transient Vector invRoomIndexes = new Vector(); public transient Vector invMaterials = new Vector(); public transient Vector invMaterialIndexes = new Vector(); public transient Vector invItems = new Vector(); public transient Vector invItemIndexes = new Vector(); public transient HashMap sounds = new HashMap(); public transient Random random = new Random(); public transient static String ATTACHSOUND = "attach.WAV"; public transient static String DETATCHSOUND = "detatch.WAV"; public transient static String PICKUPSOUND = "pickup2.WAV"; public transient static String DROPSOUND = "drop2.WAV"; public transient static String BEEPSOUND = "beep2.WAV"; public transient static String BUMPSOUND = "bump2.WAV"; public transient static String CHARGESOUND = "charge.WAV"; public transient static String DISCHARGESOUND = "discharge.WAV"; public transient static String BURNSOUND = "burn.WAV"; public transient static String ENDMUSICSOUND = "liberty.mid"; public transient static String STARTMUSICSOUND = "sp001.wav"; public transient static String TELEPORTSOUND = "teleport.WAV"; public transient static String TRANSPORTSOUND = "transport.WAV"; String[] soundFiles = { ATTACHSOUND, DETATCHSOUND, PICKUPSOUND, DROPSOUND, BEEPSOUND, BUMPSOUND, CHARGESOUND, DISCHARGESOUND, BURNSOUND, ENDMUSICSOUND, STARTMUSICSOUND, TELEPORTSOUND, TRANSPORTSOUND }; public transient boolean cheatmode = true; public Level() { Item.level = this; Room.level = this; Material.level = this; InitSounds(); } public Level(RoomDisplay rd) { roomdisplay = rd; Item.level = this; Room.level = this; Material.level = this; random.setSeed(System.currentTimeMillis()); InitSounds(); } public void LinkRoomsLeftRight(int L, int R) { ((Room) rooms.elementAt(L)).rightRoom = (Room) rooms.elementAt(R); ((Room) rooms.elementAt(R)).leftRoom = (Room) rooms.elementAt(L); } public void LinkRoomsUpDown(int U, int D) { ((Room) rooms.elementAt(U)).downRoom = (Room) rooms.elementAt(D); ((Room) rooms.elementAt(D)).upRoom = (Room) rooms.elementAt(U); } public void LinkRoomsHorizontally(int[] roomlist) { for (int a=0; a19 || y<0 || y>11) { Material mat = (Material) materials.elementAt(0); if (x<0) if (r.leftRoom != null) mat = (Material) materials.elementAt(r.leftRoom.RoomArray[y][x+20]); if (x>19) if (r.rightRoom != null) mat = (Material) materials.elementAt(r.rightRoom.RoomArray[y][x-20]); if (y<0) if (r.upRoom != null) mat = (Material) materials.elementAt(r.upRoom.RoomArray[y+12][x]); if (y>11) if (r.downRoom != null) mat = (Material) materials.elementAt(r.downRoom.RoomArray[y-12][x]); return mat; } else return (Material) materials.elementAt(r.RoomArray[y][x]); } public Item FindNearestItem(Item a) { Item nearest=null; int dx=100; int dy=100; int cxa=a.x+a.getWidth()/2; int cya=a.y+a.getHeight()/2; for (int i=0; i < items.size(); i++) { Item b = ((Item) items.elementAt(i)); if (a.Overlaps(b)) { int cxb=b.x+b.getWidth()/2; int cyb=b.y+b.getHeight()/2; int dx2=Math.abs(cxb-cxa); int dy2=Math.abs(cyb-cya); if ((dx2+dy2)<(dx+dy)) { nearest=b; dx=dx2; dy=dy2; } } } return nearest; } public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { // This does nothing, but allows Images to be drawn freely onto // other images. The only reason I have this function is so I have // an object that implements ImageObserver, which for some stupid // reason is a requirement for several Graphics methods. return false; } public void writeObject(ObjectOutputStream s) throws IOException { // Save Basic Room Data int a; s.writeInt(rooms.size()); for (a=0; a=items.size()) return null; return (Item) items.elementAt(itemIndex); } public Room FindRoom(int roomIndex) { if (roomIndex==-1) return null; if (roomIndex>=rooms.size()) return null; return (Room) rooms.elementAt(roomIndex); } public void Empty() { // This goes through the entire level structure and removes all // references to everything. int a,b; Room.level=null; Item.level=null; // Remove all Items for (a=0;a b) room.RoomArray[Y][X]-=1; } } b--; } } for (int a=orgNumItems; a