/* LSAGPI                                      */
/* Desarrollado por Miguel Angel Pescador Santirso  */
/* mescadorsantirso@gmail.com                       */

/* LICENCIA X11/MIT
Copyright (c) 2010 Miguel Angel Pescador Santirso

Se autoriza, de forma gratuita, a cualquier
persona que ha obtenido una copia de este software y
archivos asociados de documentación (el "Software"), para tratar en el
Software sin restricción, incluyendo sin ninguna limitación en lo que concierne
los derechos para usar, copiar, modificar, fusionar, publicar,
distribuir, sublicenciar, y / o vender copias de este
Software, y para permitir a las personas que usan el Software para
hacerlo, con sujeción a las siguientes condiciones:

El aviso de copyright anterior y este aviso de permiso
se incluirá en todas las copias o partes sustanciales de
este Software.

EL SOFTWARE SE ENTREGA "TAL CUAL", SIN GARANTÍA DE NINGÚN
TIPO, EXPRESA o implícita, no limitado a la GARANTÍAS DE
COMERCIALIZACIÓN, CAPACIDAD DE HACER Y DE NO INFRACCIÓN DE COPYRIGHT. EN NINGÚN
CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES DE
NINGUNA RECLAMACIÓN, daños o OTRAS RESPONSABILIDADES,
YA SEA EN UN LITIGIO, agravio o DE OTRO MODO,
DERIVADAS DE, FUERA DE O EN CONEXION CON EL
SOFTWARE SU UTILIZACIÓN U OTRAS OPERACIONES EN EL SOFTWARE.
*/


package lsagpi_ps3;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
import javax.tv.xlet.XletStateChangeException;
import org.havi.ui.HScene;
import org.havi.ui.HSceneFactory;

/**
 * Clase principal del Motor
 * @author Miguel Angel
 */
public class lsagpi_ps3 implements Xlet{
    Aventura panel;
    static Vector habitaciones=new Vector();
    static Vector accionesglobales=new Vector();
    static Sistema sistem;
    private HScene scene;
    

    public void destroyXlet(boolean unconditional) {
        scene.remove(panel);
        scene = null;
    }

    public void initXlet(XletContext context) {

            String archivo;
            archivo = getParameter("Archivo");
            System.out.println(archivo);
            URL url0=null;
            try {
             url0= new URL(getCodeBase().toString() + archivo); //this.getClass().getResource(archivo);
            } catch (MalformedURLException ex) {}
            //File archivoentrada=new File(url0);
            Preprocesador prepro = new Preprocesador(lsagpi_ps3.LeerEntrada(url0));
            lsagpi_ps3.AnalizarEntrada(prepro.getRetorno());
            panel = new Aventura(sistem, habitaciones, accionesglobales);
            // TODO start asynchronous download of heavy resources


       
        scene = HSceneFactory.getInstance().getDefaultHScene();
        

        panel.setSize(1920, 1080);  // BD screen size
        scene.add(panel, BorderLayout.CENTER);
        scene.validate();
    }

    public void pauseXlet() {
        panel.setVisible(false);
    }

    public void startXlet() {
        panel.setVisible(true);
        scene.setVisible(true);
    }
    /**
     * Lee el archivo de entrada.
     * @param archivoentrada Archivo a leer.
     * @return String contenido del archivo.
     */
    public static String LeerEntrada(URL archivoentrada){
        String abs = new String();
        InputStreamReader in = null;
        try{
        InputStream is = archivoentrada.openStream();
        //File file = archivoentrada;

            in = new InputStreamReader(is);
        }catch(IOException e){
            System.exit(1);
        }
        char[] buffer = new char[4096];
        int len;
        try
        {
                while ((len = in.read(buffer)) != -1)
                {
                    String s = new String(buffer, 0, len);
                    abs += s;
                };
        }catch (IOException ioe) {/*Excepción vacia necesaria solo para compilación ya que el control de archivo se ha hecho anteriormente*/ }

        return abs;
    }
     /**
     * Analiza la entrada parseando cada objeto.
     * @param entrada String con el contenido del fichero de entrada.
     */
    public static void AnalizarEntrada(String entrada){
        StringTokenizer stoken = new StringTokenizer(entrada,"\n",true);
        boolean sistemadefecto=true;
        while (stoken.hasMoreTokens())
		{
            String cadena=stoken.nextToken();
            if(cadena.indexOf("SISTEMA")!=-1){
                System.out.println("Valores de sistema.");
                while(cadena.indexOf("{")==-1)
                    cadena=stoken.nextToken();
                cadena=stoken.nextToken();

                String instruccion=new String("");
                int contador=0;
                instruccion+=cadena;
                while( contador!=(-1) && stoken.hasMoreTokens()){
                       String cadena_contador=stoken.nextToken();
                       instruccion+=cadena_contador;
                       if(cadena_contador.indexOf("{")!=-1){
                           contador++;
                           instruccion+=cadena_contador;
                       }
                       if(cadena_contador.indexOf("}")!=-1){
                           contador--;
                           instruccion+=cadena_contador;
                       }
                    }
                    sistem=new Sistema(instruccion);
                    //System.out.println("------------Inicio SISTEMA");
                    //System.out.println(instruccion);
                    //System.out.println("------------Fin SISTEMA");
                    sistemadefecto=false;
            }


            if(cadena.indexOf("CUARTO")!=-1){
                System.out.println("Un cuarto.");
                StringTokenizer nom_tok=new StringTokenizer(cadena);
                String nombre=new String("");
                if(nom_tok.nextToken().equals("CUARTO")){
                    nombre=nom_tok.nextToken();
                }
                String cuarto=new String("");
                int contador=0;
                while( contador!=(-1) && stoken.hasMoreTokens()){
                       String cadena_contador=stoken.nextToken();
                       if(cadena_contador.indexOf("{")==0){
                           cadena_contador=stoken.nextToken();
                       }
                       cuarto+=cadena_contador;
                       if(cadena_contador.indexOf("{")!=-1){
                           contador++;
                           cuarto+=cadena_contador;
                       }
                       if(cadena_contador.indexOf("}")!=-1){
                           contador--;
                           cuarto+=cadena_contador;
                       }
                    }
                habitaciones.add(new Cuarto(cuarto, nombre));
                }
            if(cadena.indexOf("INSTRUCCION")!=-1){
                System.out.println("Una instruccion global");
                String instruccion=new String("");
                int contador=0;
                instruccion+=cadena;
                while( contador!=(-1) && stoken.hasMoreTokens()){
                       String cadena_contador=stoken.nextToken();
                       instruccion+=cadena_contador;
                       if(cadena_contador.indexOf("{")!=-1){
                           contador++;
                           instruccion+=cadena_contador;
                       }
                       if(cadena_contador.indexOf("}")!=-1){
                           contador--;
                           contador--;
                           instruccion+=cadena_contador;
                       }
                    }
                    accionesglobales.add(new Accion(instruccion));
           }

           }
        if(sistemadefecto){
            String sisdefaultstring="SISTEMA\n{\n    ANDAR\n    {\n        ETIQUETA { \"Andar a\" }\n	  IMAGEN { \"gr/btn_andara.jpg\" }\n        TINTA { 0 255 255 }\n	PAPEL { 0 0 0 }\n        TECLA { \"w\" }\n    }\n    VERBO Dar\n    {\n        ETIQUETA { \"Dar\" }\n	  IMAGEN { \"gr/btn_dar.jpg\" }\n        SENTENCIA { 2 \"a\" }\n        TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n        TECLA { \"g\" }\n    }\n    VERBO Coger\n    {\n        ETIQUETA { \"Coger\" }\n	  IMAGEN { \"gr/btn_coger.jpg\" }\n        TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n	TECLA { \"p\" }\n    }\n    VERBO Usar\n    {\n        ETIQUETA { \"Usar\" }\n	  IMAGEN { \"gr/btn_usar.jpg\" }\n        SENTENCIA { * \"con\" }\n        TINTA { 165 156 132 }\n        PAPEL { 80 68 48 }\n        TECLA { \"u\" }\n        CONMUTATIVO { 1 }\n    }\n    VERBO Abrir\n    {\n        ETIQUETA { \"Abrir\" }\n	IMAGEN { \"gr/btn_abrir.jpg\" }\n        TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n	TECLA { \"o\" }\n    }\n    VERBO Hablar\n    {\n      ETIQUETA { \"Hablar a\" }\n	IMAGEN { \"gr/btn_hablara.jpg\" }\n      TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n      TECLA { \"t\" }\n    }\n    VERBO Push\n    {\n      ETIQUETA { \"Empujar\" }\n	IMAGEN { \"gr/btn_empujar.jpg\" }\n      TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n    }\n    VERBO Cerrar\n    {\n      ETIQUETA { \"Cerrar\" }\n	IMAGEN { \"gr/btn_cerrar.jpg\" }\n     TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n	TECLA { \"c\" }\n    }\n    VERBO Mirar\n    {\n        ETIQUETA { \"Mirar\" }\n	  IMAGEN { \"gr/btn_mirar.jpg\" }\n	  TINTA { 165 156 132 }\n	  PAPEL { 80 68 48 }\n        TECLA { \"l\" }\n    }\n    VERBO Pull\n    {\n      ETIQUETA { \"Tirar\" }\n	IMAGEN { \"gr/btn_tirar.jpg\" }\n      TINTA { 165 156 132 }\n	PAPEL { 80 68 48 }\n    }\n    VERBODEFECTO { Mirar }\n    FPS { 20 }\n    ANGULOS { 4 }\n    PANTALLA { 640 320 }\n   JUGADOR { chaval }\n    INVENTARIO\n    {\n        TAMAÑO { 10 }\n        TINTA { 116 100 68 }\n        PAPEL { 80 68 48 }\n        IMAGEN\n        {\n        	\"gr/inv_arriba.jpg\"    \"gr/inv_arriba_c.jpg\"\n        	\"gr/inv_abajo.jpg\"    \"gr/inv_abajo_c.jpg\"\n        }\n    }\n   TITULO { \"Aventura sin Titulo\" }\n   CURSOR { \"gr/m_cross.gif\" 15 15 }\n   HABLAR\n    {\n      TAMAÑO { 4 }\n      TINTA { 165 156 132 }\n      PAPEL { 80 68 48 }\n      FUENTE { \"SansSerif\" 11 }\n    }\nFUENTE { \"SansSerif\" 20 }\nINICIO { \"principal\" }\n}";
            sistem=new Sistema(sisdefaultstring);
        }
        }


}
