;;------------------------------------------------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-------------------------------------------------------------------------
.globl cpct_drawSprite_asm
.globl man_entity_forall_matching
.globl matching_type
.globl resetearNivel
.globl pasarNivel
.globl _img_win
.globl _main

;contador: .db #10   ; Cada cuanto dibuja un frame
esperarAnim:: .db #0
death_or_next:: .db #0

_reset:
    ld a, (#death_or_next)
    or a                  ; si no 0 then
    jr nz, _next
    call resetearNivel
ret

_next:
    ld a, (#death_or_next)
    sub #2                   ; if (a >= 2)
    jp c, _next1           ; not
    jr z, _next2           ; then
ret

_next1:
    ld a, #0
    ld (#death_or_next), a
    call pasarNivel
ret

_next2:
    ld c, #40 ;#7
    ld b, #24 ;#16 
    ld hl, #_img_win
    ld e, l
    ld d, h
    ld hl, #0xC332
    ex de, hl
    call cpct_drawSprite_asm ;pide hl, de, c y b
    
    ; Cometemos el acto ilegan de poner halt, porque no nos importa ya nuestra salud mental y nos da igual que el programa se pare salu2

    ld a, #0xFF
    volver1:
    halt
    dec a
    jr nz, volver1
    
    call _main
    
    
ret

_deathSprite:
    ld a, (#esperarAnim)
    dec a
    ld (#esperarAnim), a        ; Uno menos al contador
    or a
    jr z, _reset
ret

_resetAnim:

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

    ld h, b
    ld l, c          ; bc = siguiente sprite a almacenar

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

jp z, _salto1

sys_animations_non_loopable::

    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, _salir   ; Llega al final de la animacion o aun no hay animacion

    ld a, 17(ix)
    dec a
    ld 17(ix), a        ; Uno menos al contador
    or a
    jr nz, _salir        ; Llega a 0, dibuja

    ld  7(ix), c    ; Guarda el sprite en la entidad
    ld  8(ix), b

    inc hl
    inc hl
    ld  13(ix), l    ; Guarda el paso de la animacion en la entidad
    ld  14(ix), h

    ld 17(ix), #3        ; Reiniciar contador
    ld a, (#esperarAnim)
    or a                  ; si no 0 then
    jr nz, _deathSprite           ; se activa al morir el personaje

ret
 
sys_animations_one_entity::

    ld a, 17(ix)
    dec a
    ld 17(ix), a        ; Uno menos al contador
    or a
    jr nz, _salir        ; Llega a 0, dibuja

    ld l, 13(ix)
    ld h, 14(ix)        ; Puntero actual de la animacion en hl

    inc hl
    inc hl              ; Hacemos que apunte al siguiente frame
    ld c, (hl)
    inc hl
    ld b, (hl)          ; bc = siguiente sprite a almacenar
    dec hl

    ld a, c
    or b
    jr z, _resetAnim    ; Llega al final de la animacion
    
_salto1:
    ld  13(ix), l    ; Guarda el paso de la animacion en la entidad
    ld  14(ix), h

    ld  7(ix), c    ; Guarda el nuevo sprite en la entidad
    ld  8(ix), b

    ld 17(ix), #10        ; Reiniciar contador

_salir:

ret
sys_animations_update::
    ld ix, #sys_animations_one_entity
    ld a, #16
    ld (#matching_type), a
    call man_entity_forall_matching

    ld ix, #sys_animations_non_loopable
    ld a, #0x40
    ld (#matching_type), a
    call man_entity_forall_matching
ret