import java.util.*; import java.awt.*; class JavaChat implements Runnable { public static final String PROTOCOL = "GSP/1.0"; public static final String GAMETYPE = "JavaChat/1.0"; GameClient client; Thread thisThread; GameWindow gw; private boolean saidHello = false; Random rnd = new Random(); String playerID = null; String gameID = null; String playerName = null; boolean masterClient = false; boolean gameStarted = false; riskapl2 riskparent; Vector knownGames = new Vector(1); Vector knownPlayers = new Vector(1); JavaChat(riskapl2 parent) { gw = new GameWindow(this, "GameClient v0.1 -- Chat Test"); gw.pack(); gw.show(); riskparent=parent; namedialog getname=new namedialog(gw,this); getname.show(); riskparent.name=playerName; client = new GameClient("127.0.0.1",7777,playerName); thisThread = new Thread(this, "JavaChat"); thisThread.start(); } public void sendMessage(String msg) { client.sendMessage(msg); } private String getMessage() { return client.getMessage(); } public void stop() { thisThread.stop(); } public void run() { boolean connected = true; boolean x = false; String data; while(connected) { try { while(connected) { while(!client.msgAvailable()) thisThread.sleep(100); connected = parse(getMessage()); if(!x) { x = true; sendMessage("CREATE\t"+rnd.nextLong()); } float f = rnd.nextFloat(); if(f > 0.9990) sendMessage("MSG\tI am here! "+f); } } catch (Exception e) { System.err.println("JavaChat: Caught "+e); e.printStackTrace(); connected = false; } } client.closeConnection(); gw.dispose(); thisThread.stop(); } private boolean parse(String data) { //System.out.println("#|"+data+"|"); if(data == null) return false; StringTokenizer tokenFactory = new StringTokenizer(data,"\t\n\r"); int numTokens = tokenFactory.countTokens(); if(numTokens == 0) return true; if(!saidHello) { if(numTokens == 2 && tokenFactory.nextToken().equals(PROTOCOL)) { playerID = tokenFactory.nextToken(); sendMessage(PROTOCOL+"\t"+GAMETYPE+"\t"+playerName); saidHello = true; sendMessage("LIST\tGAMES"); // get a list of games sendMessage("LIST\tPLAYERS"); // get list of players return true; } return false; } else { String cmd = tokenFactory.nextToken(); if(numTokens == 1) { if(cmd.equals("BYE!")) { return false; } } else if(numTokens == 2) { String tok2 = tokenFactory.nextToken(); if(cmd.equals("GAMEOVER")) { displayMessage(null,getGameName(tok2)+" has ended."); if(gameID.equals(tok2)) { sendMessage("JOIN\t0"); gameOver(); } return true; } if(cmd.equals("DESTROYED")) { displayMessage(null,getGameName(tok2)+" was disbanded."); removeGame(tok2); return true; } if(cmd.equals("PLAYERLEFT")) { iPlayer p = findPlayer(tok2); if(p != null) remove(p); } } else if(numTokens == 3) { String tok2 = tokenFactory.nextToken(); String tok3 = tokenFactory.nextToken(); if(cmd.equals("MSG")) { displayMessage(tok2,tok3); } if(cmd.equals("JOINED")) { if(tok2.equals(playerID)) { gameID = tok3; displayMessage(null,"Joined "+getGameName(gameID)); } else { if(tok3.equals(gameID)) { displayMessage(null,getPlayerName(tok2)+" has joined this game."); } updatePlayer(tok2,tok3); } return true; } if(cmd.equals("PLAYERQUIT")) { displayMessage(null,getPlayerName(tok2)+" quit the game!"); return true; } } else if(numTokens == 4) { String pid = tokenFactory.nextToken(); String name = tokenFactory.nextToken(); String gid = tokenFactory.nextToken(); if(cmd.equals("PLAYER")) { updatePlayer(pid,name,gid); return true; } } else if(numTokens == 5) { } else if(numTokens == 7) { } else if(numTokens == 6) { String type = tokenFactory.nextToken(); String gid = tokenFactory.nextToken(); String maxplayers = tokenFactory.nextToken(); String started = tokenFactory.nextToken(); String name = tokenFactory.nextToken(); //String owner = tokenFactory.nextToken(); if(cmd.equals("GAME") || cmd.equals("CREATED")) { updateGame(type, gid, maxplayers, started, name); return true; } } } return true; } void sendChatMessage(String message) { sendMessage("MSG\t"+message); } void displayMessage(String who, String message) { if(who == null) who = "-----> "; else who = who + " : "; System.out.println(who+message); if(gw != null) gw.displayMessage(who+message); } void add(iPlayer p) { if(!knownPlayers.contains(p)) knownPlayers.addElement(p); } void add(iGame g) { if(!knownGames.contains(g)) knownGames.addElement(g); } void remove(iPlayer p) { if(p.gid != null) { iGame g = findGame(p.gid); if(g != null) { g.removePlayer(p); } } if(knownPlayers.contains(p)) knownPlayers.removeElement(p); p.dispose(); } void remove(iGame g) { if(knownGames.contains(g)) knownGames.removeElement(g); sendMessage("LIST\tPLAYERS"); // fixup player games g.dispose(); } iPlayer findPlayer(String pid) { int i = knownPlayers.size(); iPlayer p; while(i-- > 0) { p = (iPlayer) knownPlayers.elementAt(i); if(pid.equals(p.pid)) return p; } return null; } iGame findGame(String gid) { int i = knownGames.size(); iGame g; while(i-- > 0) { g = (iGame) knownGames.elementAt(i); if(gid.equals(g.gid)) return g; } return null; } void updatePlayer(String p, String g) { iPlayer pl = findPlayer(p); if(pl == null) { sendMessage("LIST\tPLAYERS"); } else { iGame ga = findGame(pl.gid); iGame ga2 = findGame(g); if(ga != null) ga.removePlayer(pl); if(ga2 != null) ga2.addPlayer(pl); } } String getGameName(String gid) { iGame g = findGame(gid); if(g == null) return null; return g.name; } String getPlayerName(String pid) { iPlayer p = findPlayer(pid); if(p == null) return null; return p.name; } void updatePlayer(String p, String n, String g) { iPlayer pl = findPlayer(p); if(pl == null) { pl = new iPlayer(p,n,g); add(pl); } else updatePlayer(p,g); } void updateGame(String t, String g, String mp,String s, String n) { iGame ga = findGame(g); if(ga == null) { ga = new iGame(g,n,t,mp,s); add(ga); } else ga.update(g,n,t,mp,s); } void removeGame(String gid) { iGame g = findGame(gid); remove(g); sendMessage("LIST\tPLAYERS"); } void takeTurn() { System.out.println("takeTurn called"); } void gameOver() { System.out.println("Gameover."); } } ///////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////// class iPlayer extends Object { public String name = null; public String pid = null; public String gid = null; iPlayer(String p, String n, String g) { System.out.println("*New iPlayer('"+p+"','"+n+"','"+g+"')"); name = n; pid = p; gid = g; } public void update(String p, String n, String g) { gid = g; } public void dispose() { System.out.println("*Del iPlayer('"+pid+"','"+name+"','"+gid+"')"); } } class iGame extends Object { public String type = null; public String name = null; public String gid = null; public String maxPlayers = null; public boolean started = false; private Vector players = new Vector(); private int nextP = 0; iGame(String g, String n, String t, String mp, String s) { System.out.println("*New iGame('"+g+"','"+n+"','"+t+"',"+mp+",'"+s+"')"); gid = g; name = n; type = t; maxPlayers = mp; started = s.equals("true"); } public void update(String g, String n, String t, String mp, String s) { maxPlayers = mp; started = s.equals("true"); } public String nextPlayer() { nextP = ++nextP % players.size(); return ((iPlayer)players.elementAt(nextP)).pid; } public void addPlayer(iPlayer p) { if(!players.contains(p) && !started) players.addElement(p); } public void removePlayer(iPlayer p) { if(players.contains(p)) players.removeElement(p); } public void dispose() { System.out.println("*Del iGame('"+gid+"','"+name+"','"+type+"',"+maxPlayers+",'"+started+"')"); } } class namedialog extends Dialog { JavaChat jc; TextField name; public namedialog(Frame parent,JavaChat pjc) { super(parent,"Enter Your Name:",true); jc=pjc; name=new TextField(20); add("Center",name); Panel p=new Panel(); p.add(new Button("OK")); add("South",p); resize(200,80); } public boolean action(Event evt,Object arg) { if (arg.equals("OK")) { jc.playerName=name.getText(); dispose(); } return true; } }