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


.globl _man_entity_forall_ai
.globl _player

.area _DATA


_ai_counter_normal:: .db 40
_ai_counter_following:: .db 20

MAX_COUNTER = 20


.area _CODE


;;///////////////////////////////////////////////
;; Manage enemy AI following the player
;;///////////////////////////////////////////////
_sys_ai_update_following::
    push ix

    ld ix, #_player
    ld a, P_Y(ix)
    add a, #4


    pop ix
    ld b, E_Y(ix)

    sub b

    ;; COMPROBAMOS QUIEN ESTA MAS ALTO

    ;; SI ESTAN A LA MISMA ALTURA NO HACEMOS NADA
    jp z, _ai_limite

    ;; SI SALTA CARRIE EL PLAYER ESTA MÁS ALTO
    jp c, _player_mas_alto



    ld a, E_AI_COUNTER(ix)
    inc a
    dec a

    ;; SI EL CONTADOR ESTA A 0 REINICIAMOS
    jr z, _ai_limite

    dec a
    ld E_AI_COUNTER(ix), a

    ld a, #-1
    ld E_X(ix), a


    ld a, E_Y(ix)
    inc a
    ld E_Y(ix), a

    jr _end_ai_update2

    _player_mas_alto:

    ld a, E_AI_COUNTER(ix)
    ld b, #MAX_COUNTER
    cp b

    ;; SI EL CONTADOR ESTA EN EL MAXIMO NO HACEMOS NADA
    jr z, _ai_limite

    inc a
    ld E_AI_COUNTER(ix), a

    ld a, #1
    ld E_X(ix), a


    ld a, E_Y(ix)
    dec a
    ld E_Y(ix), a

    jr _end_ai_update2


    ;; FORZAMOS A QUE SE QUEDE EN EN LO MAS BAJO
    _ai_limite:
        ld a, #0
        ld E_X(ix), a
        jr _end_ai_update2
    
    _end_ai_update2:
        ret



;;///////////////////////////////////////////////
;; Manage enemy AI moving on a single axis
;;///////////////////////////////////////////////
_sys_ai_update_top_down::
    ld a, E_AI_COUNTER(ix)
    inc a
    dec a

    jr nz,  _no_zero

    ld a, #MAX_COUNTER
    ld E_AI_COUNTER(ix), a

    ld a, E_X(ix)
    neg
    ld E_X(ix), a

    ld a, E_AI_COUNTER(ix)

    _no_zero:

        dec a
        ld E_AI_COUNTER(ix), a

        ld b, E_Y(ix)
        ld a, E_X(ix)

        add b
        ld E_Y(ix), a

    
    _end_ai_update:
        ret


;;///////////////////////////////////////////////////////////////////////
;; FUNCION PARA MODIFICAR LA POSICION DE UNA ENTIDAD
;; DE MOMENTO SOLO MODIFICAMOS EL OFFSET (QUE AHORA MISMO ES COMO UNA POSICION X)
;;
;; PARAMETROS: DE (ENTIDAD), HL(CONTIENE INFORMACION INPORTANTE)
;;
;; REGISTROS MODIFICADOS: HL, DE, IX
;;
;; RETURN: NADA
;;///////////////////////////////////////////////////////////////////////
_sys_ai_update_one_entity::

    push de
    pop ix

    push hl
    push de

    ld l, E_PREV(ix)
    ld h, E_PREV+1(ix)

    ld bc, #_continuar_ai_update
    push bc           ;; GUARDAMOS EN LA PILA EL VALOR DEL PC + 3
    jp (hl)
    
    _continuar_ai_update:  
        pop de
        pop hl

    ret


;;///////////////////////////////////////////////////////////////////////
;; FUNCION PARA MODIFICAR TODAS LA ENTIDADES
;;
;; PARAMETROS: NADA
;;
;; REGISTROS MODIFICADOS: HL
;;
;; RETURN: NADA
;;///////////////////////////////////////////////////////////////////////
_sys_ai_update::
    ld hl, #_sys_ai_update_one_entity    
    call _man_entity_forall_ai              ;; LLAMAMOS A ESTA FUNCION QUE LE APLICA LA FUNCION ANTERIOR A TODAS LAS ENTIDADES
    ret