;;####################################################################
;;# GNU Free Documentation License                                   #
;;# Version 1.3, 3 November 2008                                     #
;;#                                                                  #
;;# Copyright (C) 2021 Lumina                                        #
;;# (Paula Garcia Morales, Laura Gil Lopez, Jorge Perez Dominguez)   #
;;#                                                                  #
;;# Everyone is permitted to copy and distribute verbatim copies     #
;;# of this license document, but changing it is not allowed.        #
;;####################################################################


.include "cpctelera.h.s"
.include "entity_manager.h.s"

relojitoEntities: .db #0x00
relojitoAnimW: .db #0x00
relojitoAnimS: .db #0x00

generoentidades: .db #1
quesogenerado: .db #1
generoqueso: .db #1

Player:
   ;;     0    1  2   3   4      5        6         7   8    9        10           11          12             13             14      15
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx 
   .db   20, 184, 4, 16,  0, #0x00,      15,        1, 20, 184, #<_zacarias, #>_zacarias, #<_zacarias2,  #>_zacarias2,            1,  0

Rock:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db    5,  17, 2,  8,  1, #0x00,       7,        2,  5,  17,     #<_roca,     #>_roca,     #<_roca2,      #>_roca2,            1,  0

SpiderR:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db   34,  24, 2,  8,  2, #0x00,       7,        8, 34,  24,   #<_aranaR,   #>_aranaR,   #<_aranaR2,    #>_aranaR2,            1,  0

SpiderL:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db    4,  24, 2,  8,  2, #0x00,       7,       16,  4,  24,   #<_aranaL,   #>_aranaL,   #<_aranaL2,    #>_aranaL2,            1,  0

Aguila:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db   20,  24, 4, 16,  0, #0x25,       7,        4,  20, 24,      #<_ave,      #>_ave,      #<_ave2,       #>_ave2,            1,  1

Clock:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db    1,   8, 2,  8,  0, #0x00,       1,       32,  1,   8,    #<_reloj,    #>_reloj,     #<_reloj,      #>_reloj,            1,  0

Queso:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db   20,  24, 2,  8,  0, #0x00,       7,       64, 20,  24,    #<_queso,    #>_queso,     #<_queso,      #>_queso,            1,  0

Life:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly, spritebajo1, spritealto1,  spritebajo2,   spritealto2, contadorAnim, vx  
   .db   34,   7, 2,  8,  0, #0x00,       1,       32, 38,  10,  #<_corazon,  #>_corazon,   #<_corazon,    #>_corazon,            1,  0

Queso_Sagrado:
   ;;     x,   y, w,  h, vy, Color, Msc_Sys, Msc_Type, lx,  ly,      spritebajo1,      spritealto1,      spritebajo2,      spritealto2, contadorAnim, vx  
   .db   18, 140, 6, 24,  0, #0x00,       5,       64, 18, 140, #<_queso_sagrado, #>_queso_sagrado, #<_queso_sagrado, #>_queso_sagrado,            1,  0


max_entities == 8
entity_size == 16

;;MASCARAS System
Invalid_masc 	== #0b00000000
Render_masc  	== #0b00000001
Physics_masc 	== #0b00000010
Collision_masc == #0b00000100
Input_masc     == #0b00001000
Delete_masc    == #0b00100000
Dead_masc  		== #0b10000000
Default_masc 	== #0b01111111

;;MASCARAS Type
Player_masc  	       == #0b00000001
Rock_masc 		       == #0b00000010
Aguila_masc           == #0b00000100
SpiderR_masc          == #0b00001000
SpiderL_masc          == #0b00010000
Heart_Clock_masc      == #0b00100000
Queso_masc            == #0b01000000



_num_entities::
	.db 0

_last_entity_ptr::
	.dw _entity_array

_entity_array::
	.ds max_entities*entity_size


;;Guardamos en ix el array de entidades
entityman_getEntityArray_IX::
	ld 	ix,	#_entity_array
ret

;;Guardamos en a el numero de entidades
entityman_getNumEntities_A::
	ld 	a,	(_num_entities)
ret

entityman_reset_game::
	call entityman_getEntityArray_IX
	ld (_last_entity_ptr), ix

	ld a, #0
	ld (_num_entities), a

	ld a, #1
	ld (generoentidades), a

	ld a, #1
	ld (quesogenerado), a

	ld a, #1
	ld (generoqueso), a

	call reset_clock
	call reset_lifes
ret

puedo_queso::
	ld a, #1
	ld (generoqueso), a
ret

crear_queso_sagrado::
	call entityman_getEntityArray_IX
	ld a, 1(ix)   ;;y
	sub #10

	ld hl, #Queso_Sagrado
	inc hl
	ld (hl), a
    call entityman_create
ret

entityman_init_level1:
	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
    call entityman_create
ret

entityman_init_level2:
	ld hl, #Aguila
	call entityman_valores_Aguila
	ld hl, #Aguila
    call entityman_create
ret

entityman_init_level3:
	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
    call entityman_create

	ld hl, #SpiderR
	call entityman_valores_spider
	ld hl, #SpiderR
    call entityman_create

    ld hl, #SpiderL
    call entityman_valores_spider
    ld hl, #SpiderL
    call entityman_create
ret

entityman_init_level4:
	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
    call entityman_create

    ld hl, #Aguila
	call entityman_valores_Aguila
	ld hl, #Aguila
    call entityman_create
ret

entityman_init_level5:
	ld hl, #Aguila
	call entityman_valores_Aguila
	ld hl, #Aguila
    call entityman_create

    ld hl, #SpiderR
	call entityman_valores_spider
	ld hl, #SpiderR
    call entityman_create

    ld hl, #SpiderL
    call entityman_valores_spider
    ld hl, #SpiderL
    call entityman_create
ret

entityman_init_level6:
	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
    call entityman_create

    ld hl, #SpiderR
	call entityman_valores_spider
	ld hl, #SpiderR
    call entityman_create

    ld hl, #SpiderL
    call entityman_valores_spider
    ld hl, #SpiderL
    call entityman_create
ret

entityman_init_level7:
	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
    call entityman_create

    ld hl, #Aguila
	call entityman_valores_Aguila
	ld hl, #Aguila
    call entityman_create

    ld hl, #SpiderR
	call entityman_valores_spider
	ld hl, #SpiderR
    call entityman_create

    ld hl, #SpiderL
    call entityman_valores_spider
    ld hl, #SpiderL
    call entityman_create
ret

entityman_init::
	;;Creamos el espacio para el array y el numero de entidades
	ld hl, #Player
    call entityman_create

    ld hl, #Clock
    call entityman_create

;;    ld hl, #Queso
;;	call entityman_valores_queso
;;    ld hl, #Queso
;;    call entityman_create
 
    ld hl, #Life
    call entityman_create


    call render_getNivel_A
    cp #0
    jr z, crear_nivel_1

    cp #1
    jr z, crear_nivel_2

    cp #2
    jr z, crear_nivel_3

    cp #3
    jr z, crear_nivel_4

    cp #4
    jr z, crear_nivel_5

    cp #5
    jr z, crear_nivel_6

    cp #6
    jr z, crear_nivel_7

    crear_nivel_1:
    	call entityman_init_level1
    	ret

    crear_nivel_2:
    	call entityman_init_level2
    	ret

    crear_nivel_3:
    	call entityman_init_level3
    	ret

    crear_nivel_4:
    	call entityman_init_level4
    	ret

    crear_nivel_5:
    	call entityman_init_level5
    	ret

    crear_nivel_6:
    	call entityman_init_level6
    	ret

    crear_nivel_7:
    	call entityman_init_level7
    	ret
ret


;;Crear una nueva entidad
;; HL - Datos de la nueva entidad a crear
entityman_create::
	;;Loads info of array
	ld 		de, (_last_entity_ptr) ;;Con () carga los datos de la posicion de memoria
	ld 		bc, #entity_size
	ldir                           ;;Intercambia lo que hay en DE por lo que hay en HL

	;;Increments num_entities
	ld 		a, (_num_entities)
	inc   	a
	ld 		(_num_entities), a

	;;Updates ptr of last entity
	ld 		hl, (_last_entity_ptr)
	ld 		bc, #entity_size
	add   	hl, bc
	ld 		(_last_entity_ptr), hl
ret


;;Decrementar el numero de entidades cuando borramos una entidad y llamar al metodo de destruir entidad
entityman_check_delete:
	;;Decrements num_entities
	ld 		a, (_num_entities)
	dec   	a
	ld 		(_num_entities), a

	call entityman_destroy
ret

;;Obtener valores random para la posicion X de las entidades creadas
;;La funcion de random modifica HL, por eso pusheamos HL antes de llamar a la funcion
entityman_valores_queso:
	push hl

	pedir_numero_xQ:
		call cpct_getRandom_xsp40_u8_asm
		cp #32
		jr nc, pedir_numero_xQ
		add #4

	pop hl
	ld (hl), a
ret


;;Obtener valores random para la posicion X y la VY de las entidades creadas
;;La funcion de random modifica HL, por eso pusheamos HL antes de llamar a la funcion
entityman_valores_rock:
	push hl

	pedir_numero_x:
		call cpct_getRandom_xsp40_u8_asm
		cp #12
		jr nc, pedir_numero_x
		add #-6

	call entityman_getEntityArray_IX
	add a, 0(ix)  ;;sumar posicion x jugador

	pop hl
	ld (hl), a

	inc hl
	inc hl 
	inc hl 
	inc hl
	;;incrementamos HL en 4 para pasar de X a VY (X-Y-W-H-VY)

	push hl 


	call render_getNivel_A
	cp #2
	jr z, pedir_numero_vy1
	jp m, pedir_numero_vy1

	call render_getNivel_A
	cp #4
	jr z, pedir_numero_vy2
	jp m, pedir_numero_vy2


	call cpct_getRandom_xsp40_u8_asm
	cp #10
	jr nc, pedir_numero_vy1
	add #6

	jp saltar_roca

	pedir_numero_vy1:
		call cpct_getRandom_xsp40_u8_asm
		cp #4
		jr nc, pedir_numero_vy1
		add #2

		jp saltar_roca

	pedir_numero_vy2:
		call cpct_getRandom_xsp40_u8_asm
		cp #8
		jr nc, pedir_numero_vy2
		add #4

		jp saltar_roca

	saltar_roca:
	pop hl
	ld (hl), a
ret

;;Obtener valores random para la Y de las entidades creadas
;;La funcion de random modifica HL, por eso pusheamos HL antes de llamar a la funcion
entityman_valores_spider:

	inc hl
	inc hl 
	inc hl 
	inc hl 
	inc hl
	;;incrementamos HL en 5 para pasar de X a Y (X-Y-W-H-VY-Color)

	push hl 

	pedir_numero_y:
		call cpct_getRandom_xsp40_u8_asm
		cp #100
		jr nc, pedir_numero_y
		add #40

	pop hl
	ld (hl), a
ret

;;Obtener valores random para la posicion X y la VX de las entidades creadas
;;La funcion de random modifica HL, por eso pusheamos HL antes de llamar a la funcion
entityman_valores_Aguila:
	push hl

	pedir_numero_xA:
		call cpct_getRandom_xsp40_u8_asm
		cp #32
		jr nc, pedir_numero_xA
		add #4

	pop hl
	ld (hl), a

	inc hl
	inc hl 
	inc hl 
	inc hl
	inc hl
	inc hl
	inc hl 
	inc hl 
	inc hl
	inc hl
	inc hl
	inc hl 
	inc hl 
	inc hl
	inc hl
	;;incrementamos HL en 15 para pasar de X a VY (X-Y-W-H-VY-Color-MSys-MType-lx-ly-sb1-sa1-sb2-sa2-cont-VX)

	push hl 


	pedir_numero_vxA:
		call cpct_getRandom_xsp40_u8_asm
		cp #125
		jp m, vel_neg

	call render_getNivel_A
	cp #2
	jr z, vel_pos1
	jp m, vel_pos1

	call render_getNivel_A
	cp #4
	jr z, vel_pos2
	jp m, vel_pos2

	ld a, #3
	jp pop_aguila

	vel_pos1:
		ld a, #1
		jp pop_aguila

	vel_pos2:
		ld a, #2
		jp pop_aguila


	vel_neg:
		call render_getNivel_A
		cp #2
		jr z, vel_neg1
		jp m, vel_neg1

		call render_getNivel_A
		cp #4
		jr z, vel_neg2
		jp m, vel_neg2

		ld a, #-3
		jp pop_aguila

		vel_neg1:
			ld a, #-1
			jp pop_aguila

		vel_neg2:
			ld a, #-2
			jp pop_aguila

	pop_aguila:
		pop hl
		ld (hl), a
ret

actualizar_reloj_entities:
	ld a, (relojitoEntities)
	inc a 
	ld (relojitoEntities), a
ret

check_queso:
	ld a, (generoqueso)
	cp #0
	ret z

	ld hl, #Queso
	call entityman_valores_queso
	ld hl, #Queso
	call entityman_create

	ld a, #0
	ld (generoqueso), a
ret

entityman_generator_level1:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level1

	;;crear rocas conforme se vayan borrando
	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
	call entityman_create

	ret 

	crear_queso_level1:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

entityman_generator_level2:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level2


	ld hl, #Aguila
	call entityman_valores_Aguila
	ld hl, #Aguila
	call entityman_create

	ret 

	crear_queso_level2:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

entityman_generator_level3:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level3

	call cpct_getRandom_xsp40_u8_asm
	cp #250
	jp m, crear_rock_level3

	call cpct_getRandom_xsp40_u8_asm
	cp #125
	jp m, crear_spiderL_level3


	ld hl, #SpiderR
	call entityman_valores_spider
	ld hl, #SpiderR
	call entityman_create

	ret 

	crear_spiderL_level3:
		ld hl, #SpiderL
		call entityman_valores_spider
		ld hl, #SpiderL
	    call entityman_create

	    ret

    crear_rock_level3:
	    ld hl, #Rock
		call entityman_valores_rock
		ld hl, #Rock
		call entityman_create

		ret 

	crear_queso_level3:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

entityman_generator_level4:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level4

	call cpct_getRandom_xsp40_u8_asm
	cp #125
	jp m, crear_aguilas_level4

	ld hl, #Rock
	call entityman_valores_rock
	ld hl, #Rock
	call entityman_create

	ret 

	crear_aguilas_level4:
		ld hl, #Aguila
		call entityman_valores_Aguila
		ld hl, #Aguila
		call entityman_create

		ret 

	crear_queso_level4:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

entityman_generator_level5:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level5

	call cpct_getRandom_xsp40_u8_asm
	cp #250
	jp m, crear_aquilas_level5

	call cpct_getRandom_xsp40_u8_asm
	cp #125
	jp m, crear_spiderL_level5


	ld hl, #SpiderR
    call entityman_valores_spider
    ld hl, #SpiderR
    call entityman_create

	ret 

	crear_spiderL_level5:
		ld hl, #SpiderL
		call entityman_valores_spider
		ld hl, #SpiderL
	    call entityman_create

	    ret

    crear_aquilas_level5:
	    ld hl, #Aguila
		call entityman_valores_Aguila
		ld hl, #Aguila
		call entityman_create

		ret 

	crear_queso_level5:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

entityman_generator_level6:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level6

	call cpct_getRandom_xsp40_u8_asm
	cp #250
	jp m, crear_rock_level6

	call cpct_getRandom_xsp40_u8_asm
	cp #125
	jp m, crear_spiderL_level6

	
	ld hl, #SpiderR
    call entityman_valores_spider
    ld hl, #SpiderR
    call entityman_create
    

	ret 

	crear_spiderL_level6:
		ld hl, #SpiderL
		call entityman_valores_spider
		ld hl, #SpiderL
	    call entityman_create

	    ret

    crear_rock_level6:
	    ld hl, #Rock
		call entityman_valores_rock
		ld hl, #Rock
		call entityman_create

		ret 

	crear_queso_level6:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

entityman_generator_level7:
	call cpct_getRandom_xsp40_u8_asm
	cp #15
	jp m, crear_queso_level7

	call cpct_getRandom_xsp40_u8_asm
	cp #125
	jp m, crear_rock_level7

	call cpct_getRandom_xsp40_u8_asm
	cp #250
	jp m, crear_aguilas_level7

	call cpct_getRandom_xsp40_u8_asm
	cp #30
	jp m, crear_spiderL_level7


	ld hl, #SpiderR
    call entityman_valores_spider
    ld hl, #SpiderR
    call entityman_create

	ret 

	crear_aguilas_level7:
		ld hl, #Aguila
		call entityman_valores_Aguila
		ld hl, #Aguila
		call entityman_create

		ret 


	crear_spiderL_level7:
		ld hl, #SpiderL
		call entityman_valores_spider
		ld hl, #SpiderL
	    call entityman_create

	    ret

    crear_rock_level7:
	    ld hl, #Rock
		call entityman_valores_rock
		ld hl, #Rock
		call entityman_create

		ret 

	crear_queso_level7:
		call life_getLifes_A
		cp #51
		ret z

		call check_queso
ret

change_generoentidades::
	ld a, #0
	ld (generoentidades), a
ret



;;Comprobar que hay espacio para crear una nueva entidad y crearla a partir de una plantilla
entityman_generator:
	ld a, (_num_entities)
	cp #max_entities
	ret z

	;;comprobar variable de generar entidades
	ld a, (generoentidades)
	cp #0
	jp z, check_queso_sagrado

	call render_getNivel_A
    cp #0
    jr z, generator_nivel_1

    cp #1
    jr z, generator_nivel_2

    cp #2
    jr z, generator_nivel_3

    cp #3
    jr z, generator_nivel_4

    cp #4
    jr z, generator_nivel_5

    cp #5
    jr z, generator_nivel_6

    cp #6
    jr z, generator_nivel_7

    generator_nivel_1:
    	call entityman_generator_level1
    	ret

    generator_nivel_2:
    	call entityman_generator_level2
    	ret

    generator_nivel_3:
    	call entityman_generator_level3
    	ret

    generator_nivel_4:
    	call entityman_generator_level4
    	ret

    generator_nivel_5:
    	call entityman_generator_level5
    	ret

    generator_nivel_6:
    	call entityman_generator_level6
    	ret

    generator_nivel_7:
    	call entityman_generator_level7
    	ret

    check_queso_sagrado:
    	call render_getNivel_A
    	cp #6
    	jr nz, no_creo_quesito

    	ld a, (quesogenerado)
    	cp #0
    	jr z, no_creo_quesito

    	ld hl, #Queso_Sagrado
    	call entityman_create

    	ld a, #0
    	ld (quesogenerado), a

    	no_creo_quesito:
ret


;;Actualizar entidades que tienen que ser borradas
entityman_update::
	call actualizar_reloj_entities

	push af

	call render_getNivel_A
	cp #2
	jr z, valor1
	jp m, valor1

	call render_getNivel_A
	cp #4
	jr z, valor2
	jp m, valor2

	ld b, #0x08
	jp salto_g

	valor1:
		ld b, #0x0A
		jp salto_g

	valor2:
		ld b, #0x02
		jp salto_g

	salto_g:

	pop af

	cp b
	jr nz, salto_no_generator

	ld a, #0x00
	ld (relojitoEntities), a


	call entityman_generator

	salto_no_generator:

	call entityman_getEntityArray_IX
	call entityman_getNumEntities_A

	ld b, a ;;load b numentities

	_loop_muerte:
		;;Comparar si tiene mascara de Delete

		ld a, 6(ix)
		and #Delete_masc
		cp #Delete_masc

		jr nz, no_morir

		push bc
		;;Pusheamos bc porque entityman_check_delete lo modifica

		call entityman_check_delete

		pop bc

		no_morir:

		dec	b 	;;Dec numentities
		ret z

		ld de,	#entity_size
		add	ix,	de
	jr _loop_muerte
ret

entityman_destroy::
	;;Borrado de entidades y reordenacion del array

	;;Modificamos el puntero a la ultima posicion libre para que ahora apunte a la ultima posicion ocupada
	ld hl, (_last_entity_ptr)
	ld bc, #-entity_size
	add hl, bc
	ld (_last_entity_ptr), hl

	ld__a_ixl
	sub l

	jr nz, _copiar

	ld__a_ixh
	sub h

	jr z, _no_copiar

	_copiar:
		ld__e_ixl
		ld__d_ixh
		ld bc, #entity_size
		ldir

	_no_copiar:
		ld hl, (_last_entity_ptr)
		ld (hl), #0

	ret

;;Funcion para comprobar si la entidad cumple el requisito de mascara y llamar a la funcion de HL
;;
;;HL = LLamada al metodo correspondiente
;; A = Mascara que indica el tipo a enviar
;;

entityman_forall_matching::	
	ld c, a                             ;;Saves Masc into C

	call entityman_getEntityArray_IX	;;Get the array in IX
	call entityman_getNumEntities_A		;;Get in A numentitites

	ld b, a 							;;Saves A into B
	ex de, hl 							;;Saves in DE the Llamada al metodo

	_loop_matching:
		ld a, 6(ix)			;;Saves Entity.Masc into A
		and c 				;;And with Masc
		cp  c 				;;Comapare A with masc

		push de
		push bc
		;;Pusheamos DE y BC para que la funcion que viene en HL no modifique sus valores

		jr nz, saltar_hl	;;If != 0

		ld hl, #saltar_hl
		push hl

		ex de, hl

		jp (hl)				;;Jumps to render_one_entity

		saltar_hl:

		pop bc
		pop de

		dec	b 	;;Dec numentities
		ret z 	;;Si vale 0 se sale de la funcion, si no pues continua

		push de
		;;Pusheamos DE para no modificarlo con respecto al incremento de abajo

		ld de,	#entity_size
		add	ix,	de

		pop de

	jr _loop_matching
ret


;;Funcion para comprobar colisiones entre 2 entidades
;;
;;HL = LLamada al metodo correspondiente
;; A = Mascara que indica el tipo a enviar
;;
entityman_forall_matching_pairs::
	ld c, a                             ;;Saves Masc into C

	call entityman_getEntityArray_IX	;;Get the array in IX
	call entityman_getNumEntities_A		;;Get in A numentitites

	ld b, a 							;;Saves A into B

	ld__iy_ix                           ;;Crea una copia de lo que hay en IX en IY
	;;Hacemos la copia, pero recorremos el bucle con ix 
	;;porque sino no se actualizan bien los valores de las entidades borradas

	push bc

	ld 	bc, #entity_size                ;;Hacer que IY apunte a la siguiente entidad para no comparar la misma
	add ix,	bc

	pop bc

	ex de, hl 							;;Saves in DE the Llamada al metodo

	_loop_matching_pairs:
		push de
		push bc

		;;Comprobar que la primera entidad es colisionable, sino ya no comprueba la segunda
		ld a, 6(ix)			;;Saves Entity.Masc into A
		and c 				;;And with Masc
		cp  c 				;;Compare A with masc

		jr nz, saltar_hl_pairs	;;If != 0

		;;Comprobar que la segunda y las siguientes (una cada vez) son colisionables
		ld a, 6(iy)         ;;Saves Entity.Masc into A
		and c               ;;And with Masc
		cp c                ;;Compare A with masc
		jr nz, saltar_hl_pairs


		ld hl, #saltar_hl_pairs
		push hl

		ex de, hl

		jp (hl)				;;Jumps to render_one_entity

		saltar_hl_pairs:
		pop bc
		pop de

		dec	b 	;;Dec numentities
		ret z 	;;Si vale 0 se sale de la funcion, si no pues continua

		push de

		ld de,	#entity_size
		add	ix,	de

		pop de

	jr _loop_matching_pairs
ret


;;Poner mascara de delete a la entidad cuando no se llama desde colision
entityman_set_for_destruction::
	ld  a, 6(ix)
	or  #Delete_masc
	ld  6(ix), a
	ld  5(ix), #0x00

	call render_delete_entity
ret


;;
;;
;;
;;
;;
;;

change_sprite::
	ld a, 14(ix)
	sub #1
	jr nz, cambio
		
	ld a, #2
	ld 14(ix), a
	jr continuar

	cambio:
		ld a, #1
		ld 14(ix), a

	continuar:
ret

entityman_velx0::
	ld 15(ix), #0    ;;vx
ret

entityman_vely0::
	ld 4(ix), #0     ;;vy
ret

actualizar_reloj_anim_S:
	ld a, (relojitoAnimS)
	inc a 
	ld (relojitoAnimS), a
ret

actualizar_reloj_anim_W:
	ld a, (relojitoAnimW)
	inc a 
	ld (relojitoAnimW), a
ret

;;S pressed
entityman_posY::
    ld  4(ix), #4

    call actualizar_reloj_anim_S

	cp #0x02 
	jr nz, saltar_change_S

	ld a, #0x00
	ld (relojitoAnimS), a

	call change_sprite

	saltar_change_S:
ret

;;W pressed
entityman_negY::
	ld  4(ix), 	#-2

	call actualizar_reloj_anim_W

	cp #0x02 
	jr nz, saltar_change_W

	ld a, #0x00
	ld (relojitoAnimW), a

	call change_sprite

	saltar_change_W:
ret

;;D pressed
entityman_posX::
	ld  15(ix), #1
	call change_sprite
ret

;;A pressed
entityman_negX::
	ld  15(ix), #-1
	call change_sprite
ret


;;Guardar anterior posicion de la entidad para luego renderizarla
entityman_save_lasts_pos::
	ld  d, 1(ix)	;;Y pos
	ld  9(ix), d 	;;Saves the y position into last y position

	ld  d, 0(ix)	;;X pos
	ld  8(ix), d 	;;Saves the x position into last x position
ret