/*************************/
/* ARISO1 - 2005/2006 Q1 */
/*************************/

/* Eduardo Garcia Lebiere y Patricia Garcia Caņadilla....Grupo 12 */

#include <time.h>
#include <stdio.h>
#include "pantalla.h"
#include "io.h"

#define ESC            'p'
#define UP             'w'
#define DOWN           's'
#define LEFT           'a'
#define RIGHT          'd'
#define SPACE          ' '

/* Definicion tipos de datos */

typedef struct {
    int fil;   /* fila de la pantalla */
    int col;   /* columna de la pantalla */
} posicion;


/* Declaracion de funciones externas */

extern pant *dir_pantalla();
extern void escribir_pantalla (pant *p,  int fil, int col, elemento letra);
extern elemento leer_pantalla(pant *p, int fil, int col);

/* Variables globales */
pant *pantalla;

elemento blanco = { ' ', 0x07 };
elemento borde  = { '*', 0x0B };
elemento pulga  = { 'X', 0x0E };
elemento bola   = { 'O', 0x0A };

posicion pos_pulga = {  8, 50 };
posicion pos_bola  = { 16, 30 };

int 
interrupcion_de_teclado=0,timer=1,cont=0,game=0,movimiento_bola=0,pulga_atrapada=0;/*escape_pulsado=0;*/

/* Dibujar pantalla */
void dibujar_pantalla ()
{
    int i, j;
    for (j=0; j<80; j++) {
    	escribir_pantalla (pantalla, 0, j, borde);
    }
    for (i=1; i<24; i++) {
     	escribir_pantalla (pantalla, i, 0, borde);
    	for (j=1; j<79; j++) {
        	escribir_pantalla (pantalla, i, j, blanco);
     	}
	escribir_pantalla (pantalla, i, 79, borde);
    }
    for (j=0; j<80; j++) {
    	escribir_pantalla (pantalla, 24, j, borde);
    }
    mostrar_pantalla();
}

/* Movimiento de la bola segun teclado */
void RAI_teclado ()
{
	elemento e;
	if(inp(0x60)==SPACE)
		interrupcion_de_teclado=1;
	/*if(inp(0x60)==ESC)
		escape_pulsado=1;*/
	if(inp(0x60)==UP){
		e=leer_pantalla(pantalla,(pos_bola.fil)-1,pos_bola.col);
		if((e.caracter!=borde.caracter)&&(!pulga_atrapada)){
			pos_bola.fil--;
			movimiento_bola=1;
		}

	}
    if(inp(0x60)==DOWN){
		e=leer_pantalla(pantalla,(pos_bola.fil)+1,pos_bola.col);
		if((e.caracter!=borde.caracter)&&(!pulga_atrapada)){
			pos_bola.fil++;
			movimiento_bola=1;
		}

	}
	if(inp(0x60)==LEFT){
		e=leer_pantalla(pantalla,pos_bola.fil,(pos_bola.col)-1);
		if((e.caracter!=borde.caracter)&&(!pulga_atrapada)){
			pos_bola.col--;
			movimiento_bola=1;
		}

	}
	if(inp(0x60)==RIGHT){
		e=leer_pantalla(pantalla,pos_bola.fil,(pos_bola.col)+1);
		if((e.caracter!=borde.caracter)&&(!pulga_atrapada)){
			pos_bola.col++;
			movimiento_bola=1;
		}

	}
	if((pos_bola.fil==pos_pulga.fil)&&(pos_bola.col==pos_pulga.col))
			pulga_atrapada=1;
	outp (Rint_cont, EOI);
	return;
}

/* Mueve la pulga de forma aleatoria en un radio de 5 posiciones */
void salta_pulga (posicion *pos)
{
    int inc;
    time_t t;

    srand((unsigned)time(&t));

    /* borrar pulga */
    escribir_pantalla(pantalla, pos->fil, pos->col, blanco);

    /* calcular nueva posicion horizontal */
    do {
        inc = rand()%11 - 5;
    } while ((inc==0)||(pos->col+inc<1)||(pos->col+inc>78));
    pos->col += inc;

    /* calcular nueva posicion vertical */
    do {
        inc = rand()%11 - 5;
    } while ((inc==0)||(pos->fil+inc<1)||(pos->fil+inc>23));
    pos->fil += inc;

    /* dibujar pulga en la nueva posicion */
    escribir_pantalla(pantalla, pos->fil, pos->col, pulga);
    mostrar_pantalla();
}

/* Movimiento periodico de la pulga */
void RAI_reloj ()
{
	static int ticks=0;
	if(!game) {		/*queremos q si viene una interrupcion de reloj antes de 
inicializar el juego no cuente aun*/
		outp(Rint_cont,EOI);
		return;
	}
	ticks++;
	if(ticks>=9){
		timer=0;
		ticks=0;
		cont++;
	}

  outp (Rint_cont, EOI);
  return;
}

int main ()
{
    void *raiSOrel;
    void *raiSOtec;
    unsigned char tecla;

    init_io();

    /* Montar vector de interrupciones */

    disable();
    raiSOrel = getvect (ID_reloj);
    setvect (ID_reloj, (void (*)()) RAI_reloj);
    raiSOtec = getvect (ID_teclado);
    setvect (ID_teclado, (void (*)()) RAI_teclado);
    enable();

    /* Dibujar terreno de juego */

    pantalla=dir_pantalla();
    dibujar_pantalla();

    /* Aqui va vuestro codigo */

	while(!interrupcion_de_teclado);
	escribir_pantalla(pantalla,pos_pulga.fil,pos_pulga.col,pulga);
    escribir_pantalla(pantalla,pos_bola.fil,pos_bola.col,bola);
   	mostrar_pantalla();

	game=1;		/*lo utilizamos, para q empieza a contar una vez se haya 
				inizalizado el juego, no antes*/
	while((cont<=20)||(!pulga_atrapada)){	/*el programa acaba cuando se atrapa 
											a la pulga o cuando se pulsa ESC*/
		salta_pulga(&pos_pulga);
		while(timer);
		timer=1;
		if(movimiento_bola){
			mostrar_pantalla(); /*si no se mueve la bola, la pantalla ya se muestra en salta_pulga*/
			movimiento_bola=0;
		}
	}

    /* Restaurar vector de interrupciones original */

    disable();
    setvect (ID_reloj, (void (*)()) raiSOrel);
    setvect (ID_teclado, (void (*)()) raiSOtec);
    enable();

	while(1);
}




