;;------------------------------------------------LICENSE NOTICE------------------------------------------------------------------------------
;;  This file is part of Amstrad CPC videogame "Redsea"
;;  Copyright (C) 2021 Crab Party / Elena López (AneleSplats in itch.io) / Iván Tortosa (Pluvs in itch.io, @IvanTortosaBer1 on Twitter) / Antonio Gosálvez (BalgroHub in itch.io)
;;  Copyright (C) 2015 ronaldo / Fremos / Cheesetea / ByteRealms (@FranGallegoBR)
;;
;;  This program is free software: you can redistribute it and/or modify
;;  it under the terms of the GNU Lesser General Public License as published by
;;  the Free Software Foundation, either version 3 of the License, or
;;  (at your option) any later version.
;;
;;  This program is distributed in the hope that it will be useful,
;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;  GNU Lesser General Public License for more details.
;;
;;  You should have received a copy of the GNU Lesser General Public License
;;  along with this program.  If not, see <http://www.gnu.org/licenses/>.
;;------------------------------------------------LICENSE NOTICE-------------------------------------------------------------------------
.include "cpctelera.h.s"

;Funciones y variables globales
.globl cpct_scanKeyboard_f_asm
.globl cpct_isKeyPressed_asm
.globl man_entity_get_from_idx

.globl jugadorEstado
.globl bloquearMovimiento
.globl liberarMovimiento

.globl resetearNivel

.globl _mainC_jump_up
.globl _mainC_jump_down
.globl _mainC_jump_left
.globl _mainC_jump_right

_anim_right:
    ld hl, #_mainC_jump_left
    ld 13(ix), l
    ld 14(ix), h
ret

_anim_left:
    ld hl, #_mainC_jump_right
    ld 13(ix), l
    ld 14(ix), h
ret

_anim_up:
    ld hl, #_mainC_jump_up
    ld 13(ix), l
    ld 14(ix), h
ret

_anim_down:
    ld hl, #_mainC_jump_down
    ld 13(ix), l
    ld 14(ix), h
ret



move_right:
    ld 5(ix), #1
    call bloquearMovimiento
    ld l, 13(ix)
    ld h, 14(ix)        ; Puntero actual de la animacion en hl

    ld c, (hl)
    inc hl
    ld b, (hl)          ; bc = sprite a almacenar
    dec hl

    ld a, c
    or b
    jr z, _anim_left   ; Llega al final de la animacion o aun no hay animacion

ret
move_left:
    ld 5(ix), #-1
    call bloquearMovimiento
    ld l, 13(ix)
    ld h, 14(ix)        ; Puntero actual de la animacion en hl

    ld c, (hl)
    inc hl
    ld b, (hl)          ; bc = sprite a almacenar
    dec hl

    ld a, c
    or b
    jr z, _anim_right   ; Llega al final de la animacion o aun no hay animacion
ret
jump:
    ; ;can jump?
    ; xor a
    ; add 6(ix)
    ; ret nz

    ; ;jump
    ; ld a, 6(ix)
    ; sub #8
    ; ld 6(ix), a ;vy

    ld 6(ix), #-3 ;vy
    call bloquearMovimiento
    ld l, 13(ix)
    ld h, 14(ix)        ; Puntero actual de la animacion en hl

    ld c, (hl)
    inc hl
    ld b, (hl)          ; bc = sprite a almacenar
    dec hl

    ld a, c
    or b
    jr z, _anim_up   ; Llega al final de la animacion o aun no hay animacion
ret

down:
    ld 6(ix), #3 ;vy
    call bloquearMovimiento
    ld l, 13(ix)
    ld h, 14(ix)        ; Puntero actual de la animacion en hl

    ld c, (hl)
    inc hl
    ld b, (hl)          ; bc = sprite a almacenar
    dec hl

    ld a, c
    or b
    jr z, _anim_down   ; Llega al final de la animacion o aun no hay animacion
ret

restart:
    call resetearNivel
ret


key_actions:
    .dw Key_O, move_left
    .dw Key_P, move_right
    .dw Key_Q, jump
    .dw Key_A, down
    .dw Joy0_Left, move_left
    .dw Joy0_Right, move_right
    .dw Joy0_Up, jump
    .dw Joy0_Down, down
    .dw Key_R, restart
    .dw 0


;Comprueba la pulsación de las teclas O y letraP
;Moviendo el personaje a izquierda o derecha respectivamente (usando vx)
sys_input_check_keyboard_and_update_player::
    ; ld 5(ix), #0 ;vx = 0
    ; ld 6(ix), #0 ;vy = 0

    ;call cpct_scanKeyboard_f_asm

    ;Key-Action Check-Call loop
    ld iy, #key_actions-4

    ; Parte del movimiento
    ;Si jugadorEstado es 02, no se puede hacer ningun imput, por lo tanto se sale del método
    ld a, (#jugadorEstado)
    sub #02
    ret z

loop_keys:
    ld bc, #4
    add iy, bc ;siguiente tecla

    ld l, 0(iy) ;hl = next key
    ld h, 1(iy)
    ;Check if key = null
    ld a, l
    or h
    ret z ;si h y l son 0 salir
    ;Check if key is pressed
    call cpct_isKeyPressed_asm
    jr z, loop_keys
    ;; key is pressed execute action
    ld hl, #loop_keys ;para simular un call al hacer el jp
    push hl
    ld l, 2(iy)
    ld h, 3(iy)
    jp (hl)
;continue:
    ;jr loop_keys implicit on function ret

; letraO:
;     ld 5(ix), #-1
; ret
; letraP:
;     ld 5(ix), #1
; ret

;Primero si es un personaje controlable, comprueba las teclas y lo le cambia la velociad
;Despues a todas las entidades movibles les aplica la velociad y las mueve



;Guarda la funcion sys_physics_one_entity en hl y entidad_movible en a
;A todas las entidades movibles les aplica la funcion
sys_input_update::
    ;; get entity 0 (player) en IX
    xor a
    call man_entity_get_from_idx
    ;;update player using keyboard status
    call sys_input_check_keyboard_and_update_player
ret