/* Copyright (C) 2010 - 2011 Fabian Neundorf, Philip Caroli, * Maximilian Madlung, Usman Ghani Ahmed, Jeremias Mechler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.ojim.client.gui; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.Serializable; import java.util.Date; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.UIManager; import org.ojim.client.ClientBase; import org.ojim.client.gui.CardBar.CardWindow; import org.ojim.client.gui.GameField.GameField; import org.ojim.client.gui.OLabel.FontLayout; import org.ojim.client.gui.PopUpFrames.AboutFrame; import org.ojim.client.gui.PopUpFrames.CreateGameFrame; import org.ojim.client.gui.PopUpFrames.HelpFrame; import org.ojim.client.gui.PopUpFrames.JoinGameFrame; import org.ojim.client.gui.PopUpFrames.SettingsFrame; import org.ojim.client.gui.RightBar.ChatMessage; import org.ojim.client.gui.RightBar.ChatWindow; import org.ojim.client.gui.RightBar.PlayerInfoWindow; import org.ojim.language.Localizer; import org.ojim.language.LanguageDefinition; import org.ojim.language.Localizer.TextKey; import org.ojim.logic.rules.GameRules; import org.ojim.logic.state.Player; import org.ojim.logic.state.fields.BuyableField; import org.ojim.logic.state.fields.Field; import org.ojim.logic.state.fields.FreeParking; import org.ojim.logic.state.fields.Street; import org.ojim.server.OjimServer; /** * Diese Klasse ist der GUI Client * */ public class GUIClient extends ClientBase implements Serializable { private GUISettings settings; private GameField gameField; private ChatWindow chatWindow; private PlayerInfoWindow playerInfoWindow; private CardWindow cardWindow; private CreateGameFrame createGameFrame; private JoinGameFrame joinGameFrame; private SettingsFrame settingsFrame; private HelpFrame helpFrame; private AboutFrame aboutFrame; private String name; private MenuBar menubar; private JPanel window = new JPanel(); private JPanel rightWindow1 = new JPanel(); private JPanel downWindow = new JPanel(); private JPanel downRight = new JPanel(); private JButton buyButton = new JButton(); private JButton rollButton = new JButton(); private JButton endTurnButton = new JButton(); private JButton button = new JButton(); private JPanel leftWindow = new JPanel(); private JPanel rightWindow = new JPanel(); private JButton jeremiasButton = new JButton(); private JFrame GUIFrame; private JPanel pane = new JPanel(new OJIMLayout()); private Localizer language; private boolean notInit = true; private boolean haveIalreadyRolled = false; private OjimServer server; private MenuState menuState; private boolean bankrupt = false; /** * Mit diesem Konstruktor wird der GUI Client gestartet */ public GUIClient() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting native LAF: " + e); } // Nur zu Debugzwecken auf game setMenuState(MenuState.MAIN_MENU); // setMenuState(MenuState.game); language = new Localizer(); LanguageDefinition[] langs = language.getLanguages(); if (langs.length == 0) { System.out.println("No languagefile found."); } if (langs.length > 0) language.setLanguage(langs[0]); settings = new GUISettings(); settings.loadSettings(); playerInfoWindow = new PlayerInfoWindow(this); createGameFrame = new CreateGameFrame(language, this); joinGameFrame = new JoinGameFrame(language, this); settingsFrame = new SettingsFrame(language, settings); helpFrame = new HelpFrame(language); aboutFrame = new AboutFrame(language); createGameFrame.setTitle(language.getText(TextKey.CREATE_GAME)); joinGameFrame.setTitle(language.getText(TextKey.JOIN_GAME)); settingsFrame.setTitle(language.getText(TextKey.SETTINGS)); helpFrame.setTitle(language.getText(TextKey.HELP)); aboutFrame.setTitle(language.getText(TextKey.ABOUT)); GUIFrame = new JFrame(language.getText(TextKey.OJIM)); playerInfoWindow.setLanguage(language); chatWindow = new ChatWindow(language, this); cardWindow = new CardWindow(this); menubar = new MenuBar(language, this); GUIFrame.setJMenuBar(menubar); changeLanguage(langs[0].name); GUIFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); GUIFrame.setMinimumSize(new Dimension(settings.getWidth(), settings .getHeight())); ImageIcon icon = new ImageIcon("icons/g4468.png"); GUIFrame.setIconImage(icon.getImage()); draw(); } /** * Diese Methode war früher zum Updaten da */ private void draw() { // GUIFrame = new JFrame(language.getText("ojim")); /* * try { for (LookAndFeelInfo info : * UIManager.getInstalledLookAndFeels()) { if * ("Windows".equals(info.getName())) { * UIManager.setLookAndFeel(info.getClassName()); break; } else if * ("Nimbus".equals(info.getName())) { * UIManager.setLookAndFeel(info.getClassName()); break; } else if * ("Metal".equals(info.getName())) { * UIManager.setLookAndFeel(info.getClassName()); break; } } // Keines * der Standarddesigns vorhanden. Nimm das was du hast. } catch * (Exception e) { for (LookAndFeelInfo info : * UIManager.getInstalledLookAndFeels()) { try { * UIManager.setLookAndFeel(info.getClassName()); } catch (Exception e1) * { // Kein Look and Feel e1.printStackTrace(); } } } */ switch (menuState) { case MAIN_MENU: break; case WAITING_ROOM: break; case GAME: // gameField.init(getGameState()); break; } if (GUIFrame != null) { GUIFrame.setVisible(true); } } /** * Die Startmethode des GUI Clients * * @param args * Parameter die nicht benutzt werden */ public static void main(String[] args) { new GUIClient(); } /** * Den Spielstatus ändern * * @param menuState * auf diesen Status wird gesetzt */ public void setMenuState(MenuState menuState) { this.menuState = menuState; draw(); } @Override public void onBuy(Player player, BuyableField field) { System.out.println("Max onBuy:" + field.getName()); gameField.playerBuysField(player, field); if (player.getId() == getMe().getId()) { cardWindow.addCard(field, this); } else { // Sollte man bei einer Auktion überboten sein worden. cardWindow.removeCard(field, this); } if (player.getId() == getMe().getId()) { downRight.remove(buyButton); } draw(); // System.out.println("Meista, da hat wer was gekauft!"); // draw(); } @Override public void onCashChange(Player player, int cashChange) { playerInfoWindow.changeCash(player, getGameState().getPlayerById(player.getId()).getBalance()); // draw(); // System.out.println("CASH CHANGE"); // Geld kleiner 0 Workaround weil getIsBankrupt nicht geht if (player.getIsBankrupt()) { System.out.println("Spieler " + player.getName() + " ist Bankrott"); playerInfoWindow.setBancrupt(player); gameField.playerIsBancrupt(player); } else { int freeparkingMoney = 0; for (int i = 0; i < this.getGameState().getNumberOfFields(); i++) { if (getGameState().getFieldAt(i) instanceof org.ojim.logic.state.fields.FreeParking) { freeparkingMoney += ((org.ojim.logic.state.fields.FreeParking) getGameState() .getFieldAt(i)).getMoneyInPot(); } } this.gameField.setFreeParkingMoney(freeparkingMoney); } } @Override public void onConstruct(Street street) { System.out.println(street.getName() + " wurde upgegradet"); gameField.buildOnStreet(street); draw(); } @Override public void onDestruct(Street street) { gameField.destroyOnStreet(street); draw(); } @Override public void onMessage(String text, Player sender, boolean privateMessage) { chatWindow.write(new ChatMessage(new Date(), sender, privateMessage, text)); // draw(); } @Override public void onMortgageToogle(BuyableField street) { // System.out.println("onMortage wurde für "+street.getName()+" aufgerufen"); cardWindow.switchCardStatus(street); gameField.switchFieldStatus(street); playerInfoWindow.changeCash(street.getOwner(), street.getOwner() .getBalance()); draw(); } @Override public void onMove(Player player) { // TODO: (v. xZise) position kann negativ sein (z.B. Gefängnis) // this.menuState = MenuState.game; // gameField.playerMoves(this.getGameState().getFieldAt(Math.abs(position)), // player); // gameField.init(GameState.FIELDS_AMOUNT, this.getGameState()); Field field = this.getGameState().getFieldAt(player.getPosition()); gameField.playerMoves(field, player); /* * Falls Bancrupt in Move nicht geht for(int i = 0; i < * getGameState().getPlayers().length; i++){ if * (getGameState().getPlayerByID(i).getIsBankrupt()) { * playerInfoWindow.setBancrupt(getGameState().getPlayerByID(i)); * gameField.playerIsBancrupt(getGameState().getPlayerByID(i)); * System.out.println("Bancrupt2"); } } */ if (this.isMyTurn() && field instanceof BuyableField) { BuyableField buyField = (BuyableField) field; if (buyField.getOwner() == null && buyField.getPrice() <= this.getMe().getBalance()) { downRight.add(buyButton); } } draw(); } @Override public void onTrade() { if (getTradeState() == TradeState.WAITING_PROPOSAL || getTradeState() == TradeState.WAITING_PROPOSED) { Player actingPlayer = this.getActing(); Player partnerPlayer = this.getPartner(); if (actingPlayer.equals(getMe())) { this.showTrade(partnerPlayer.getId(), false); } else if (partnerPlayer.equals(getMe())) { this.showTrade(actingPlayer.getId(), true); } chatWindow.write(new ChatMessage(new Date(), null, false, "" + actingPlayer.getName() + " handelt mit " + partnerPlayer.getName())); } if (getTradeState() == TradeState.ACCEPTED || getTradeState() == TradeState.DECLINED) { Player actingPlayer = this.getActing(); Player partnerPlayer = this.getPartner(); if (actingPlayer.equals(getMe())) { this.gameField.endTrade(); } else if (partnerPlayer.equals(getMe())) { this.gameField.endTrade(); } chatWindow.write(new ChatMessage(new Date(), null, false, "" + actingPlayer.getName() + " handelte mit " + partnerPlayer.getName())); gameField.init(getGameState(), this); for (int i = 0; i < getGameState().getPlayers().length; i++) { playerInfoWindow.changeCash(getGameState().getPlayerById(i), getGameState().getPlayerById(i).getBalance()); } } } @Override public void onBankruptcy() { for (Player player : getGameState().getPlayers()) { if (player.getIsBankrupt()) { playerInfoWindow.setBancrupt(player); gameField.playerIsBancrupt(player); if (player.getId() == getMe().getId()) { this.bankrupt = true; downRight.remove(rollButton); downRight.remove(endTurnButton); downRight.repaint(); downRight.revalidate(); } } } } @Override public void onCardPull(String text, boolean communityCard) { // Passiert nix? System.out.println("-- DEBUG -- on CardPull " + text); chatWindow.write(new ChatMessage(new Date(), null, false, "-- DEBUG -- on CardPull " + text)); } @Override public void onDiceValues(int[] diceValues) { gameField.dices(diceValues); } @Override public void onStartGame(Player[] players) { if (notInit) { gameField = new GameField(this); rightWindow1.removeAll(); rightWindow1.revalidate(); downWindow.removeAll(); downWindow.revalidate(); GUIFrame.remove(window); pane.removeAll(); pane.revalidate(); notInit = false; gameField.init(getGameState(), this); playerInfoWindow.setLanguage(language); gameField.setLanguage(language); gameField.redraw(); // System.out.println("Es gibt " // + this.getGameState().getPlayers().length + " Spieler."); for (int i = 0; players.length > i; i++) { // System.out.println(this.getGameState().getPlayers()[i].getName()+" wurde hinzugefügt mit "+this.getGameState().getPlayers()[i].getBalance()+" Kohle."); this.playerInfoWindow.addPlayer(players[i]); } this.menuState = MenuState.GAME; this.menubar.setMenuBarState(menuState); rightWindow1.add(playerInfoWindow); rightWindow1.add(chatWindow); downWindow.add(cardWindow); cardWindow = new CardWindow(this); ActionListener buyListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { accept(); // System.out // .println("BUYYYYYYYY THISSSSSS!!!! I NEEEED IT SOOOO MUCH"); } }; buyButton.addActionListener(buyListener); ActionListener rollListener = new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // System.out.println("Rolly Rolly"); haveIalreadyRolled = true; rollDice(); } }; rollButton.addActionListener(rollListener); ActionListener endTurnListener = new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { System.out.println("Turn is ENDED!!! FREE THE HOSTAGE OR I WILL END IT WITH ENDTURN()!!!! OK YOU WANTED IT LIKE THIF!"); haveIalreadyRolled = false; decline(); endTurn(); GUIClient.this.endTurnButton.setEnabled(false); } }; endTurnButton.addActionListener(endTurnListener); buyButton.setLayout(new FontLayout()); rollButton.setLayout(new FontLayout()); endTurnButton.setLayout(new FontLayout()); jeremiasButton.add(new JLabel("JeremiasButton")); ActionListener jeremiasListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { rollDice(); rollDice(); rollDice(); accept(); endTurn(); } }; ; ; jeremiasButton.addActionListener(jeremiasListener); // HIER IST DER JEREMIAS KNOPF downRight.add(jeremiasButton); downRight.setLayout(new GridLayout(1, 0)); rightWindow1.setLayout(new GridLayout(0, 1)); downRight.add(rollButton); downRight.add(endTurnButton); pane.add(gameField); pane.add(rightWindow1); pane.add(downWindow); pane.add(downRight); pane.setLayout(new OJIMLayout()); for (int i = 0; players.length > i; i++) { try { gameField.playerMoves(getGameState() .getFieldAt(Math.abs(0)), getGameState() .getPlayerById(i)); } catch (NullPointerException e) { } } pane.setSize(new Dimension(settings.getWidth(), settings .getHeight())); GUIFrame.add(pane); } } @Override public void onTurn(Player player) { cardWindow.jailCards(player.getNumberOfGetOutOfJailCards()); playerInfoWindow.turnOn(player); // System.out.println("Player has changed to "+player.getName()); if (player.getId() != getMe().getId()) { downRight.remove(rollButton); downRight.remove(endTurnButton); downRight.repaint(); downRight.revalidate(); } else { if (this.bankrupt != true) { downRight.add(rollButton); downRight.add(endTurnButton); } } } @Override public void setName(String name) { super.setName(name); } /** * Öffnet ein neues Frame für die Spielerstellung */ public void openCreateGameWindow() { createGameFrame.setVisible(true); } /** * Beendet das Spiel */ public void leaveGame() { notInit = true; System.out.println("END!!"); pane.removeAll(); window.removeAll(); // pane = new JPanel(); // window = new JPanel(); pane.revalidate(); window.revalidate(); GUIFrame.remove(pane); GUIFrame.repaint(); try { server.endGame(); } catch (NullPointerException e) { e.printStackTrace(); } menuState = MenuState.MAIN_MENU; this.menubar.setMenuBarState(menuState); } /** * Öffnet ein neues Frame für das Spielbeitreten */ public void openJoinGameWindow() { joinGameFrame.showJoin(); joinGameFrame.setVisible(true); } /** * Öffnet ein neues Frame für das Spielbeitreten */ public void openServerListWindow() { joinGameFrame.showServerList(); joinGameFrame.setVisible(true); } /** * Öffnet ein neues Frame für das Beitreten per Direkter Verbindung */ public void openDirectConnectionWindow() { joinGameFrame.showDirectConnection(); joinGameFrame.setVisible(true); } /** * Öffnet ein neues Frame für den Abouttext */ public void openAboutWindow() { aboutFrame.draw(); aboutFrame.setVisible(true); } /** * Öffnet ein neues Frame für den Hilfetext */ public void openHelpWindow() { helpFrame.draw(); helpFrame.setVisible(true); } /** * Ändert die Sprache * * @param languageName * neue Sprache */ public void changeLanguage(String languageName) { for (int i = 0; i < language.getLanguages().length; i++) { if (language.getLanguages()[i].name.equals(languageName)) { language.setLanguage(language.getLanguages()[i]); resetLanguage(); } } } /** * setzt die Sprache der verschiedenen Elemente auf die Klassensprache */ private void resetLanguage() { GUIFrame.setTitle(language.getText(TextKey.OJIM)); createGameFrame.setTitle(language.getText(TextKey.CREATE_GAME)); createGameFrame.setLanguage(language); joinGameFrame.setTitle(language.getText(TextKey.JOIN_GAME)); joinGameFrame.setLanguage(language); settingsFrame.setTitle(language.getText(TextKey.SETTINGS)); settingsFrame.setLanguage(language); helpFrame.setTitle(language.getText(TextKey.HELP)); helpFrame.setLanguage(language); aboutFrame.setTitle(language.getText(TextKey.ABOUT)); aboutFrame.setLanguage(language); menubar.language(language); chatWindow.setLanguage(language); playerInfoWindow.setLanguage(language); buyButton.setText(language.getText(TextKey.BUY)); endTurnButton.setText(language.getText(TextKey.ENDTURN)); rollButton.setText(language.getText(TextKey.ROLL)); if (gameField != null) { gameField.setLanguage(language); } button.setText(language.getText(TextKey.READY)); draw(); } @Override public void onAuction() { if (this.getGameState().getAuction() != null) { switch (this.getGameState().getAuction().getState()) { case WAITING: Player bidder = this.getGameState().getAuction() .getHighestBidder(); if (bidder != null) { this.chatWindow.write(new ChatMessage(new Date(), null, false, language.getText(TextKey.AUCTION_RESET))); } else { this.chatWindow.write(new ChatMessage(new Date(), null, false, language.getText(TextKey.AUCTION_INIT))); } break; case FIRST: this.chatWindow.write(new ChatMessage(new Date(), null, false, language.getText(TextKey.AUCTION_FIRST))); break; case SECOND: this.chatWindow.write(new ChatMessage(new Date(), null, false, language.getText(TextKey.AUCTION_SECOND))); break; case THIRD: this.chatWindow.write(new ChatMessage(new Date(), null, false, language.getText(TextKey.AUCTION_THIRD))); this.gameField.removeAuction(); break; } if (this.getGameState().getAuction().getState() != AuctionState.THIRD) { downRight.remove(buyButton); this.GUIFrame.repaint(); gameField.showAuction(this.getGameState().getAuction()); } } else { this.gameField.removeAuction(); } } /** * Öffnet das Einstellungenfenster */ public void openSettingsWindow() { settingsFrame.draw(); settingsFrame.setVisible(true); } /** * Startet ein neues Spiel und öffnet den Warteraum * * @param string * @param k * @param j */ public void startServer(String serverName, int maxPlayers, int kiPlayers, String host) { bankrupt = false; pane.removeAll(); window.removeAll(); pane.revalidate(); window.revalidate(); GUIFrame.remove(pane); GUIFrame.repaint(); setName(settings.getPlayerName()); menuState = MenuState.WAITING_ROOM; server = new OjimServer(serverName); server.initRMIGame(maxPlayers, kiPlayers, host); connect(server); // connect("192.168.0.1",60); leftWindow.remove(chatWindow); leftWindow.setLayout(new GridLayout(0, 1)); rightWindow.remove(playerInfoWindow); rightWindow.remove(button); button.setText(language.getText(TextKey.READY)); window.setLayout(new GridLayout(1, 0)); rightWindow.setLayout(new GridLayout(0, 1)); playerInfoWindow = new PlayerInfoWindow(this); chatWindow = new ChatWindow(language, this); playerInfoWindow.setLanguage(language); rightWindow.add(playerInfoWindow); leftWindow.add(chatWindow); ActionListener clickedOnReady = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ready(); } }; ; ; button.addActionListener(clickedOnReady); rightWindow.add(button); for (int i = 0; this.getGameState().getPlayers().length > i; i++) { // System.out.println(this.getGameState().getPlayers()[i].getName()+" wurde hinzugefügt mit "+this.getGameState().getPlayers()[i].getBalance()+" Kohle."); this.playerInfoWindow .addPlayer(this.getGameState().getPlayers()[i]); } window.add(leftWindow); window.add(rightWindow); GameField.addMe(getMe()); GUIFrame.add(window); createGameFrame.setVisible(false); draw(); } @Override public void onNewPlayer(Player player) { draw(); } @Override public void onPlayerLeft(Player player) { draw(); } /** * Verschickt eine Nachricht im Chat * * @param text * die zu verschickende Nachricht */ public void sendOutMessage(String text) { sendMessage(text); draw(); } /** * Startet eine Verbindung über eine IP * * @param ip * die IP zu der verbunden werden muss * @param port * der Port */ public void startIpConnection(String ip, int port) { connect(ip, port); System.out .println("Starte Verbindung zu IP :" + ip + ", Port: " + port); } public void upgradeField(int position, int parseInt) { construct((Street) getGameState().getFieldAt(position)); } public void downgradeField(int position, int parseInt) { destruct((Street) getGameState().getFieldAt(position)); } public void trade(Player tradePartner, int cash, List<BuyableField> myFields, List<BuyableField> hisFields, int outOfJailCards) { if (getTradeState() == TradeState.WAITING_PROPOSAL || getTradeState() == TradeState.WAITING_PROPOSED) { accept(); } else { initTrade(tradePartner); offerCash(cash); for (BuyableField buyableField : myFields) { System.out.println("Meine Felder: " + buyableField.getName()); this.offerEstate(buyableField); } for (BuyableField buyableField : hisFields) { System.out.println("Seine Felder: " + buyableField.getName()); this.requireEstate(buyableField); } offerGetOutOfJailCard(outOfJailCards); System.out.println("Ok Meista, hab nun gehandelt!!"); proposeTrade(); } } public void showTrade(int player, boolean otherTrade) { if (this.menuState == MenuState.GAME) { gameField.showTrade(getMe(), getGameState().getPlayerById(player), getRequiredCash(), getRequiredEstates(), getNumberOfRequiredGetOutOfJailCards(), getOfferedCash(), getOfferedEstate(), getNumberOfOfferedGetOutOfJailCards(), otherTrade); } } public void acceptBid(int amount) { placeBid(amount); accept(); } /** * Diese Funktion fügt eine Straße mit einem Mindestgebot zur Auktion hinzu * * @param text * Straßenname * @param newBidRate * Auktionsminimumangebot */ public void startNewAuction(String text, JTextField newBidRate) { } public org.ojim.logic.state.fields.Field getFieldByPosition(String position) { try { return getGameState().getFieldAt(Integer.parseInt(position)); } catch (NullPointerException e) { System.out.println("GetFieldByPosition GUI Client NPE"); return null; } } public void noTrade() { if (getTradeState() == TradeState.WAITING_PROPOSAL || getTradeState() == TradeState.WAITING_PROPOSED) { decline(); } } public void swtichCard(Field field) { System.out.println("toogleMortage(" + field.getName() + ") im GUI Client"); toggleMortgage((BuyableField) field); } public Player getPlayerMe() { return getMe(); } /** * Free from Jail * * @param i * 0 = Karte, anderes = Geld */ public void freeMe(int i) { if (i == 0) { useGetOutOfJailCard(); } else { payFine(); } } public boolean getIsBankrupt() { return this.bankrupt; } public int getMaxHouses() { return getGameRules().getMaximumBuilidings(); } @Override public void onCanEndTurn(Player player) { if (player.equals(this.getMe())) { this.endTurnButton.setEnabled(true); } } @Override public void onBuyEvent(Player player, BuyableField field) { // TODO Auto-generated method stub } @Override public void onFreeParkingChange(FreeParking field) { // TODO Auto-generated method stub } }