<commit_before># -*- coding: utf-8 -*-

from pygame import sprite
from Functions import *

class Player(sprite.Sprite):
	"""Representa cada personaje del juego durante la partida.

	El objeto Player contiene todos los datos comunes a todos
	los personajes y que se inicializan según el personaje
	escogido, como la vida, la lista de animaciones o el banco
	de sonidos.

	Este objeto se debe inicializar después de terminar la
	selección de personajes con los datos del personaje escogido."""

	def __init__(self, jsonObject):
		sprite.Sprite.__init__(self)
		self.name = jsonObject['nombre']
		self.sprites = self.load_sprites(jsonObject['sprites'], 200, 420)
		self.avatar = load_image(jsonObject['avatar'])
		self.state = "idle"
		self.health = 100
		# Hacia donde mira (0 -> derecha, 4 -> izquierda)
		self.current_hframe = 0 # Lo necesitaremos para hacer el ciclo de animación
		self.orientacion = 0
		self.x = 75
		self.y = 250
		self.vulnerable = True
		self.golpeando = False
		# Tanto el salto como cualquier acción dura varias iteraciones, por lo que se debe de tener en cuenta
		# para mantener el flujo correctamente y evitar solapamiento.
		self.cdSalto = 0
		self.cdAction = 0

		# Atributos necesario para calcular colisiones entre sprites
		self.image = None 
		self.rect = None

	def restart(self):
		#Reiniciar atributos del personaje
		self.state = "idle"
		self.health = 100
		self.current_hframe = 0
		self.orientacion = 0
		self.x = 75
		self.y = 250
		self.vulnerable = True
		self.golpeando = False
		self.cdSalto = 0
		self.cdAction = 0


	# Actions

	def avanzar(self, time):
		"""El avance del personaje está definido por su orientación y límitado por su posición o estado.
		No podrá salirse de los límites del escenario.
		No podrá avanzar si está ejecutando otra acción que no sea salto.
		"""

		self.state = "avanzar"
		self.vulnerable = True
		if self.orientacion == 0: # Avanzamos hacia la derecha
			if self.x <= 850: # No estamos en los límites del escenario
				self.x += time*0.25
		else:
			if self.x >= 25: # No estamos en los límites del escenario
				self.x -= time*0.25

	def defender(self, time):
		"""Durante la defensa el personaje será invulnerable a cualquier ataque y además avanzará hacia atrás.
		No podrá salirse de los límites del escenario.
		No podrá avanzar si está ejecutando otra acción que no sea salto.		
		"""
		
		self.state = "defender"
		self.vulnerable = False
		if self.orientacion == 0: # Avanzamos hacia la derecha
			if self.x >= 25: # No estamos en los límites del escenario
				self.x -= time*0.25
		else:
			if self.x <= 850: # No estamos en los límites del escenario
				self.x += time*0.25

	def defenderSalto(self):
		"""El personaje podrá saltar hacia atrás manteniendo su defensa.
		No podrá salirse de los límites del escenario.
		Estará saltando.
		Sólo mantendrá su defensa si se desplaza hacia atrás durante el salto.
		"""
		self.state = "defenderSalto"
		self.vulnerable = False


	def ataqueDebil(self, playerObjective):
		"""El ataque débil se caracteriza por ser más flojo pero más rápido. Esto en nuestro juego se traduce
		en que el daño será menor pero la cd del golpe también.
		Durante el ataque no se podrá efectuar ninguna acción.
		"""

		self.state = "ataqueDebil"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = 10
		playerObjective.getHurt(5)

	def ataqueFuerte(self, playerObjective):
		"""El ataque fuerte se caracteriza por inflingir mayor daño pero requerir más tiempo de ejecución.
		Durante el ataque no se podrá efectuar ninguna acción.
		"""

		self.state = "ataqueFuerte"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = 20
		playerObjective.getHurt(12)

	def saltar(self, time):
		"""El personaje podrá saltar, la altura del salto viene determinada por la altura de los personajes,
		todos los personajes deben poder saltar 1,3 veces su altura, de forma que sea posible superar al
		otro personaje y caer en el lado opuesto del escenario, obligando a cambiar la orientación de los
		sprites.
		Mientras se está en el aire las maniobras son reducidas, por lo que durante esta acción la función
		actualizar devuelve un entero que representa la duración del salto. Mientras este número sea positivo,
		el personaje estará en el aire, pudiendo sólo realizar las acciones "defenderSalto", "avanzarSalto"
		y "ataqueSalto".
		Cuando el valor devuelto sea 0, el personaje habrá vuelto al suelo y en la función principal se
		recalculará la orientación de ambos personajes ya que existe la posibilidad de que hayan cambiado
		su ubicación relativa en el escenario.
		Durante un salto la dirección de avanzar o retroceder (orientación) será la misma hasta que el
		personaje termine el salto.
		El movimiento vertical descrito utiliza la fórmula del MRUA (Falta definir la altitud del salto y
		la duración para poder definir la función)

		La variable time se utiliza para el movimiento. Igual que en avanzar y defender
		"""

		self.state = "saltar"
		self.vulnerable = True
		self.cdSalto = 1 # Hay que apañar la formula de movimiento en salto

	def ataqueSalto(self):
		"""Durante un salto, si el jugador pulsa alguno de los botones de ataque, el personaje pasará
		ejecutar un golpe aereo que durara hasta el final del salto, no podrá realizar ninguna otra
		acción durante el salto, sin embargo podrá modificar la posición horizontalmente desplazandose
		según la dirección pulsada
		"""

		self.state = "ataqueSalto"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = self.cdSalto

	def ataqueBajo(self):
		"""El golpe bajo no se diferencia en nada del golpe flojo"""

		self.state = "ataqueBajo"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = 10

	def getHurt(self, dmg):
		"""Cuando un personaje recibe daño, este se resta de sus puntos de vida actuales. En caso de estos
		lleguen a 0 o menos, el personaje habrá sido debilitado, perdiendo el enfrentamiento.
		Cuando el personaje es debilitado, la función devuelve 0, en caso contrario, 1.
		"""

		self.health -= dmg
		if self.health < 1:
			self.health = 0
			return 0	# El personaje ha sido debilitado
		else:
			return 1	# El personaje sigue vivo

	def update(self):
		# Actualizamos frames
		self.current_hframe += 1
		if self.current_hframe == 4:
			self.current_hframe = 0

		# Actualizamos posición si estamos en un salto
#		self.cdSalto = ActualizarSaltoYALOHARÉ()
		self.cdSalto -= 2
		if self.cdSalto < 0:
			self.cdSalto = 0
		self.cdAction -= 2
		if self.cdAction < 0:
			self.cdAction = 0
		return self.cdSalto	

	def load_sprites(self, filename, width, height):
		"""Los sprites de los personajes se cargan desde una imagen donde están todos contenidos y
		después se genera una lista de listas ordenada con cada imagen de la animación"""

		# En una primera instancia vamos a definir que cada frame tiene 420 de alto y 200 de ancho

		ficha = {}

		sprite_ficha = load_image(filename)
		#Descomentar la siguiente linea para probar
		#sprite_ficha = load_image("assets/images/sprites/Sprite_chachiWachi_ficha.png")<commit_msg>creo que funcion de salto<commit_after># -*- coding: utf-8 -*-

from pygame import sprite
from Functions import *

class Player(sprite.Sprite):
	"""Representa cada personaje del juego durante la partida.

	El objeto Player contiene todos los datos comunes a todos
	los personajes y que se inicializan según el personaje
	escogido, como la vida, la lista de animaciones o el banco
	de sonidos.

	Este objeto se debe inicializar después de terminar la
	selección de personajes con los datos del personaje escogido."""

	def __init__(self, jsonObject):
		sprite.Sprite.__init__(self)
		self.name = jsonObject['nombre']
		self.sprites = self.load_sprites(jsonObject['sprites'], 200, 420)
		self.avatar = load_image(jsonObject['avatar'])
		self.state = "idle"
		self.health = 100
		# Hacia donde mira (0 -> derecha, 4 -> izquierda)
		self.current_hframe = 0 # Lo necesitaremos para hacer el ciclo de animación
		self.orientacion = 0
		self.x = 75
		self.y = 250
		self.vulnerable = True
		self.golpeando = False
		# Tanto el salto como cualquier acción dura varias iteraciones, por lo que se debe de tener en cuenta
		# para mantener el flujo correctamente y evitar solapamiento.
		self.cdSalto = 0
		self.cdAction = 0
		self.ataque = 0
		# Atributos necesario para calcular colisiones entre sprites
		self.image = None 
		self.rect = None

	def restart(self):
		#Reiniciar atributos del personaje
		self.state = "idle"
		self.health = 100
		self.current_hframe = 0
		self.orientacion = 0
		self.x = 75
		self.y = 250
		self.vulnerable = True
		self.golpeando = False
		self.cdSalto = 0
		self.cdAction = 0
		self.ataque = 0
		self.image = None 
		self.rect = None


	# Actions

	def avanzar(self, time):
		"""El avance del personaje está definido por su orientación y límitado por su posición o estado.
		No podrá salirse de los límites del escenario.
		No podrá avanzar si está ejecutando otra acción que no sea salto.
		"""

		if self.state != 'saltar':
			self.state = "avanzar"
		self.vulnerable = True
		if self.orientacion == 0: # Avanzamos hacia la derecha
			if self.x <= 850: # No estamos en los límites del escenario
				self.x += time*0.25
		else:
			if self.x >= 25: # No estamos en los límites del escenario
				self.x -= time*0.25

	def defender(self, time):
		"""Durante la defensa el personaje será invulnerable a cualquier ataque y además avanzará hacia atrás.
		No podrá salirse de los límites del escenario.
		No podrá avanzar si está ejecutando otra acción que no sea salto.		
		"""
		
		if self.state != 'saltar':
			self.state = "defender"
			self.vulnerable = False
			if self.orientacion == 0: # Avanzamos hacia la derecha
				if self.x >= 25: # No estamos en los límites del escenario
					self.x -= time*0.25
			else:
				if self.x <= 850: # No estamos en los límites del escenario
					self.x += time*0.25

	def defenderSalto(self):
		"""El personaje podrá saltar hacia atrás manteniendo su defensa.
		No podrá salirse de los límites del escenario.
		Estará saltando.
		Sólo mantendrá su defensa si se desplaza hacia atrás durante el salto.
		"""
		self.state = "defenderSalto"
		self.vulnerable = False
		if self.orientacion == 0: # Avanzamos hacia la derecha
			if self.x >= 25: # No estamos en los límites del escenario
				self.x -= time*0.25
		else:
			if self.x <= 850: # No estamos en los límites del escenario
				self.x += time*0.25


	def ataqueDebil(self, playerObjective):
		"""El ataque débil se caracteriza por ser más flojo pero más rápido. Esto en nuestro juego se traduce
		en que el daño será menor pero la cd del golpe también.
		Durante el ataque no se podrá efectuar ninguna acción.
		"""

		self.state = "ataqueDebil"
		self.vulnerable = True
		self.golpeando = True
		if self.ataque != 2:
			self.ataque += 1
			self.cdAction = 5
		else:
			self.ataque = 0
			self.cdAction = 10

		playerObjective.getHurt(5)

	def ataqueFuerte(self, playerObjective):
		"""El ataque fuerte se caracteriza por inflingir mayor daño pero requerir más tiempo de ejecución.
		Durante el ataque no se podrá efectuar ninguna acción.
		"""

		self.state = "ataqueFuerte"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = 20
		playerObjective.getHurt(12)

	def saltar(self):
		"""El personaje podrá saltar, la altura del salto viene determinada por la altura de los personajes,
		todos los personajes deben poder saltar 1,3 veces su altura, de forma que sea posible superar al
		otro personaje y caer en el lado opuesto del escenario, obligando a cambiar la orientación de los
		sprites.
		Mientras se está en el aire las maniobras son reducidas, por lo que durante esta acción la función
		actualizar devuelve un entero que representa la duración del salto. Mientras este número sea positivo,
		el personaje estará en el aire, pudiendo sólo realizar las acciones "defenderSalto", "avanzarSalto"
		y "ataqueSalto".
		Cuando el valor devuelto sea 0, el personaje habrá vuelto al suelo y en la función principal se
		recalculará la orientación de ambos personajes ya que existe la posibilidad de que hayan cambiado
		su ubicación relativa en el escenario.
		Durante un salto la dirección de avanzar o retroceder (orientación) será la misma hasta que el
		personaje termine el salto.
		El movimiento vertical descrito utiliza la fórmula del MRUA (Falta definir la altitud del salto y
		la duración para poder definir la función)

		La variable time se utiliza para el movimiento. Igual que en avanzar y defender

		e = 1/2 * a * t² + Vo * t + Eo		
		"""

		self.state = "saltar"
		self.vulnerable = True
		self.cdSalto = 120 # Hay que apañar la formula de movimiento en salto


	def ataqueSalto(self):
		"""Durante un salto, si el jugador pulsa alguno de los botones de ataque, el personaje pasará
		ejecutar un golpe aereo que durara hasta el final del salto, no podrá realizar ninguna otra
		acción durante el salto, sin embargo podrá modificar la posición horizontalmente desplazandose
		según la dirección pulsada
		"""

		self.state = "ataqueSalto"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = self.cdSalto

	def ataqueBajo(self):
		"""El golpe bajo no se diferencia en nada del golpe flojo"""

		self.state = "ataqueBajo"
		self.vulnerable = True
		self.golpeando = True
		self.cdAction = 5

	def getHurt(self, dmg):
		"""Cuando un personaje recibe daño, este se resta de sus puntos de vida actuales. En caso de estos
		lleguen a 0 o menos, el personaje habrá sido debilitado, perdiendo el enfrentamiento.
		Cuando el personaje es debilitado, la función devuelve 0, en caso contrario, 1.
		"""

		self.health -= dmg
		if self.health < 1:
			self.health = 0
			return 0	# El personaje ha sido debilitado
		else:
			return 1	# El personaje sigue vivo

	def update(self):
		# Actualizamos frames
		self.current_hframe += 1
		if self.current_hframe == 4:
			self.current_hframe = 0

		# Actualizamos posición si estamos en un salto
#		self.cdSalto = ActualizarSaltoYALOHARÉ()
		if self.state == 'saltar':
			self.cdSalto -= 20
			if self.cdSalto > 60:
				self.y += 1/2 * 1 * 1 + 0 * 1 + 0
			else:
				self.y += 1/2 * -1 * 1 + 0 * 1 + 0
		if self.cdSalto < 0:
			self.cdSalto = 0
		self.cdAction -= 2
		if self.cdAction < 0:
			self.cdAction = 0
		return self.cdSalto	

	def load_sprites(self, filename, width, height):
		"""Los sprites de los personajes se cargan desde una imagen donde están todos contenidos y
		después se genera una lista de listas ordenada con cada imagen de la animación"""

		# En una primera instancia vamos a definir que cada frame tiene 420 de alto y 200 de ancho

		ficha = {}

		sprite_ficha = load_image(filename)
		#Descomentar la siguiente linea para probar
		#sprite_ficha = load_image("assets/images/sprites/Sprite_chachiWachi_ficha.png")
{'fraction_non_alphanumeric': 0.07004390408645728, 'fraction_numerical': 0.014994934143870315, 'mean_word_length': 3.5459011360147374, 'pattern_counts': {'":': 0, '<': 14, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4777602', 'n_tokens_mistral': 5737, 'n_tokens_neox': 5060, 'n_words': 1912}