;MIT License

;Copyright (c) 2021 Fedora Adventures Pixeltronics

;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 "input.h.s"
.include "man/entity.h.s"
.include "physics.h.s"
.include "cpct_functions.h.s"

move_left:
    ld a, e_cmps_physics(ix)
    set 7, a
    ld e_cmps_physics(ix), a
ret

move_right:
    ld a, e_cmps_physics(ix)
    set 6, a
    ld e_cmps_physics(ix), a
ret

jump:
    call sys_physics_initialize_pj_jump
ret 

key_actions:
    .dw Key_O, move_left
    .dw Key_P, move_right
    .dw Key_Q, jump
    .dw 0



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; FUNCION DE ACTUALIZACION DEL MOVIMIENTO DEL PERSONAJE
;;
;; Descripcion
;;
;; Parametros de entrada
;;
;; Parametros de salida
;;
;; Modifica los registros
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sys_input_update:
    xor a
;    call man_entity_get_from_idx        ;obtengo la posicion del jugador en el puntero IX
    call sys_input_check_keyboard_and_update_player
ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; FUNCION DE ACTUALIZACION DEL MOVIMIENTO DEL PERSONAJE
;;
;; Descripcion
;;
;; Parametros de entrada
;; - IX: Puntero a la entidad jugador
;; Parametros de salida
;;
;; Modifica los registros
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sys_input_check_keyboard_and_update_player:
    ;reseteo de flags de direccion
    ld a, e_cmps_physics(ix)
    res 7, a
    res 6, a
    ld e_cmps_physics(ix), a
    ;reseteo de velocidad
    ld e_vx(ix), #0
    ld e_vy(ix), #0
    ;escaneo de teclado
    call cpct_scanKeyboard_f_asm
    ;comprobacion de teclas pulsadas
    ld iy, #key_actions-4   ;el -4 es un truco para no saltarnos la comprobacion de la primera tecla de key_actions
loop_teclas:
    ld bc, #4               ;incremento de 4 al puntero iy (siguiente tecla)
    add iy, bc
    ld l, 0(iy)
    ld h, 1(iy)
    ;comprobar si hemos terminado de leer la lista de key_actions
    ld a, l
    or h
    ret z       ;salir si H y L son todo ceros
    ;Compruebo si la tecla está pulsada
    call cpct_isKeyPressed_asm
    jr z, loop_teclas
    ;esta es la primera parte de la simulacion de un call-ret, necesaria para el correcto funcionamiento del ciclo key_actions
    ld hl, #loop_teclas
    push hl
    ;cargo la accion asociada a la tecla pulsada
    ld l, 2(iy)
    ld h, 3(iy)
    ;Segunda parte de la simulacion del call-ret anterior. Este jp equivale a ret
    jp (hl)  

ret