import java.applet.Applet; import java.awt.*; import java.lang.*; import java.util.*; import Chat; import GameEngine; import Player; import Network; import SelectShip; import SendFrags; public class sfi extends Applet implements Runnable { public static final short SELECTSHIP = -2; public static final short LOGIN = -1; public static final short INCHAT = 0; public static final short WAIT = 2; public static final short PLAY = 1; private short state = SELECTSHIP; Image offscreenI; Graphics offscreenG; Thread runner; GameEngine game; Network net; SelectShip sShip; Chat bar; SendFrags netFrags; public String myShip = "ship2"; public String myMap = "map1"; private Color sColor[] = new Color[110]; private Image pannel; public int frags = 0; public Font font = new Font("Helvetica", Font.PLAIN, 12); FontMetrics fontSize = getFontMetrics(font); private Font sfont = new Font("Helvetica", Font.PLAIN, 10); private int slevel; private int wlevel; private int vlevel; public Player target; private String chatMessage[] = { "", "", "" }; private int TTL = 30; private boolean chat = false; private String myMessage = ""; public void init() { setLayout(null); this.requestFocus(); setShieldColors(); pannel = getImage(getCodeBase(), "gfx/pannel.gif"); sShip = new SelectShip(this); netFrags = new SendFrags(this); } public void init_startGame() { game = new GameEngine(myMap, toInt(this.getParameter("id")), myShip, this.getParameter("name"), this); setState(PLAY); bar = null; } private void init_network() { net = new Network(5000, this); } public void setState(short s) { state = s; } public boolean checkState(short s) { return (state == s); } public void setShip(String s) { myShip = s; setState(LOGIN); init_network(); sShip = null; System.gc(); } public void enterChat() { setState(INCHAT); bar = new Chat(this); net.sendMessage("@setmode|" + myShip); } public void joinChan(int id, String map) { net.sendMessage("@join|" + id); myMap = map; state = WAIT; } public void joinNewChan(int id, String title, String map) { net.sendMessage("@joinnew|" + id + "`" + title + "`" + map); net.sendMessage("@oneway"); net.sendMessage("@transid"); myMap = map; state = WAIT; } public void addList(int id, String title, String mode, int uc) { if (state == INCHAT && mode.compareTo("chan") != 0) bar.addChan(id, title, mode, uc); } public int getGameID() { return toInt(this.getParameter("gameid")); } public void start() { if (runner == null) { runner = new Thread(this); runner.start(); } } public void stop() { if (runner != null) { runner.stop(); runner = null; } } public void destroy() { if (net != null) { net.sendMessage("@logout"); net.stop(); net.error("User Logged Out!"); } if (frags != 0) { netFrags.sendFrags(); } } public void run() { while (true) { gameLogic(); repaint(); sleep(62); } } public boolean mouseDown(Event evt, int x, int y) { if (state == SELECTSHIP) sShip.setY(y); else if (state == INCHAT) bar.mouseDown(x,y); return true; } public boolean keyDown(Event evt, int key) { if (state == INCHAT) { if (key == '\n' && bar.focus == bar.MESSAGE && bar.chatMsg.length() > 0) { net.sendMessage("#b'" + bar.chatMsg); bar.addMessage(this.getParameter("name") + " - " + bar.chatMsg); bar.chatMsg = ""; } else if (key >=32 && key <= 122 && key != 96) bar.addLetter((char) key); else if (key == 8 || key == 127) bar.removeLetter(); return true; } else if (state != PLAY) return false; else if (key == '\n' && !chat) chat = true; else if (chat && key == 27) chat = false; else if (chat) { if (key == '\n') { net.sendChatMessage(game.me.name, myMessage); addMessage(game.me.name + " - " + myMessage); myMessage = ""; chat = false; } else if (key >=32 && key <= 122 && key != 96 && myMessage.length() < 45) { myMessage += (char) key; } else if (key == 8 || key == 127) { char[] temp = new char[myMessage.length()]; myMessage.getChars(0, myMessage.length(), temp, 0); if (temp.length > 0) myMessage = new String(temp, 0, myMessage.length() -1); } return true; } else if (key == '4' || key == 1006) { if (game.me.setCommand(0, true)) return true; } else if (key == '6' || key == 1007) { if (game.me.setCommand(1, true)) return true; } else if (key == '8' || key == 1004) { if (game.me.setCommand(2, true)) return true; } else if (key == ' ' && game.me.isAlive()) { if (game.me.setCommand(3, true)) return true; } else if (key == ' ') { game.spawn(game.me); frags -= 1; } else return false; net.sendKeyUpdate(); return true; } public boolean keyUp(Event evt, int key) { if (state != PLAY) return false; else if (key == '4' || key == 1006) game.me.setCommand(0, false); else if (key == '6' || key == 1007) game.me.setCommand(1, false); else if (key == '8' || key == 1004) game.me.setCommand(2, false); else if (key == ' ') game.me.setCommand(3, false); else if (key == 't' && target == null) target = game.getTarget(0); else if (key == 't') target = game.getNextTarget(target.id); else return false; net.sendKeyUpdate(); return true; } public synchronized void paint(Graphics g) { if (offscreenG == null) { offscreenI = createImage(this.size().width, this.size().height); offscreenG = offscreenI.getGraphics(); } if (state == PLAY) { game.paint(offscreenG); offscreenG.setColor(Color.black); offscreenG.fillRect(400,0,70,400); paintPannel(offscreenG); net.paint(offscreenG); offscreenG.setColor(Color.white); offscreenG.setFont(font); for (int i = 0; i < 3; i++) offscreenG.drawString(chatMessage[i], 10, (2-i)*15+10); if (TTL-- == 0) addMessage(""); if (chat) offscreenG.drawString("Message: " + myMessage, 10, 395); } else if (state == SELECTSHIP) { sShip.paint(offscreenG); } else if (state == LOGIN) { offscreenG.setColor(Color.black); offscreenG.fillRect(0,0,470,400); offscreenG.setColor(Color.white); offscreenG.setFont(font); offscreenG.drawString("Connecting to General Network Server", 25, 50); offscreenG.drawString("http://www.netdragons.com/games/24/gns/", 25, 75); offscreenG.drawString("Please wait . . .", 30, 100); } else if (state == INCHAT && bar != null) { bar.paint(offscreenG); } g.drawImage(offscreenI,0,0,this); } public void update(Graphics g) { paint(g); } private void gameLogic() { if (state == PLAY) { if (net.online()) net.sendPackateData(); game.update(); } } private void sleep(int i) { try { runner.sleep(i); } catch (InterruptedException e) { } } private void paintPannel(Graphics g) { g.drawImage(pannel, 400, 0, this); g.setColor(Color.white); g.drawString("" + frags, 410, 360); if (target == null) { g.setFont(font); g.drawString("No", 430 - fontSize.stringWidth("No")/2, 45); g.drawString("Target", 430 - fontSize.stringWidth("Target")/2, 65); } else { target.paint(g, 430, 40, 5); g.setFont(sfont); g.drawString(target.name, 412, 75); slevel = target.getShieldPercent(); for (int i = 0; i < slevel; i++) { g.setColor(sColor[i]); g.drawLine(456+((i%2)*2), 60-i/2, 458+((i%2)*2), 60-i/2); } } slevel = game.me.getShieldPercent(); wlevel = game.me.getWeaponPowerPercent(); vlevel = game.me.getVelocityPercent(); for (int i = 0; i < slevel; i++) { g.setColor(sColor[i]); g.drawLine(410, 190-i, 420, 190-i); } for (int i = 0; i < wlevel; i++) { g.setColor(sColor[i]); g.drawLine(430, 190-i, 440, 190-i); } for (int i = 0; i < vlevel; i++) { g.setColor(sColor[i]); g.drawLine(450, 190-i, 460, 190-i); } } public void addMessage(String msg) { chatMessage[2] = chatMessage[1]; chatMessage[1] = chatMessage[0]; chatMessage[0] = msg; TTL = 30; } private void setShieldColors() { for (int i = 0; i < 110; i++) sColor[i] = new Color (255-i*2, 0, i*2); } private int toInt(String s) { Integer i = new Integer(s); return i.intValue(); } }