;; MIT License
;; 
;; Copyright (c) 2021 capAI / Aitana Devis  Ávila (@AitanaDevis) / Carlos Peñarrubia Morcillo  (@carlospm12) / Pablo Ruiz Ponce (@pabloruizp)
;; 
;; Permission is hereby granted, free of charge, to any person obtaining a copy
;; of this software and associated documentation files (the "Software"), to deal
;; in the Software without restriction, including without limitation the rights
;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
;; copies of the Software, and to permit persons to whom the Software is
;; furnished to do so, subject to the following conditions:
;; 
;; The above copyright notice and this permission notice shall be included in all
;; copies or substantial portions of the Software.
;; 
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
;; SOFTWARE.

.include "cpctelera.h.s"
.include "game.h.s"
.include "entity.h.s"
.include "man_animations.h.s"

.globl cpct_setDrawCharM0_asm
.globl _menu_logic
.globl cpct_drawStringM0_asm
.globl wait_for_pulsacion
.globl _menu_config
.globl _print_score
.globl _print_final_score

texto_nivel_1: .asciz "You will start"
texto_nivel_2: .asciz "  Level: "
texto_last_level: .asciz "Last level!"
texto_final_1: .asciz "Congratulations!"
texto_final_2: .asciz "You have passed"
texto_final_3: .asciz "Barking Adventure!"
texto_final_4: .asciz "Score: "

.area _DATA

_puntuacion:: .db 0 ,0

_ralentizado:: .db 0

_nivel:: .db 1  ;;el nivel que se carga

.area _CODE


;;///////////////////////////////////////////////////////////////////////
;; SLOWS DOWN THE SPEED OF THE GAME WHEN THE PLAYER TAKES THE "SLOWER" BONUS
;;
;; PARAMETROS: 
;;
;; REGISTROS MODIFICADOS: 
;;
;; RETURN: 
;;///////////////////////////////////////////////////////////////////////
_slow_game::
   ld a, #10
   ld (_ralentizado), a
   ret


;;///////////////////////////////////////////////////////////////////////
;; FUNCION PARA CONTROLAR LOS FRAMES DEL JUEGO
;;
;; PARAMETROS: H (PORCENTAJE DE ESPERA)
;;
;; REGISTROS MODIFICADOS: H
;;
;; RETURN: NADA
;;///////////////////////////////////////////////////////////////////////
_wait:
   _principio_espera:
      halt
      halt
      call cpct_waitVSYNC_asm
      dec h
      jr nz, _principio_espera
   ret


;; PARA CREAR ENTIDADES CON CADA UNO DE LOS TEMPLATES DEFINIDOS AL PRINCIPIO DEL FICHERO
;; SE LE PASA COMO ARGUMENTO EL PUNTERO AL TEMPLATE
;; ASI EVITAMOS DUPLICIDAD EN EL CODIGO
_man_game_create_template_entity:: 
   push hl
   call _man_entity_create
   ld d, h
   ld e, l
   ld bc, #SIZE_ENTITY
   pop hl
   call cpct_memcpy_asm
   ret



;;///////////////////////////////////////////////////////////////////////
;; FUNCION PARA INICIALIZAR PARAMETROS DEL JUEGO
;;
;; PARAMETROS: NO IMPORTA
;;
;; REGISTROS MODIFICADOS: NO IMPORTA
;;
;; RETURN: NADA
;;///////////////////////////////////////////////////////////////////////
_man_game_init:: 

   ld c, #0
   call cpct_setVideoMode_asm       ;; CAMBIAMOS A MODO 0

   ld hl, #0x1400
   call cpct_setPALColour_asm       ;; SETEAMOS EL FONDO NEGRO
   
   ld hl, #0x1410
   call cpct_setPALColour_asm       ;; PINTAMOS EL BORDE DE NEGRO

   ld hl, #_pal_main 
   ld de, #16                    ;;TAMAÑO DE LA PALETA 
   call cpct_setPalette_asm    ;;SETEAMOS LA PALETA DEL SPRITE DOGGO

   call clean_array_entities
   ld a, (_nivel)
   call _man_entity_init
   call _man_player_init
   call _print_score
   ret



;;///////////////////////////////////////////////////////////////////////
;; LOOP DEL JUEGO
;;
;; PARAMETROS: NO IMPORTA
;;
;; REGISTROS MODIFICADOS: NO IMPORTA
;;
;; RETURN: NADA
;;///////////////////////////////////////////////////////////////////////
_man_game_play::
   
   _game_loop:
      
      call man_animation_update 
      call _sys_physics_update
      call _sys_ai_update
      call _sys_render_update
      call sys_collision_update

      ;;;Comprobar si ha muerto o ha pasado el nivel el player
      ld a, (#_player+P_PREV)
      inc a
      dec a
      jr z, no_muerto_no_pasado_nivel
      ret
      no_muerto_no_pasado_nivel:

      ld a, (_ralentizado)
      inc a
      dec a

      ;; SI LA VARIABLE RELENTIZADO ES DISTINTA DE 0 EL JUEGO ESTA RELENTIZADO
      jr z, _velocidad_normal

         dec a
         ld (_ralentizado), a

         ld h, #5 
         call _wait
         jr _final_bucle_juego

      _velocidad_normal:
         ;; CONTROLAMOS LOS FPS DEL JUEGO (POR DEFECTO 50)
         ld h, #1 
         call _wait
   
   _final_bucle_juego:
      ;; VOLVEMOS AL LOOP DEL JUEGO
      jr _game_loop
   ret


;;///////////////////////////////////////////////////////////////////////
;; LOOP DE LA LÓGICA DEL JUEGO
;;///////////////////////////////////////////////////////////////////////
_man_game_logic:

   loop_man_game_logic:
   call _menu_config
   call _menu_init
   call _menu_logic
   call _borrar_pantalla
   level_game_loop:
      call print_nivel_texto
      call _borrar_pantalla
      call _man_game_init      
      call _man_game_play

      call _borrar_pantalla

      ld a, #MAX_NIVEL
      ld hl, #_nivel
      cp (hl)
   jr nc, level_game_loop

   call end_of_game

   jr loop_man_game_logic

   ret

;;///////////////////////////////////////////////////////////////////////
;; FUNCTION IN CHARGE OF CLEANING THE SCREEN
;;///////////////////////////////////////////////////////////////////////
_borrar_pantalla:
   ld hl, #0x8000
   ld de, #0x8001
   ld bc, #0x8000-1
   ld (hl), #0
   ldir

   ret

;;///////////////////////////////////////////////////////////////////////
;; INCREASE THE LEVEL
;;///////////////////////////////////////////////////////////////////////
increse_level:
   ld hl, #_nivel
   inc (hl)
   ret


;;///////////////////////////////////////////////////////////////////////
;; LOOP DE LA LÓGICA DEL JUEGO
;;///////////////////////////////////////////////////////////////////////
end_of_game:
   call _menu_config
   call print_end_game
   call wait_for_pulsacion

   ld a, #1  
   ld (_nivel), a
   ld hl, #0
   ld (_puntuacion), hl

   ret

;;///////////////////////////////////////////////////////////////////////
;; PRINT FAREWELL STRINGS
;;///////////////////////////////////////////////////////////////////////
print_end_game:
   ld iy, #texto_final_1
   ld hl, #0xC239
   call cpct_drawStringM0_asm
   ld iy, #texto_final_1
   ld hl, #0x8239
   call cpct_drawStringM0_asm

   ld iy, #texto_final_2
   ld hl, #0xC2DA
   call cpct_drawStringM0_asm
   ld iy, #texto_final_2
   ld hl, #0x82DA
   call cpct_drawStringM0_asm

   ld iy, #texto_final_3
   ld hl, #0xC375
   call cpct_drawStringM0_asm
   ld iy, #texto_final_3
   ld hl, #0x8375
   call cpct_drawStringM0_asm

   ld iy, #texto_final_4
   ld hl, #0xC510
   call cpct_drawStringM0_asm
   ld iy, #texto_final_4
   ld hl, #0x8510
   call cpct_drawStringM0_asm

   call _print_final_score

   ret


;;///////////////////////////////////////////////////////////////////////
;; PRINTS INFORMATION ABOUT THE LEVEL
;;///////////////////////////////////////////////////////////////////////
print_nivel_texto:
   ld a, (_nivel)
   cp #10
   jr z, print_last_level_texto

   ld iy, #texto_nivel_2
   ld hl, #0xC41F
   call cpct_drawStringM0_asm
   ld iy, #texto_nivel_2
   ld hl, #0x841F
   call cpct_drawStringM0_asm

   ld a, (_nivel)
   add #48
   ld e, a
   push de
   ld hl, #0xC442
   call cpct_drawCharM0_asm
   pop de
   ld hl, #0x8442
   call cpct_drawCharM0_asm
   jr fin_print_nivel_texto

   print_last_level_texto:
   ld iy, #texto_last_level
   ld hl, #0xC3C3
   call cpct_drawStringM0_asm
   ld iy, #texto_last_level
   ld hl, #0x83C3
   call cpct_drawStringM0_asm

   fin_print_nivel_texto:
   ld h, #100
   call _wait
   ret