#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Tarea 2: Mr. Frozzi!

import pygame, sys, os, time
from pygame.locals import *
from random import randint, choice, shuffle
from configuraciones import *
from utilidades import *
from funciones import *

os.getcwd()
pygame.init()

fpsClock = pygame.time.Clock()
transparency_bg = 2

DISPLAYSURF = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT),0,32)
pygame.display.set_caption(NOMBRE_JUEGO)
pygame.time.set_timer(MOVIMIENTO_JUGADOR,PERIODO_JUGADOR)

scoreObj =pygame.font.Font(FONT_TEXT,SCORE_FONT_SIZE)
gameOverObj = pygame.font.Font(FONT_TEXT,GAME_OVER_FONT_SIZE)
extra_municion_factor=EXTRA_MUNICION_FACTOR
extra_vidas_factor=EXTRA_VIDAS_FACTOR
#-----
piso = pygame.image.load('{0}background.png'.format(RUTA_IMAGENES))
piso_rect = piso.get_rect()
piso_rect = piso_rect.move((0,WINDOW_HEIGHT-piso_rect.size[1]-1))

bg2 = pygame.image.load('{0}background2.jpg'.format(RUTA_IMAGENES))
bg2 = pygame.transform.smoothscale(bg2,(WINDOW_WIDTH,WINDOW_HEIGHT))
#--------
#CARGA DE MÚSICA
backgroundObj = pygame.mixer.Sound('{0}background.ogg'.format(RUTA_MUSICA))
fishObj = pygame.mixer.Sound('{0}fish.ogg'.format(RUTA_MUSICA))
finalObj = pygame.mixer.Sound('{0}final.ogg'.format(RUTA_MUSICA))
popObj = pygame.mixer.Sound('{0}pop.ogg'.format(RUTA_MUSICA))
introObj = pygame.mixer.Sound('{0}intro.ogg'.format(RUTA_MUSICA))
explosionObj = pygame.mixer.Sound("{0}explosion.ogg".format(RUTA_MUSICA))
disparoObj = pygame.mixer.Sound("{0}isparo.ogg".format(RUTA_MUSICA))
gameOverSoundObj = pygame.mixer.Sound("{0}game_over.ogg".format(RUTA_MUSICA))
#SET VOLUME
backgroundObj.set_volume(1.0)
fishObj.set_volume(.7)
finalObj.set_volume(1.0)
popObj.set_volume(.5)
introObj.set_volume(1.0)
explosionObj.set_volume(.7)
disparoObj.set_volume(1.)
gameOverSoundObj.set_volume(1.)

#CARGA DE IMÁGENES
imagen_title = pygame.image.load('{0}title.png'.format(RUTA_IMAGENES))
imagen_subtitle = pygame.image.load('{0}subtitle.png'.format(RUTA_IMAGENES))
imagen_game_over = pygame.image.load('{0}game_over.png'.format(RUTA_IMAGENES))


imagen_frozzi_centrada = pygame.image.load('{0}frozzi.png'.format(RUTA_IMAGENES))
imagen_frozzi_centrada = pygame.transform.smoothscale(imagen_frozzi_centrada,(FROZZI_SIZE, FROZZI_SIZE))
imagen_frozzi_rotada_derecha = pygame.transform.rotozoom(imagen_frozzi_centrada, GRADOS_ROTACION_frozzi,1)
imagen_frozzi_rotada_izquierda = pygame.transform.rotozoom(imagen_frozzi_centrada, -GRADOS_ROTACION_frozzi,1)

imagen_copo_nieve = pygame.image.load('{0}copo_nieve.png'.format(RUTA_IMAGENES))
imagen_copo_nieve = pygame.transform.smoothscale(imagen_copo_nieve,(SNOW_SIZE, SNOW_SIZE))

imagen_bola_fuego1 = pygame.image.load('{0}bola_fuego1.png'.format(RUTA_IMAGENES))
imagen_bola_fuego1 = pygame.transform.smoothscale(imagen_bola_fuego1,(FIRE_SIZE, FIRE_SIZE))
imagen_bola_fuego2 = pygame.image.load('{0}bola_fuego2.png'.format(RUTA_IMAGENES))
imagen_bola_fuego2 = pygame.transform.smoothscale(imagen_bola_fuego2,(FIRE_SIZE, FIRE_SIZE))
imagen_bola_fuego3 = pygame.image.load('{0}bola_fuego3.png'.format(RUTA_IMAGENES))
imagen_bola_fuego3 = pygame.transform.smoothscale(imagen_bola_fuego3,(FIRE_SIZE, FIRE_SIZE))
imagen_bola_fuego4 = pygame.image.load('{0}bola_fuego4.png'.format(RUTA_IMAGENES))
imagen_bola_fuego4 = pygame.transform.smoothscale(imagen_bola_fuego4,(FIRE_SIZE, FIRE_SIZE))

imagen_pez = pygame.image.load('{0}pez.png'.format(RUTA_IMAGENES))
imagen_pez = pygame.transform.smoothscale(imagen_pez,(FISH_SIZE, FISH_SIZE))
imagen_pez = pygame.transform.rotozoom(imagen_pez, -90,1)

imagen_explosion = pygame.image.load('{0}explosion.png'.format(RUTA_IMAGENES))
imagen_explosion = pygame.transform.smoothscale(imagen_explosion,(ELEMENTS_SIZE, ELEMENTS_SIZE))

imagen_luz = pygame.image.load('{0}luz.png'.format(RUTA_IMAGENES))
imagen_luz = pygame.transform.smoothscale(imagen_luz,(LIGHT_SIZE, LIGHT_SIZE))

imagenes = {"frozzi":imagen_frozzi_centrada,
			"copos_nieve": imagen_copo_nieve,
			"bolas_fuego1":imagen_bola_fuego1,
			"bolas_fuego2":imagen_bola_fuego2,
			"bolas_fuego3":imagen_bola_fuego3,
			"bolas_fuego4":imagen_bola_fuego4,
			"peces":imagen_pez,
			"explosion":imagen_explosion,
			"luz":imagen_luz}

frozzi = {"posicion":POSICION_INICIAL,
		   "vidas":8,
		   "municion":50,
		   "peces":0,
		   "bolas_fuego":0}

elementos = {"copos_nieve":{"direccion":'N',"objetivo":"bolas_fuego"},
			 "bolas_fuego":{"direccion":'S',"objetivo":"frozzi"},
			 "peces":{"direccion":'S',"objetivo":"frozzi"}}

proyectiles_elementos = {"copos_nieve": set(),
			   			 "bolas_fuego": set(),
			   			 "peces": set()}

#speed factor inicial es el definido por defecto
speed_factor = dict(SPEED_FACTOR)

direccion = ''
rotar = 0
distancia_temporal = DIST_TEMP_INICIAL
checktime = 0
i = 0
fpsClock.tick(FPS)

#Presentación
backgroundObj.play(-1)
introObj.play(-1)
copos_presentacion = {"copos_nieve":set()}
while True: # ciclo principal del juego
	DISPLAYSURF.blit(bg2,(0,0))
	DISPLAYSURF.blit(piso, piso_rect)
	#Identificación de teclas presionadas
	for event in pygame.event.get():
		if event.type == QUIT:
			pygame.quit()
			sys.exit()
	if sum(pygame.key.get_pressed())>0:
		break
	dibujar_pinguino(frozzi["posicion"],RADIUS["frozzi"],imagenes["frozzi"], DISPLAYSURF)

	#Crear copo nieve
	x = randint(0,WINDOW_WIDTH)
	vels = 60*[15]+30*[10]+10*[30]
	shuffle(vels)
	vel = choice(vels)
	direccion = choice(['E','O'])
	copos_presentacion["copos_nieve"].add(((x,0),direccion,vel))
	copos_actualizados = set()
	copos_dibujo = dict()
	copos_dibujo["copos_nieve"] = set()
	for copo in copos_presentacion["copos_nieve"]:
		coordenada = mover(mover(copo[0],'S',copo[2]),copo[1],1)
		if not detectar_colision_borde_proyectil(coordenada,'S'):
			copos_actualizados.add((coordenada,copo[1],copo[2]))
			copos_dibujo["copos_nieve"].add(coordenada)
	copos_presentacion["copos_nieve"] = set(copos_actualizados)
	DISPLAYSURF.blit(imagen_title,(0,0))
	if i>15:
		DISPLAYSURF.blit(imagen_subtitle,(0,0))
	dibujar_proyectiles(copos_dibujo,RADIUS,imagenes,DISPLAYSURF)
	pygame.display.update()
	fpsClock.tick(FPS)
	i = (i+1)%FPS
pygame.time.delay(200)

#Juego
initial_time = pygame.time.get_ticks()
while True: # ciclo principal del juego
	time = pygame.time.get_ticks() - initial_time
	DISPLAYSURF.blit(bg2,(0,0))
	DISPLAYSURF.blit(piso, piso_rect)
	#Identificación de teclas presionadas
	events = pygame.event.get()
	for event in events:
		#Crear diccionario
		if event.type == QUIT:
			pygame.quit()
			sys.exit()
		if not hay_tecla_movimiento_presionada(list(pygame.key.get_pressed()),TECLAS_MOVIMIENTO):
			direccion, rotar = EVENTOS[KEYUP]["direccion"], EVENTOS[KEYUP]["rotar"]
		if event.type == KEYDOWN:
			if event.key in EVENTOS[KEYDOWN]:
				direccion = EVENTOS[KEYDOWN][event.key]["direccion"]
				rotar = EVENTOS[KEYDOWN]["rotar"]
			#Crear misil
			if event.key == K_SPACE:
				if frozzi["municion"] > 0:
					popObj.play()
					crear_proyectil("copos_nieve",frozzi, proyectiles_elementos)

	#Modificación de posición
	posicion = frozzi["posicion"]
	frozzi["posicion"] = mover_pinguino(posicion, direccion, RADIUS["frozzi"],speed_factor["frozzi"])

	if i%2==0:
		rotar *= -1
		if rotar == 0:
			imagenes["frozzi"] = imagen_frozzi_centrada
		elif rotar == 1:
			imagenes["frozzi"] = imagen_frozzi_rotada_derecha
		elif rotar == -1:
			imagenes["frozzi"] = imagen_frozzi_rotada_izquierda

	dibujar_pinguino(frozzi["posicion"],RADIUS["frozzi"],imagenes["frozzi"], DISPLAYSURF)

	#Creación probabilística de elementos en escenario
	if caera_elemento(time):
		crear_elemento(proyectiles_elementos,elementos)
	#Mover proyectiles
	mover_proyectiles(elementos,proyectiles_elementos,RADIUS,speed_factor)
	#Dibujar proyectiles
	dibujar_proyectiles(proyectiles_elementos,RADIUS, imagenes,DISPLAYSURF)
	proyectiles_removidos = dict(detectar_colisiones(frozzi,RADIUS,elementos,proyectiles_elementos))
	dibujar_explosiones(proyectiles_removidos,EXPLOSION_RADIO,imagenes,DISPLAYSURF,explosionObj,fishObj)
	#Aumentar dificultad (aumento de velocidad, caída elementos)
	actualizar_dificultad(time,speed_factor)
	#MOSTRAR PUNTAJE
	puntaje = mostrar_informacion(DISPLAYSURF,scoreObj,frozzi,time)
	#Asignación de más munición
	extra_municion_factor,extra_vidas_factor=actualizar_jugador(frozzi,extra_municion_factor,extra_vidas_factor)
	i=(i+1)%FPS
	pygame.display.update()
	fpsClock.tick(FPS)
	#Condición término
	if frozzi["vidas"]<1:
		disparoObj.play()
		break

#GAME OVER
backgroundObj.stop()
introObj.stop()
gameOverSoundObj.play()
pygame.time.wait(1200)

DISPLAYSURF.fill(GRAY,None,3)
DISPLAYSURF.blit(imagen_game_over,(0,0))
pygame.display.update()
while True:
	#GAME OVER
	for event in pygame.event.get():
		if event.type == QUIT:
			pygame.quit()
			sys.exit()
	if sum(pygame.key.get_pressed())>0:
		break
	pygame.display.update()
exit()

#Estadísticas
