phantasia4/
phantasia4/conf/
phantasia4/phantasia/bin/
phantasia4/phantasia/src/utilities/
phantasia4/public_html/cgi-bin/
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.Event;
import java.applet.*;

public class pClient extends Applet implements constants {

	/* Window components */
    Frame f = new Frame("Phantasia v4");
    statusPne status = new statusPne(this);
    buttonPne buttons = new buttonPne(this);
    msgPne messages = new msgPne(this);
    userPne users = new userPne(this);
    chatPne chat = new chatPne(this);
    compassPne compass = new compassPne(this);
    Panel rightPane = new Panel();

    errorDlog errorDialog = new errorDlog(this);

    Socket socket = null;
    lThread listen = null;
    DataOutputStream output = null;
    DataInputStream input = null;

    int ioStatus = NO_REQUEST;


    public void init()
    {
	f.resize(600, 400);
	f.setLayout(new GridBagLayout());
	
	GridBagConstraints constraints = new GridBagConstraints();

	addComponent(status, 0, 0, 2, 1, 0, 0);
	addComponent(messages, 0, 1, 1, 1, 1, 1);
	addComponent(buttons, 0, 2, 1, 1, 0, 0);
	addComponent(chat, 0, 3, 1, 1, 1, 2);
	addComponent(rightPane, 1, 1, 1, 3, 0, 0);

	rightPane.setLayout(new BorderLayout(0, 1));
	rightPane.add("South", compass);
	rightPane.add("Center", users);

	f.setBackground(backgroundColor);

/*
	f.pack();
*/
		
	    /* show the frame */
	f.show();

	status.setImages();

	    /* set up the socket */
        try {
	    socket = new Socket(this.getCodeBase().getHost(), 43302);
	    output = new DataOutputStream(socket.getOutputStream());
	    input = new DataInputStream(socket.getInputStream());
        }
        catch (Exception e) {
            System.out.println("Error: " + e);
	    errorDialog.bringUp("The system can not connect to the server.",
		    "The server could be down or a firewall could exist between you and it.",
		    "Please try again later.");
	    pClientQuit();
        }

	    /* start the listen thread */
	listen = new lThread(this);
	listen.start();
    }

    private void addComponent(Panel item, int x, int y, int width, int height, int weightx, int weighty) {

	GridBagConstraints constraints = new GridBagConstraints();

	    /* add the status area to the frame */
	constraints.gridx = x;
	constraints.gridy = y;
	constraints.gridwidth = width;
	constraints.gridheight = height;
	constraints.weightx = weightx;
	constraints.weighty = weighty;
	constraints.fill = GridBagConstraints.BOTH;
	constraints.anchor = GridBagConstraints.CENTER;
	constraints.insets.top = 2;
	constraints.insets.bottom = 2;
	constraints.insets.left = 2;
	constraints.insets.right = 2;
	((GridBagLayout)f.getLayout()).setConstraints(item, constraints);
	f.add(item);
    }

    public void pClientQuit() {

	    /* destroy the listen thread */
	if (listen != null) {
	    listen.stop();
	    listen = null;
	}

	    /* close the socket */
	if (socket != null) {
	    try {
	        socket.close();
	    }
	    catch (IOException e) {
	        System.out.println("Error: " + e);
	    }
	    socket = null;
	}

	    /* remove the main windw */
	f.hide();
	f.dispose();
	stop();
    }

    public boolean handleEvent(Event evt) {

	    /* if the user closed the frame, destroy the game */
	if (evt.id == Event.WINDOW_DESTROY) {
	    pClientQuit();
	}
	    /* otherwise handle normally */
	return(super.handleEvent(evt));
    }

    public String readString() {

	String message = "";
	
	    try {
		message = input.readLine();
	    }
	    catch (Exception e) {
		System.out.println("Error: " + e);
	        errorDialog.bringUp("There was an error reading from the socket.",
		        "readString error: " + e, "The game will now terminate.");
	    }
/*
System.out.println("Returning from socket: " + message);
*/

	return(message);
    }

    public long readLong() {
	return(Long.parseLong(readString()));
    }

    synchronized public void sendString(String theString) {
	try {
	    output.writeBytes(theString);
	}
	catch (Exception e) {
	        System.out.println("Error: " + e);
	        errorDialog.bringUp("There was an error writing to the socket.",
		        "sendString error: " + e, "The game will now terminate.");
	}
    }

    synchronized public boolean pollSendFlag(int ioArea) {
	
	if (ioStatus == ioArea) {
	    ioStatus = NO_REQUEST;
	    return true;
	}

	return false;
    }

    public void raiseSendFlag(int ioArea) {

	if (ioStatus != NO_REQUEST) {
	    errorDialog.bringUp("Client attempted to have two i/o sources.",
		    "The game will now terminate.", "");
	}

	ioStatus = ioArea;
    }

    public void handlePing() {

	int ioArea = ioStatus;

	if (ioStatus != NO_REQUEST && pollSendFlag(ioArea)) {

	    sendString(C_PING_PACKET);

	    switch(ioArea) {

	    case BUTTONS:
	        buttons.timeout();
		break;

	    case STRING_DLOG:
		listen.stringDialog.timeout();
		break;

	    case COORD_DLOG:
		listen.coordinateDialog.timeout();
		break;

	    case PLAYER_DLOG:
		listen.playerDialog.timeout();
		break;

	    case PASS_DLOG:
		listen.passwordDialog.timeout();
		break;
	    }
	}
    }
}