// 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:   Player.java

package server;

import java.io.*;
import java.net.Socket;
import java.util.StringTokenizer;
import java.util.Vector;

// Referenced classes of package server:
//            GameTable, _German, SkrabbleServer

public class Player extends Thread
{

    Player(SkrabbleServer skrabbleserver, String s, Socket socket, DataOutputStream dataoutputstream, DataInputStream datainputstream)
    {
        onTable = new Vector();
        onTableObserver = new Vector();
        noError = true;
        it = new int[5];
        serv = skrabbleserver;
        name = s;
        sock = socket;
        outo = dataoutputstream;
        ino = datainputstream;
        pid = nextPid++;
    }

    public void addOnTable(GameTable gametable)
    {
        onTable.addElement(gametable);
    }

    void fillit(int i)
        throws Exception
    {
        for(int j = 0; j < i; j++)
            it[j] = Integer.parseInt(sto.nextToken());

    }

    int nextint()
        throws Exception
    {
        try
        {
            return Integer.parseInt(sto.nextToken());
        }
        catch(Exception exception)
        {
            throw exception;
        }
    }

    public void removeFromTables()
    {
        int i = onTable.size();
        for(int j = 0; j < i; j++)
            ((GameTable)onTable.elementAt(0)).leave(this);

    }

    public void removeOnTable(GameTable gametable)
    {
        onTable.removeElement(gametable);
    }

    public void run()
    {
        try
        {
            sock.setSoTimeout(PLAYER_TIMEOUT);
            sock.setTcpNoDelay(true);
        }
        catch(Exception _ex) { }
        for(int i = 0; i < _German.TXT_INVITATION.length; i++)
            send(serv._say(_German.TXT_INVITATION[i]));

        serv.broadcast(serv._addPlayer(name));
        String s = Integer.toString(1) + '\n';
        int j = -1;
        int ai[] = null;
        Object obj = null;
        String s2 = null;
        while(noError) 
        {
            try
            {
                String s1 = ino.readLine();
                sto = new StringTokenizer(s1);
                j = nextint();
            }
            catch(Exception _ex)
            {
                noError = false;
            }
            if(noError)
                switch(j)
                {
                default:
                    break;

                case 1: // '\001'
                    send(s);
                    break;

                case 11: // '\013'
                    try
                    {
                        fillit(2);
                        s2 = ino.readLine();
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(!noError)
                        break;
                    if(it[0] == -1)
                    {
                        if(it[1] == -1)
                            serv.broadcast(serv._say(s2));
                        else
                            serv.broadcast(serv._say('<' + name + "> " + s2));
                        break;
                    }
                    if(s2.equalsIgnoreCase("/STATUS") || s2.equalsIgnoreCase(_German.CMD_HOWMANY))
                        serv.gameTilesNumbers(it[0], it[1], this);
                    else
                        serv.sayOnTable(it[0], it[1], '<' + name + "> " + s2);
                    break;

                case 13: // '\r'
                case 14: // '\016'
                    try
                    {
                        fillit(2);
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.gameMoveAcceptance(it[0], it[1], j == 13, this);
                    break;

                case 15: // '\017'
                    try
                    {
                        fillit(5);
                        ai = new int[it[4]];
                        for(int k = 0; k < it[4]; k++)
                            ai[k] = nextint();

                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.gameOKMove(it[0], it[1], it[2], it[3], ai, this);
                    break;

                case 17: // '\021'
                    try
                    {
                        fillit(3);
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.gamePassMove(it[0], it[1], it[2], this);
                    break;

                case 16: // '\020'
                    try
                    {
                        fillit(4);
                        ai = new int[it[3]];
                        for(int l = 0; l < it[3]; l++)
                            ai[l] = nextint();

                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    serv.gameExchangeMove(it[0], it[1], it[2], ai, this);
                    break;

                case 12: // '\f'
                    try
                    {
                        fillit(2);
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.gameStart(it[0], it[1]);
                    break;

                case 7: // '\007'
                    try
                    {
                        it[0] = nextint();
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.joinTable(it[0], this);
                    break;

                case 9: // '\t'
                    try
                    {
                        it[0] = nextint();
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.leaveTable(it[0], this);
                    break;

                case 6: // '\006'
                    try
                    {
                        fillit(2);
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.newTable(it[0], it[1], this);
                    break;

                case 18: // '\022'
                    try
                    {
                        fillit(3);
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.timeoutMove(it[0], it[1], it[2], this);
                    break;

                case 19: // '\023'
                    try
                    {
                        fillit(3);
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        serv.timeoutGame(it[0], it[1], it[2], this);
                    break;

                case 5: // '\005'
                    noError = false;
                    break;

                case 3: // '\003'
                    try
                    {
                        it[0] = nextint();
                    }
                    catch(Exception _ex)
                    {
                        noError = false;
                    }
                    if(noError)
                        send(Integer.toString(2) + ' ' + it[0]);
                    break;
                }
        }
        serv.removePlayer(this);
        try
        {
            outo.close();
        }
        catch(Exception _ex) { }
        try
        {
            ino.close();
        }
        catch(Exception _ex) { }
        try
        {
            sock.close();
        }
        catch(Exception _ex) { }
    }

    public synchronized void send(String s)
    {
        if(noError)
            try
            {
                outo.writeBytes(s);
            }
            catch(Exception _ex)
            {
                noError = false;
            }
    }

    static int nextPid = 1;
    static int PLAYER_TIMEOUT = 0x2bf20;
    SkrabbleServer serv;
    String name;
    int pid;
    Vector onTable;
    Vector onTableObserver;
    Socket sock;
    DataOutputStream outo;
    DataInputStream ino;
    boolean noError;
    int it[];
    StringTokenizer sto;

}
