;;####################################################################
;;# 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 "physics.h.s"

relojitoRoca: .db #0x00

;;Actualizar las fisicas en cada llamada del bucle principal del juego
physics_update::
	ld hl, #physics_update_one_entity
	ld  a, #Physics_masc

	call entityman_forall_matching
ret

update_scroll_entity:
	push ix
	ld hl, #physics_update_scroll_one_entity
	ld  a, #Physics_masc

	call entityman_forall_matching
	pop ix
ret

physics_update_scroll_one_entity:
	ld a, 7(ix)
	and #Player_masc
	cp #Player_masc
	jp z, saltamos

	ld a, 7(ix)
	and #Aguila_masc
	cp #Aguila_masc
	jr z, saltamos

	ld a, 7(ix)
	and #Rock_masc
	cp #Rock_masc
	jr z, fisica_scroll_rock

	ld a, 7(ix)
	and #SpiderR_masc
	cp #SpiderR_masc
	jr z, comprobar_y

	ld a, 7(ix)
	and #SpiderL_masc
	cp #SpiderL_masc
	jr z, comprobar_y


	ld a, 7(ix)
	and #Queso_masc
	cp #Queso_masc
	jp z, fisica_queso


	ld a, 1(ix)
	add #8
	ld 1(ix), a

	jp saltamos


	fisica_scroll_rock:
		ld  a,	#screen_height + 1	;;Height of the screen + 1
		sub 3(ix)					;;Substract the height of the entity to the height of the screen
		ld  c,	a 					;;C = A

		ld 	a,  1(ix)				;;Saves in A the Entity.y
		add	4(ix)					;;Substracts the velocity of the entity to the y value
		cp	c 						;;Checks if the new Y is in the screen
		jr	nc, invalid_scroll_y			;;If Entity.y > Screen_width

		ld a, 1(ix)
		add #8
		ld 1(ix), a

		jp saltamos

		invalid_scroll_y:
			call entityman_set_for_destruction
			jp saltamos


	comprobar_y:
		ld a, 1(ix)
		add #8
		ld 1(ix), a

		ld a, 1(ix)
		ld b, #250
		sub b
		jp nc, invalid_scroll_y

		jp saltamos
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;fisica del queso
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	fisica_queso:
		ld a, 1(ix)
		add #8		
		cp #0
		jp z, elimino_queso

		ld a, 1(ix)
		add #8
		ld 1(ix), a

		jp saltamos

		elimino_queso:
			call entityman_set_for_destruction
			call puedo_queso

	saltamos:
	pop hl
	jp (hl)

actualizar_reloj_physics:
	ld a, (relojitoRoca)
	inc a 
	ld (relojitoRoca), a
ret

physics_moves:
	ld a, 0(ix)
	add 15(ix)

	ld 0(ix), a

	ld a, 1(ix)
	add 4(ix)

	ld 1(ix), a
ret

;;Actualizar la fisica de una entidad
physics_update_one_entity::
	ld a, 7(ix)
	and #Player_masc
	cp #Player_masc
	jp z, check_pos_player


	ld a, 7(ix)
	and #Aguila_masc
	cp #Aguila_masc
	jr z, fisica_aguila


	ld a, 7(ix)
	and #SpiderR_masc
	cp #SpiderR_masc
	jp z, fisica_spiderR

	ld a, 7(ix)
	and #SpiderL_masc
	cp #SpiderL_masc
	jp z, fisica_spiderL

	ld a, 7(ix)
	and #Queso_masc
	cp #Queso_masc
	jp z, adios_fisica


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;fisica de la roca
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	fisica_roca:
	;;UPDATE Y
	ld  a,	#screen_height + 1	;;Height of the screen + 1
	sub 3(ix)					;;Substract the height of the entity to the height of the screen
	ld  c,	a 					;;C = A

	ld 	a,  1(ix)				;;Saves in A the Entity.y
	add	4(ix)					;;Substracts the velocity of the entity to the y value
	cp	c 						;;Checks if the new Y is in the screen
	jr	nc, invalid_y			;;If Entity.y > Screen_width

	valid_y:
		jr endif_y				;;Continues the execution

	invalid_y:
		;;Eliminar entidad
		call entityman_set_for_destruction

	endif_y:
		call change_sprite
		
		jp moverme


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;fisica del aguila
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	fisica_aguila:
		ld a, 5(ix)   	;;color nos indica cuantas veces actualizamos la fisica hasta caer	
		dec a
		ld 5(ix), a

		ld a, 5(ix)     
		cp #0
		jr z, change_eje

		;;comparar si choca con la izquierda para ir hacia la derecha
		;; si x+vx < 4 cambio
		ld a, 0(ix)    ;;x
		add 15(ix)     ;;vx
		cp #4
		jp m, change_right

		;;comparar si choca con la derecha para ir hacia la izquierda
		;; si x+vx > screen_width+1-w-4 cambio
		ld a, #screen_width + 1
		sub 2(ix)      ;;w
		sub #4
		ld c, a

		ld a, 0(ix)    ;;x
		add 15(ix)     ;;vx
		cp c
		jp nc, change_left


		;;cuando se acaba el valor de actualizacion, me comporto como una roca para caer hacia abajo
		ld a, 4(ix)    ;;vy
		cp #0
		jr nz, fisica_roca

		call change_sprite

		jp moverme

		change_right:
			call render_getNivel_A
			cp #2
			jr z, vel_AP1
			jp m, vel_AP1

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

			ld a, #3
			jp velsAP

			vel_AP1:
				ld a, #1
				jp velsAP

			vel_AP2:
				ld a, #2
				jp velsAP

			velsAP:
			ld 15(ix), a   ;;vx

			jp moverme

		change_left:
			call render_getNivel_A
			cp #2
			jr z, vel_AN1
			jp m, vel_AN1

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

			ld a, #-3
			jp velsAN

			vel_AN1:
				ld a, #-1
				jp velsAN

			vel_AN2:
				ld a, #-2
				jp velsAN

			velsAN:
			ld 15(ix), a   ;;vx

			jp moverme

		change_eje:
			ld a, #0
			ld 15(ix), a   ;;vx


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

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

			ld a, #24
			jp velsAY

			vel_AY1:
				ld a, #8
				jp velsAY

			vel_AY2:
				ld a, #16
				jp velsAY


			velsAY:
			ld 4(ix), a    ;;vy

			jp moverme

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;fisica de la spider de la derecha
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	fisica_spiderR:
		;;si no tengo velocidad Y hago movimiento izquierda-derecha
		ld a, 4(ix)    ;;vy
		cp #0
		jr z, normal_eje_SR

		;;cuando llegue al limite Y que me han dado cambio a movimiento izquierda-derecha
		ld a, 1(ix)    ;;y
		add 3(ix)      ;;h
		ld b, 5(ix)    ;;color(y maxima)
		cp a, b
		jp nc, change_eje_spiderR

		call change_sprite

		jp moverme


		normal_eje_SR:
		;;comprobar si he llegado al limite por la izquierda
		ld a, 0(ix)    ;;x
		add 15(ix)     ;;vx
		cp #4
		jp m, change_right_SR

		;;comprobar si he llegado al limite de la derecha
		ld a, #screen_width + 1
		sub 2(ix)
		sub #4
		ld c, a

		ld a, 0(ix)
		add 15(ix)
		cp c
		jp nc, change_left_SR

		call change_sprite

		jp moverme

		change_right_SR:
			call render_getNivel_A
			cp #2
			jr z, vel_RP1
			jp m, vel_RP1

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

			ld a, #3
			jp velsRP

			vel_RP1:
				ld a, #1
				jp velsRP

			vel_RP2:
				ld a, #2

			velsRP:
			ld 15(ix), a

			jp moverme

		change_left_SR:
			ld 15(ix), #0
			ld 4(ix), #2

			ld a, 7(ix)
			xor #SpiderR_masc
			or #Rock_masc
			ld 7(ix), a

			jp moverme

		change_eje_spiderR:
			ld 4(ix), #0

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

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

			ld 15(ix), #-3
			jp moverme

			vel_RN1:
				ld 15(ix), #-1
				jp moverme

			vel_RN2:
				ld 15(ix), #-2
				jp moverme


		delete_spiderR:
			call entityman_set_for_destruction

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;fisica de la spider de la izquierda
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	fisica_spiderL:
		;;si no tengo velocidad Y hago movimiento derecha-izquierda
		ld a, 4(ix)
		cp #0
		jr z, normal_eje_SL

		;;cuando llegue al limite Y que me han dado cambio a movimiento derecha-izquierda
		ld a, 1(ix)    ;;y
		add 3(ix)      ;;h
		ld b, 5(ix)    ;;color(y maxima)
		cp a, b
		jp nc, change_eje_spiderL

		call change_sprite

		jp moverme

		normal_eje_SL:
		;;comprobar si he llegado al limite por la izquierda
		ld a, 0(ix)
		add 15(ix)
		cp #4
		jp m, change_right_SL

		;;comprobar si he llegado al limite por la derecha
		ld a, #screen_width + 1
		sub 2(ix)
		sub #4
		ld c, a

		ld a, 0(ix)
		add 15(ix)
		cp c
		jp nc, change_left_SL

		call change_sprite

		jp moverme

		change_right_SL:
			ld 15(ix), #0
			ld 4(ix), #2

			ld a, 7(ix)
			xor #SpiderL_masc
			or #Rock_masc
			ld 7(ix), a

			jp moverme

		change_left_SL:
			call render_getNivel_A
			cp #2
			jr z, vel_LN1
			jp m, vel_LN1

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

			ld a, #-3
			jp velsLN

			vel_LN1:
				ld a, #-1
				jp velsLN

			vel_LN2:
				ld a, #-2
				jp velsLN

			velsLN:
			ld 15(ix), a

			jp moverme

		change_eje_spiderL:
			ld 4(ix), #0

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

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

			ld 15(ix), #3
			jp moverme

			vel_LP1:
				ld 15(ix), #1
				jp moverme

			vel_LP2:
				ld 15(ix), #2
				jp moverme

		delete_spiderL:
			call entityman_set_for_destruction

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;fisica del jugador
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	check_pos_player:
		;;comprobar si te sales por la izquierda
		ld a, 0(ix)
		add 15(ix)
		cp #4
		jp m, invalid_px_neg

		;;comprobar si te sales por la derecha
		ld  a,	#screen_width + 1	
		sub 2(ix)
		sub #4					
		ld  c,	a 					

		ld 	a,  0(ix)				
		add	15(ix)					
		cp	c 
		jp nc, invalid_px_pos

		;;comprobar si te sales por arriba
		ld a, 1(ix)
		add 4(ix)
		cp #180
		jp m, invalid_py_neg

		;;comporbar si te sales por abajo
		ld a, #screen_height + 1
		sub 3(ix)
		ld c, a 

		ld a, 1(ix)
		add 4(ix)
		cp c
		jp nc, invalid_py_pos

		jr moverme		

		invalid_px_pos:
			ld a, #screen_width
			sub 2(ix)
			sub #4
			ld 0(ix), a
			ld 15(ix), #0

			jr moverme

		invalid_px_neg:
			ld 0(ix), #4
			ld 15(ix), #0

			jr moverme

		invalid_py_pos:
			ld a, #screen_height
			sub 3(ix)
			ld 1(ix), a
			ld 4(ix), #0

			jr moverme

		invalid_py_neg:
			ld 1(ix), #180
			ld 4(ix), #0

			call scroll_camera
			call update_scroll_entity

	moverme:
		call physics_moves


	adios_fisica:

	pop hl
	jp (hl)