;;------------------------------------------------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"
.globl man_entity_set4destruction
.globl man_entity_forall_matching
.globl man_entity_destroy
.globl matching_type
.globl man_game_create_enemy
;.globl man_game_enemy_lane_down
.globl tilemapActual
tiempo_generar_entidad = 20
tiempo_generar_entidad_pasado: .db 0

check_up:
    ld a, 2(ix)
    add 6(ix)

;; A = ty (y/8)
     ;and #0xF8    ; A = 8*int(ty/8)
     srl a
     srl a
     srl a
;; HL = A (HL = 8*ty)
     ld h, #0
     ld l, a
;; HL = 20*HL
     add hl, hl ;HL = 2*ty
     add hl, hl ;HL = 4*ty
     ld d, h    ; | DE = 4*ty
     ld e, l    ; |
     add hl, hl ;HL = 8*ty
     add hl, hl ;HL = 16*ty
     add hl, de ;HL = 20*ty
    
;; A = x
     ld a, 1(ix)
     add 5(ix)
     srl a ; | A = tx (x/4)
     srl a ; |

     add_hl_a ; macro para añadirle a hl, a, HL = ty * tw + tx

     ; metemos en de la direccion del tilemap de ahora(osea (#tilemapActual))
     push ix
     ld ix, #tilemapActual
     ld a, (ix)
     ld e, a
     ld a, 1(ix)
     ld d, a
     pop ix
     add hl, de

;; HL = tilemap + ty * tw + tx
     ld a, (hl) ; A = title index on the foot on the entity
     sub #25
     ret nc
;; COLLISION DETECTED

     ;ld 6(ix), #0
     ld 6(ix), #2
ret

check_down:
    ld a, 2(ix)
     add 4(ix) ;si no se pone esto en vez de apuntar a esquina abajo izq, apunta a la de arriba
     add 6(ix)
     sub #1
;; A = ty (y/8)
     ;and #0xF8    ; A = 8*int(ty/8)
     srl a
     srl a
     srl a
;; HL = A (HL = 8*ty)
     ld h, #0
     ld l, a
;; HL = 20*HL
     add hl, hl ;HL = 2*ty
     add hl, hl ;HL = 4*ty
     ld d, h    ; | DE = 4*ty
     ld e, l    ; |
     add hl, hl ;HL = 8*ty
     add hl, hl ;HL = 16*ty
     add hl, de ;HL = 20*ty
    
;; A = x
     ld a, 1(ix)
     add 5(ix)
     srl a ; | A = tx (x/4)
     srl a ; |

     add_hl_a ; macro para añadirle a hl, a, HL = ty * tw + tx

     ; metemos en de la direccion del tilemap de ahora(osea (#tilemapActual))
     push ix
     ld ix, #tilemapActual
     ld a, (ix)
     ld e, a
     ld a, 1(ix)
     ld d, a
     pop ix
     add hl, de

;; HL = tilemap + ty * tw + tx
     ld a, (hl) ; A = title index on the foot on the entity
     sub #25
     ret nc
;; COLLISION DETECTED

     ld 6(ix), #-2
ret

check_left:
    ld a, 2(ix)
    add 6(ix)

;; A = ty (y/8)
     ;and #0xF8    ; A = 8*int(ty/8)
     srl a
     srl a
     srl a
;; HL = A (HL = 8*ty)
     ld h, #0
     ld l, a
;; HL = 20*HL
     add hl, hl ;HL = 2*ty
     add hl, hl ;HL = 4*ty
     ld d, h    ; | DE = 4*ty
     ld e, l    ; |
     add hl, hl ;HL = 8*ty
     add hl, hl ;HL = 16*ty
     add hl, de ;HL = 20*ty
    
;; A = x
     ld a, 1(ix)
     add 5(ix)
     srl a ; | A = tx (x/4)
     srl a ; |

     add_hl_a ; macro para añadirle a hl, a, HL = ty * tw + tx

     ; metemos en de la direccion del tilemap de ahora(osea (#tilemapActual))
     push ix
     ld ix, #tilemapActual
     ld a, (ix)
     ld e, a
     ld a, 1(ix)
     ld d, a
     pop ix
     add hl, de

;; HL = tilemap + ty * tw + tx
     ld a, (hl) ; A = title index on the foot on the entity
     sub #25
     ret nc
;; COLLISION DETECTED

     ;ld 6(ix), #0
     ld 5(ix), #1
ret

check_right:
;; A = y
     ld a, 2(ix)
     add 6(ix)

     ;and #0xF8    ; A = 8*int(ty/8)
     srl a
     srl a
     srl a
;; HL = A (HL = 8*ty)
     ld h, #0
     ld l, a
;; HL = 20*HL
     add hl, hl ;HL = 2*ty
     add hl, hl ;HL = 4*ty
     ld d, h    ; | DE = 4*ty
     ld e, l    ; |
     add hl, hl ;HL = 8*ty
     add hl, hl ;HL = 16*ty
     add hl, de ;HL = 20*ty
    
;; A = x
     ld a, 1(ix)
     add 3(ix)
     add 5(ix)
     sub #1
     ;add 5(ix)
     srl a ; | A = tx (x/4)
     srl a ; |

     add_hl_a ; macro para añadirle a hl, a, HL = ty * tw + tx

     ; metemos en de la direccion del tilemap de ahora(osea (#tilemapActual))
     push ix
     ld ix, #tilemapActual
     ld a, (ix)
     ld e, a
     ld a, 1(ix)
     ld d, a
     pop ix
     add hl, de

;; HL = tilemap + ty * tw + tx
     ld a, (hl) ; A = title index on the foot on the entity
     sub #25
     ret nc
;; COLLISION DETECTED

     ;ld 6(ix), #0
      ld 5(ix), #-1
ret

sys_ai_behaviour_left_right::

     ; Si la velocidad x es positiva, se comprueba la derecha
     ld a, 5(ix)
     cp #1
     jr nz, saltoia1
     call check_right
     ret

     saltoia1:
     ; Si la velocidad x es negativa, se comprueba la izquierda
     ld a, 5(ix)
     add #1
     ret nz
     call check_left

     

ret

sys_ai_behaviour_up_down::

     ; Si la velocidad en y es positiva, se comprueba hacia abajo
     ld a, 6(ix)
     cp #2
     jr nz, saltoia2
     call check_down
     ret

     saltoia2:
     ; Si la velocidad en y es negativa, se comprueba hacia arriba
     ld a, 6(ix)
     add #2
     ret nz
     call check_up
ret

;Crea entidades de tipo enemigo cuando su posición es una en específico
;Tambien se puede usar un contador
;Se le pasa por ix la entidad spawner
sys_ai_behaviour_spawner::
    ;Hay que poner un if antes
    push ix
    ld a, (tiempo_generar_entidad_pasado)
    ;ld de, (tiempo_generar_entidad_pasado)
    cp #tiempo_generar_entidad
    jr c, nocrear
    ld a, #0
    ld (tiempo_generar_entidad_pasado), a
    call man_game_create_enemy
    nocrear:
    ld a, (tiempo_generar_entidad_pasado)
    inc a
    ld (tiempo_generar_entidad_pasado), a
    pop ix
    jp sys_ai_behaviour_left_right
    

ret

;;MIRA A VER SI ENEMIGO PUEDE BAJAR DE CARRIL Y SI REBOTA
sys_ai_behaviour_enemy::
    ;ld a, 1(ix)
    ;and #7
    ;cp #0
    ;jr nz, nobajar

    ;call man_game_enemy_lane_down

;nobajar: 
    call sys_ai_behaviour_left_right
    call sys_ai_behaviour_up_down
ret

;;Auto morir
sys_ai_behaviour_autodestroy::

   call man_entity_destroy ;;mirar a partir de minuto 1:19:40, que hay que cambiar los templates y no quiero romper el juego solo xD

ret

;Renderiza una entidad de ia, haciendo que rebote de izquierda a derecha de la pantalla
;Coje la dir de la entidad del stack
sys_ai_one_entity::
    ld e, 9(ix)
    ld d, 10(ix)
    ex de, hl
    jp (hl)
       
 
ret

;Llama a forall para hacer sys_ai_one_entity con todas las entidades de IA y movibles
sys_ai_update::
    ld ix, #sys_ai_one_entity
    ld a, #2 | #8
    ld (#matching_type), a
    call man_entity_forall_matching
ret