// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   SkrabbleServer.java

package server;

import java.io.*;
import java.net.*;
import java.util.Enumeration;
import java.util.Vector;

// Referenced classes of package server:
//            GameTable, _German, Player

public class SkrabbleServer
    implements Runnable
{

    public SkrabbleServer(int i)
    {
        players = new Vector();
        table = new GameTable[25];
        portNumber = i;
        System.out.println("SkrabbleServer v" + _German.version + ",  Marek Futrega / MAF");
        boolean flag = false;
        try
        {
            ssock = new ServerSocket(portNumber);
        }
        catch(IOException ioexception)
        {
            ioexception.printStackTrace();
            flag = true;
        }
        try
        {
            System.out.println(InetAddress.getLocalHost() + ", port:" + ssock.getLocalPort() + "\n");
        }
        catch(Exception _ex) { }
        if(!flag)
        {
            serverActive = true;
            (new Thread(this)).start();
        }
    }

    public String _addPlayer(String s)
    {
        return Integer.toString(5) + '\n' + s + '\n';
    }

    public String _removePlayer(String s)
    {
        return Integer.toString(6) + '\n' + s + '\n';
    }

    public String _say(String s)
    {
        return Integer.toString(21) + ' ' + -1 + ' ' + 0 + '\n' + s + '\n';
    }

    public synchronized void broadcast(String s)
    {
        int i = players.size();
        for(int j = 0; j < i; j++)
        {
            tp = (Player)players.elementAt(j);
            tp.send(s);
        }

    }

    public synchronized void broadcastBut(Player player, String s)
    {
        int i = players.size();
        for(int j = 0; j < i; j++)
        {
            tp = (Player)players.elementAt(j);
            if(tp != player)
                tp.send(s);
        }

    }

    public void broadcastNosync(String s)
    {
        int i = players.size();
        for(int j = 0; j < i; j++)
        {
            tp = (Player)players.elementAt(j);
            tp.send(s);
        }

    }

    public void broadcastNosyncBut(Player player, String s)
    {
        int i = players.size();
        for(int j = 0; j < i; j++)
        {
            tp = (Player)players.elementAt(j);
            if(tp != player)
                tp.send(s);
        }

    }

    public void gameExchangeMove(int i, int j, int k, int ai[], Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].moveExchange(player, ai, k);
    }

    public void gameMoveAcceptance(int i, int j, boolean flag, Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].acceptMove(flag, player);
    }

    public void gameOKMove(int i, int j, int k, int l, int ai[], Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].moveOK(player, ai, k, l);
    }

    public void gamePassMove(int i, int j, int k, Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].movePass(player, k);
    }

    public synchronized void gameStart(int i, int j)
    {
        if(table[i].gameId == j)
            table[i].startGame();
    }

    public void gameTilesNumbers(int i, int j, Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].tilesNumbers(player);
    }

    public synchronized void joinTable(int i, Player player)
    {
        if(table[i].joinable)
            table[i].join(player);
    }

    public synchronized void leaveTable(int i, Player player)
    {
        table[i].leave(player);
    }

    public static void main(String args[])
    {
        int i = 13279;
        for(int j = 0; j < args.length; j++)
            if(args[j].startsWith("-port"))
                try
                {
                    i = Integer.parseInt(args[j].substring(5));
                }
                catch(Exception _ex) { }

        new SkrabbleServer(i);
    }

    public synchronized void newTable(int i, int j, Player player)
    {
        if(GameTable.numberOfVacant > 0)
        {
            int k;
            for(k = 0; !table[k].vacant; k++);
            table[k].startUp(player, i, j);
        }
    }

    public synchronized void removePlayer(Player player)
    {
        players.removeElement(player);
        player.removeFromTables();
        if(serverActive)
            broadcastNosync(_removePlayer(player.name));
    }

    public void run()
    {
        for(int i = 0; i < 25; i++)
            table[i] = new GameTable(this, i);

        GameTable.numberOfVacant = 25;
        Exception exception = new Exception("ServerOvercrowdedException");
        while(serverActive) 
        {
            Socket socket = null;
            Object obj = null;
            DataOutputStream dataoutputstream = null;
            DataInputStream datainputstream = null;
            try
            {
                socket = ssock.accept();
                socket.setSoTimeout(15000);
                dataoutputstream = new DataOutputStream(socket.getOutputStream());
                datainputstream = new DataInputStream(socket.getInputStream());
                String s = datainputstream.readLine();
                Player player;
                if(s.equals(_German.VID))
                {
                    String s1 = datainputstream.readLine();
                    player = new Player(this, s1, socket, dataoutputstream, datainputstream);
                } else
                {
                    System.out.println("## SABOTAGE?!");
                    throw exception;
                }
                socket.setSoTimeout(0);
                if(players.size() >= 100)
                {
                    player.send("OVERCROWDED\n");
                    throw exception;
                }
                synchronized(this)
                {
                    sendCurrentStatus(player);
                    players.addElement(player);
                }
                player.start();
            }
            catch(Exception _ex)
            {
                try
                {
                    if(datainputstream != null)
                        datainputstream.close();
                }
                catch(Exception _ex2) { }
                try
                {
                    if(dataoutputstream != null)
                        dataoutputstream.close();
                }
                catch(Exception _ex2) { }
                try
                {
                    if(socket != null)
                        socket.close();
                }
                catch(Exception _ex2) { }
            }
        }
        synchronized(this)
        {
            for(Enumeration enumeration = players.elements(); enumeration.hasMoreElements();)
            {
                Player player1 = (Player)enumeration.nextElement();
                try
                {
                    player1.sock.close();
                }
                catch(Exception _ex) { }
            }

        }
        try
        {
            ssock.close();
        }
        catch(IOException _ex) { }
    }

    public void sayOnTable(int i, int j, String s)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].say(s);
    }

    public void sendCurrentStatus(Player player)
    {
        int i = GameTable.numberOfVacant <= 0 ? 0 : 1;
        int j = players.size();
        StringBuffer stringbuffer = new StringBuffer(Integer.toString(player.pid) + ' ' + i + ' ' + j + '\n');
        for(int k = 0; k < j; k++)
            stringbuffer.append(((Player)players.elementAt(k)).name).append('\n');

        stringbuffer.append(Integer.toString(25) + '\n');
        for(int l = 0; l < 25; l++)
        {
            stringbuffer.append(table[l].gameOver ? 2 : ((int) (table[l].startedGame ? 1 : 0))).append(' ').append(table[l].nop).append('\n');
            for(int i1 = 0; i1 < table[l].nop; i1++)
                stringbuffer.append("  ").append(table[l].names[i1]).append('\n');

        }

        player.send(stringbuffer.toString());
    }

    public void shut()
    {
        serverActive = false;
        if(ssock != null)
            try
            {
                ssock.close();
            }
            catch(Exception _ex) { }
    }

    public void timeoutGame(int i, int j, int k, Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].timeoutGame(player, k);
    }

    public void timeoutMove(int i, int j, int k, Player player)
    {
        if(table[i] != null && table[i].gameId == j)
            table[i].timeoutMove(player, k);
    }

    static final int MAX_TAB = 25;
    static final int INIT_TIMEOUT = 15000;
    static final int MAX_PLAYERS = 100;
    static final int DEFAULT_PORT_NUMBER = 13279;
    int portNumber;
    public boolean serverActive;
    ServerSocket ssock;
    Vector players;
    Player tp;
    GameTable table[];
}
