// Processed by NMI's Java Code Viewer 4.8.2 © 1997-2000 B. Lemaire // Website: http://njcv.htmlplanet.com E-mail: info@njcv.htmlplanet.com // Copy registered to Evaluation Copy // Source File Name: Scrabble.java import java.awt.*; import java.io.*; import java.net.Socket; import java.util.Vector; import symantec.itools.awt.SplitterPanel; public class Scrabble extends Frame { Panel middleScreen; Panel topScreen; Panel bottomScreen; protected final int ALL = 1; protected final int BOARD_ALONE = 2; protected final int TOOLBAR = 3; protected final int STATUSBAR = 4; private SplitterPanel splitterPanel1; protected ChatArea chatArea; protected ScrabbleBoard scrabbleBoard; protected ScrollingPanel playboard; protected ConnectDialog connectDialog; protected ScoreOfPlayers score; protected ToolBarPanel toolbar; protected StatusBarPanel statusbar; protected static String gameDirectory; MultiServer multiServer; Client client; Socket socket; DataOutputStream os; MenuItem clientMenuItem; MenuItem serverMenuItem; MenuItem disconnectMenuItem; MenuItem startGameMenuItem; MenuItem stopGameMenuItem; MenuItem saveGameMenuItem; MenuItem loadGameMenuItem; MenuItem undoMenuItem; MenuItem passMenuItem; MenuItem doneMenuItem; MenuItem clearBoardMenuItem; MenuItem kickMenuItem; CheckboxMenuItem toolbarMenuItem; CheckboxMenuItem statusbarMenuItem; public static void main(String args[]) { new Scrabble(); } public Scrabble() { super("Scrabble"); chatArea = new ChatArea(this); scrabbleBoard = new ScrabbleBoard(this); playboard = new ScrollingPanel(scrabbleBoard, Color.black, ScrollingPanel.SOUTH_WEST, 0); score = new ScoreOfPlayers(this); toolbar = new ToolBarPanel(this); statusbar = new StatusBarPanel(); pack(); setResizable(true); addPanels(); addMenus(); setBackground(Color.lightGray); resize(800, 600); getDefaultParameters(); (new AboutDialog(this, true)).show(); } public void addMenus() { MenuBar menubar = new MenuBar(); Menu menu = new Menu("File"); Menu menu1 = new Menu("Game"); Menu menu2 = new Menu("Connect"); Menu menu3 = new Menu("Settings"); Menu menu4 = new Menu("Help"); saveGameMenuItem = new MenuItem("Save Game"); saveGameMenuItem.disable(); loadGameMenuItem = new MenuItem("Load Game"); loadGameMenuItem.disable(); menu.add(saveGameMenuItem); menu.add(loadGameMenuItem); menu.addSeparator(); menu.add("Save Messages"); menu.add("Clear Messages"); menu.addSeparator(); menu.add("Exit Scrabble"); startGameMenuItem = new MenuItem("Start Game"); startGameMenuItem.disable(); stopGameMenuItem = new MenuItem("Stop Game"); stopGameMenuItem.disable(); clearBoardMenuItem = new MenuItem("Clear Playboard"); kickMenuItem = new MenuItem("Kick Player"); kickMenuItem.disable(); undoMenuItem = new MenuItem("Undo"); undoMenuItem.disable(); passMenuItem = new MenuItem("Pass"); passMenuItem.disable(); doneMenuItem = new MenuItem("Done"); doneMenuItem.disable(); menu1.add(startGameMenuItem); menu1.add(stopGameMenuItem); menu1.addSeparator(); menu1.add(clearBoardMenuItem); menu1.addSeparator(); menu1.add(kickMenuItem); menu1.addSeparator(); menu1.add(undoMenuItem); menu1.add(passMenuItem); menu1.add(doneMenuItem); clientMenuItem = new MenuItem("Client"); serverMenuItem = new MenuItem("Server"); disconnectMenuItem = new MenuItem("Disconnect"); menu2.add(clientMenuItem); menu2.add(serverMenuItem); menu2.addSeparator(); menu2.add(disconnectMenuItem); disconnectMenuItem.disable(); toolbarMenuItem = new CheckboxMenuItem("Toolbar"); statusbarMenuItem = new CheckboxMenuItem("Status bar"); toolbarMenuItem.setState(true); statusbarMenuItem.setState(true); menu3.add("Properties..."); menu3.add("Browser location"); menu3.addSeparator(); menu3.add(toolbarMenuItem); menu3.add(statusbarMenuItem); menu4.add("Help"); menu4.addSeparator(); menu4.add("About Scrabble"); menubar.add(menu); menubar.add(menu1); menubar.add(menu2); menubar.add(menu3); menubar.add(menu4); setMenuBar(menubar); } public void addPanels() { middleScreen = new Panel(); topScreen = new Panel(); bottomScreen = new Panel(); splitterPanel1 = new SplitterPanel(6); splitterPanel1.setLayout(null); splitterPanel1.setBdrSizes(1, 1); splitterPanel1.use3dBdr = true; splitterPanel1.getTopRightPanel().add(score); splitterPanel1.getBottomRightPanel().add(chatArea); splitterPanel1.getLeftPanel().add(playboard); splitterPanel1.getTopRightPanel().setMinimumSize(new Dimension(300, 150)); splitterPanel1.getTopRightPanel().setPreferredSize(new Dimension(300, 250)); splitterPanel1.getBottomRightPanel().setMinimumSize(new Dimension(300, 150)); splitterPanel1.getBottomRightPanel().setPreferredSize(new Dimension(300, 450)); splitterPanel1.getLeftPanel().setMinimumSize(new Dimension(500, 500)); splitterPanel1.getLeftPanel().setPreferredSize(new Dimension(500, 500)); topScreen.setLayout(new GridBagLayout()); GridBagLayout gridbaglayout = (GridBagLayout)topScreen.getLayout(); GridBagConstraints gridbagconstraints = new GridBagConstraints(); gridbagconstraints.fill = 1; gridbagconstraints.gridx = 0; gridbagconstraints.gridy = 0; gridbagconstraints.weightx = 1.0D; gridbaglayout.setConstraints(toolbar, gridbagconstraints); topScreen.setBackground(Color.lightGray); topScreen.add(toolbar); middleScreen.setLayout(new GridLayout(1, 1)); middleScreen.add(splitterPanel1); bottomScreen.setLayout(new GridBagLayout()); GridBagLayout gridbaglayout1 = (GridBagLayout)bottomScreen.getLayout(); GridBagConstraints gridbagconstraints1 = new GridBagConstraints(); gridbagconstraints1.fill = 1; gridbagconstraints1.gridx = 0; gridbagconstraints1.gridy = 0; gridbagconstraints1.weightx = 1.0D; gridbaglayout1.setConstraints(statusbar, gridbagconstraints1); bottomScreen.setBackground(Color.lightGray); bottomScreen.add(statusbar); setLayout(new BorderLayout()); add("North", topScreen); add("Center", middleScreen); add("South", bottomScreen); } public void getDefaultParameters() { try { RandomAccessFile randomaccessfile = new RandomAccessFile("connect.cfg", "r"); ClientData.defaultNick = randomaccessfile.readLine(); ClientData.defaultHost = randomaccessfile.readLine(); ClientData.defaultPort = Integer.valueOf(randomaccessfile.readLine()).intValue(); ServerData.defaultPort = ClientData.defaultPort; ClientData.deafultConnectionTimeout = Integer.valueOf(randomaccessfile.readLine()).intValue(); randomaccessfile.close(); } catch(IOException _ex) { } ClientData.nick = ClientData.defaultNick; ClientData.host = ClientData.defaultHost; ClientData.port = ClientData.defaultPort; ServerData.port = ServerData.defaultPort; ClientData.connectionTimeout = ClientData.deafultConnectionTimeout; try { RandomAccessFile randomaccessfile1 = new RandomAccessFile("browser.cfg", "r"); ClientData.browserPath = randomaccessfile1.readLine(); randomaccessfile1.close(); } catch(IOException _ex) { } File file = new File(""); gameDirectory = file.getAbsolutePath(); } private void tellMultiServer(int i) { try { socket = new Socket("localhost", ServerData.port); os = new DataOutputStream(socket.getOutputStream()); os.writeInt(i); os.close(); socket.close(); return; } catch(IOException _ex) { return; } } public boolean handleEvent(Event event) { if(event.id == 201) { if(ServerData.amI_Server) tellMultiServer(181); else if(ClientData.amI_Connected) client.needToClose = true; hide(); dispose(); System.exit(0); return true; } if(event.id == 1001) { if(event.target == scrabbleBoard) { if(event.arg.equals(Integer.toString(162))) ClientData.turnStatus = 162; if(event.arg.equals(Integer.toString(164))) ClientData.turnStatus = 164; return true; } if(event.target == multiServer) { if(event.arg.equals(Integer.toString(151))) { clientMenuItem.enable(); serverMenuItem.enable(); disconnectMenuItem.disable(); startGameMenuItem.disable(); stopGameMenuItem.disable(); saveGameMenuItem.disable(); loadGameMenuItem.disable(); kickMenuItem.disable(); toolbar.disableButton(1); toolbar.disableButton(2); toolbar.disableButton(3); toolbar.disableButton(5); toolbar.disableButton(6); toolbar.enableButton(0); toolbar.enableButton(7); } if(event.arg.equals(Integer.toString(127))) { startGameMenuItem.disable(); stopGameMenuItem.enable(); loadGameMenuItem.disable(); saveGameMenuItem.enable(); kickMenuItem.disable(); toolbar.disableButton(2); toolbar.enableButton(3); toolbar.enableButton(5); toolbar.disableButton(6); toolbar.disableButton(7); } if(event.arg.equals(Integer.toString(172))) { startGameMenuItem.enable(); stopGameMenuItem.disable(); loadGameMenuItem.enable(); saveGameMenuItem.disable(); kickMenuItem.enable(); toolbar.enableButton(2); toolbar.disableButton(3); toolbar.disableButton(5); toolbar.enableButton(6); toolbar.enableButton(7); } return true; } if(event.target == client) { if(event.arg.equals(Integer.toString(152))) { setTitle("Scrabble"); if(ClientData.gameInProgress) { undoMenuItem.disable(); passMenuItem.disable(); doneMenuItem.disable(); scrabbleBoard.handleUndoButton(); scrabbleBoard.clearBankLetters(); score.eraseTimer(); ClientData.gameInProgress = false; } clientMenuItem.enable(); serverMenuItem.enable(); disconnectMenuItem.disable(); startGameMenuItem.disable(); stopGameMenuItem.disable(); saveGameMenuItem.disable(); clearBoardMenuItem.enable(); toolbar.enableButton(0); toolbar.disableButton(1); toolbar.disableButton(2); toolbar.disableButton(3); toolbar.enableButton(4); toolbar.disableButton(5); } if(event.arg.equals(Integer.toString(154))) { setTitle("Scrabble - " + ClientData.nick); serverMenuItem.disable(); clientMenuItem.disable(); disconnectMenuItem.enable(); toolbar.disableButton(0); toolbar.enableButton(1); if(ServerData.amI_Server) { startGameMenuItem.enable(); loadGameMenuItem.enable(); kickMenuItem.enable(); toolbar.enableButton(2); toolbar.enableButton(6); toolbar.enableButton(7); } connectDialog.closeConnectDialog(); } if(event.arg.equals(Integer.toString(127))) { scrabbleBoard.clearBoard(); clearBoardMenuItem.disable(); toolbar.disableButton(4); score.clearScore(); score.newGameStarted(); scrabbleBoard.newBankLetters(); for(int i = 0; i < 15; i++) { for(int l = 0; l < 15; l++) if(ClientData.boardLetters[i][l] != 0) ClientData.canBeDragged[i][l] = true; } scrabbleBoard.updateBoard(); } if(event.arg.equals(Integer.toString(172))) { score.eraseTimer(); score.placeWinner(ClientData.winner); clearBoardMenuItem.enable(); toolbar.enableButton(4); undoMenuItem.disable(); passMenuItem.disable(); doneMenuItem.disable(); scrabbleBoard.handleUndoButton(); scrabbleBoard.clearBankLetters(); } if(event.arg.equals(Integer.toString(171))) score.playerDisconnected(false); if(event.arg.equals(Integer.toString(170))) score.playerDisconnected(true); if(event.arg.equals(Integer.toString(167))) { if(ClientData.myTurn) { undoMenuItem.enable(); passMenuItem.enable(); doneMenuItem.enable(); } else { undoMenuItem.disable(); passMenuItem.disable(); doneMenuItem.disable(); } scrabbleBoard.newBankLetters(); score.placeTimer(ClientData.whoseTurn); } if(event.arg.equals(Integer.toString(160))) { scrabbleBoard.updateBoard(); for(int j = 0; j < 15; j++) { for(int i1 = 0; i1 < 15; i1++) ClientData.canBeDragged[j][i1] = false; } StringBuffer stringbuffer = new StringBuffer(); for(int k1 = 0; k1 < ClientData.words.size(); k1++) { stringbuffer.append((String)ClientData.words.elementAt(k1)); stringbuffer.append(' '); } score.addLine(ClientData.nicks[ClientData.whoseTurn], ClientData.turnScore, stringbuffer.toString()); score.updateScore(ClientData.whoseTurn); } return true; } if(event.target == chatArea) { Mail mail = (Mail)event.arg; int j1 = mail.toWhom; String s = mail.message; client.sendMessage(s, j1); return true; } if(event.target instanceof ScorePanel) { if(ClientData.myTurn) ClientData.turnStatus = 163; return true; } if(event.target instanceof PropertiesDialog) { multiServer.sendGameData(); return true; } } if(event.target instanceof MenuItem) { if(event.arg.equals("Save Game")) { FileDialog filedialog = new FileDialog(this, "Choose file", 1); filedialog.show(); scrabbleBoard.repaint(); if(filedialog.getDirectory() != null && filedialog.getFile() != null) { File file = new File(filedialog.getDirectory() + filedialog.getFile()); file.delete(); try { RandomAccessFile randomaccessfile = new RandomAccessFile(file, "rw"); randomaccessfile.writeByte(-92); randomaccessfile.writeBoolean(true); randomaccessfile.writeInt(113); randomaccessfile.writeBoolean(false); randomaccessfile.writeInt(ServerData.clientsCurrentlyConnected); for(int l1 = 0; l1 < ServerData.clientsCurrentlyConnected; l1++) if(ServerData.validPlayer[l1]) { randomaccessfile.writeInt(ServerData.nicks[l1].length()); randomaccessfile.writeChars(ServerData.nicks[l1]); } randomaccessfile.writeBoolean(ServerData.isSpellerUsed); randomaccessfile.writeBoolean(ServerData.isTimeLimitUsed); randomaccessfile.writeInt(ServerData.timeLimit); for(int i2 = 0; i2 < ServerData.clientsCurrentlyConnected; i2++) randomaccessfile.writeInt(ServerData.playerScore[i2]); for(int k2 = 0; k2 < C.MAX_NUM_OF_PLAYERS; k2++) if(ServerData.validPlayer[k2]) { for(int j3 = 0; j3 < 7; j3++) randomaccessfile.writeChar(ServerData.bankLetters[k2][j3]); } for(int k3 = 0; k3 < 15; k3++) { for(int i4 = 0; i4 < 15; i4++) randomaccessfile.writeChar(ServerData.oldBoardLetters[k3][i4]); } randomaccessfile.writeInt(ServerData.whoseTurn); for(int j4 = 0; j4 < C.MAX_NUM_OF_PLAYERS; j4++) if(ServerData.validPlayer[j4]) randomaccessfile.writeInt(ServerData.playersOrder[j4]); randomaccessfile.close(); } catch(IOException _ex) { ChatArea.addText(">>> Can't save data", 141); return false; } } return true; } if(event.arg.equals("Load Game")) { boolean flag = false; FileDialog filedialog3 = new FileDialog(this, "Choose game", 0); filedialog3.show(); scrabbleBoard.repaint(); if(filedialog3.getDirectory() != null && filedialog3.getFile() != null) { File file3 = new File(filedialog3.getDirectory() + filedialog3.getFile()); try { RandomAccessFile randomaccessfile3 = new RandomAccessFile(file3, "r"); if(randomaccessfile3.readByte() == -92 && randomaccessfile3.readBoolean() && randomaccessfile3.readInt() == 113 && !randomaccessfile3.readBoolean()) flag = true; if(!flag) { ChatArea.addText(">>> The file is not a scrabble saved game !!!", 141); return false; } ServerData.loadedClientsCurrentlyConnected = randomaccessfile3.readInt(); if(ServerData.clientsCurrentlyConnected != ServerData.loadedClientsCurrentlyConnected) { ChatArea.addText(">>> Saved game has different players.", 141); ChatArea.addText(">>> Can't load game.", 141); return false; } for(int j2 = 0; j2 < ServerData.loadedClientsCurrentlyConnected; j2++) { int l2 = randomaccessfile3.readInt(); StringBuffer stringbuffer1 = new StringBuffer(); for(int k4 = 0; k4 < l2; k4++) stringbuffer1.append(randomaccessfile3.readChar()); ServerData.loadedNicks[j2] = stringbuffer1.toString(); } for(int i3 = 0; i3 < ServerData.clientsCurrentlyConnected; i3++) { boolean flag1 = false; for(int l4 = 0; l4 < C.MAX_NUM_OF_PLAYERS; l4++) if(ServerData.nicks[l4] != null && ServerData.nicks[l4].equals(ServerData.loadedNicks[i3])) flag1 = true; if(!flag1) { ChatArea.addText(">>> Saved game has different players.", 141); ChatArea.addText(">>> Can't load game.", 141); return false; } } ServerData.isSpellerUsed = randomaccessfile3.readBoolean(); ServerData.isTimeLimitUsed = randomaccessfile3.readBoolean(); ServerData.timeLimit = randomaccessfile3.readInt(); for(int l3 = 0; l3 < ServerData.clientsCurrentlyConnected; l3++) ServerData.playerScore[l3] = randomaccessfile3.readInt(); for(int i5 = 0; i5 < ServerData.clientsCurrentlyConnected; i5++) { for(int j5 = 0; j5 < 7; j5++) ServerData.bankLetters[i5][j5] = randomaccessfile3.readChar(); } for(int k5 = 0; k5 < 15; k5++) { for(int l5 = 0; l5 < 15; l5++) ServerData.oldBoardLetters[k5][l5] = randomaccessfile3.readChar(); } ServerData.whoseTurn = randomaccessfile3.readInt(); for(int i6 = 0; i6 < ServerData.clientsCurrentlyConnected; i6++) ServerData.playersOrder[i6] = randomaccessfile3.readInt(); randomaccessfile3.close(); } catch(IOException _ex) { ChatArea.addText(">>> Error in loading game", 141); } } ServerData.gameWasLoaded = true; tellMultiServer(180); return true; } if(event.arg.equals("Save Messages")) { FileDialog filedialog1 = new FileDialog(this, "Choose file", 1); filedialog1.show(); scrabbleBoard.repaint(); if(filedialog1.getDirectory() != null && filedialog1.getFile() != null) { File file1 = new File(filedialog1.getDirectory() + filedialog1.getFile()); file1.delete(); try { RandomAccessFile randomaccessfile1 = new RandomAccessFile(file1, "rw"); randomaccessfile1.writeBytes(ChatArea.messages.getText()); randomaccessfile1.close(); } catch(IOException _ex) { } } return true; } if(event.arg.equals("Clear Messages")) { ChatArea.messages.setText(""); return true; } if(event.arg.equals("Exit Scrabble")) { (new QuitDialog(this, true)).show(); return true; } if(event.arg.equals("Start Game")) { tellMultiServer(180); return true; } if(event.arg.equals("Stop Game")) { tellMultiServer(172); return true; } if(event.arg.equals("Clear Playboard")) { scrabbleBoard.clearBoard(); return true; } if(event.arg.equals("Kick Player")) { int k = ChatArea.getSelected(); switch(k) { case -1: ChatArea.addText(">>> You can't kick all players at once !!!", 141); break; case 0: // '\0' ChatArea.addText(">>> You can't kick yourself !!!", 141); break; default: ServerData.clientToBeKicked = k; tellMultiServer(190); break; } return true; } if(event.arg.equals("Undo")) { scrabbleBoard.handleUndoButton(); return true; } if(event.arg.equals("Pass")) { scrabbleBoard.handlePassButton(); return true; } if(event.arg.equals("Done")) { scrabbleBoard.handleDoneButton(); return true; } if(event.arg.equals("Client")) { ServerData.amI_Server = false; client = new Client(this); client.setPriority(2); ClientData.timeOutReached = false; client.start(); (connectDialog = new ConnectDialog(this)).show(); return true; } if(event.arg.equals("Server")) { ServerData.amI_Server = true; multiServer = new MultiServer(this); multiServer.setPriority(4); multiServer.start(); client = new Client(this); client.setPriority(2); ClientData.timeOutReached = false; client.start(); (connectDialog = new ConnectDialog(this)).show(); return true; } if(event.arg.equals("Disconnect")) { setTitle("Scrabble"); if(ServerData.amI_Server) tellMultiServer(181); else if(ClientData.amI_Connected && !ServerData.amI_Server) client.needToClose = true; return true; } if(event.arg.equals("Properties...")) { (new PropertiesDialog(this, true)).show(); return true; } if(event.arg.equals("Browser location")) { FileDialog filedialog2 = new FileDialog(this, "Choose browser", 0); filedialog2.show(); scrabbleBoard.repaint(); if(filedialog2.getDirectory() != null && filedialog2.getFile() != null) { ClientData.browserPath = filedialog2.getDirectory() + filedialog2.getFile(); File file2 = new File(gameDirectory + "browser.cfg"); file2.delete(); try { RandomAccessFile randomaccessfile2 = new RandomAccessFile(file2, "rw"); randomaccessfile2.writeBytes(ClientData.browserPath + "\n"); randomaccessfile2.close(); } catch(IOException _ex) { } } return true; } if(event.arg.equals("Toolbar")) { if(!toolbarMenuItem.getState()) topScreen.hide(); else topScreen.show(); validate(); return true; } if(event.arg.equals("Status bar")) { if(!statusbarMenuItem.getState()) bottomScreen.hide(); else bottomScreen.show(); validate(); return true; } if(event.arg.equals("Help")) { Runtime runtime = Runtime.getRuntime(); try { String as[] = new String[2]; as[0] = ClientData.browserPath; as[1] = gameDirectory + "Help" + File.separator + "help.htm"; runtime.exec(as); } catch(IOException _ex) { ChatArea.addText(">>> Please update browser location in 'Settings' menu !", 0); } return true; } if(event.arg.equals("About Scrabble")) { (new AboutDialog(this, false)).show(); return true; } } return super.handleEvent(event); } public synchronized void show() { Rectangle rectangle = bounds(); Toolkit toolkit = getToolkit(); move((toolkit.getScreenSize().width - rectangle.width) / 2, (toolkit.getScreenSize().height - rectangle.height) / 2); super.show(); toolkit = null; } public void paint(Graphics g) { scrabbleBoard.repaint(); } }