; ; ; ; MIT License
; ; ; ; 
; ; ; ; Copyright (c) 2021 Ramiro Hernán García Iten / Raúl Ripoll Pérez / Alexandru Marius Cozma
; ; ; ; 
; ; ; ; 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.

; ; ; ; ----------------- AUTHORS ------------------
; ; ; ;     Ramiro Hernán García Iten: rhgi1@alu.ua.es
; ; ; ;     Raúl Ripoll Pérez: rrp42@alu.ua.es
; ; ; ;     Alexandru Marius Cozma: amc246@alu.ua.es
; ; ; ; 
; ; ; ; Art by Sara Alfosea - IG: @Slinfir
; ; ; ; ---------------------------------------------

; ; ; ; Third Party source code used
; ; ; ; ----------------------------
; ; ; ; CPCtelera - owned by ronaldo / (Cheesetea, Fremos, ByteRealms) - GNU Lesser General Public License.


;;-----------------------------LICENSE NOTICE------------------------------------
;;  This file is part of CPCtelera: An Amstrad CPC Game Engine 
;;  Copyright (C) 2018 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/>.
;;-------------------------------------------------------------------------------




;;; ==========================================
;;; ==========================================
;;; ENTITY MANAGER
;;; ==========================================
;;; ==========================================
  
; Modifica: A, HL
man_entity_init::
   xor   a
   ld    (_num_entities), a

   ld    hl, #_entity_array
   ld    (_last_ent_ptr), hl

   ; Cargo el player el primero para que se quede delante de todo
   ld    hl, #_player
   call  man_entity_create
   ld    hl, #_plataforma
   call  man_entity_create
   ld    hl, #_plataforma2
   call  man_entity_create
   ld    hl, #_plataforma3
   call  man_entity_create
   ret

; Crea una nueva entidad
; Parámetros de entrada
;     HL: puntero a los datos
;
; Modifica: A, BC, DE 
man_entity_create::
   ;    Con ldir cargo la información a la que apunta HL a la 
   ; posición a la que apunta DE tantos bytes como diga BC
   ld    de, (_last_ent_ptr)
   ld    bc, #entity_size
   ldir  
   
   ld    ix, (_last_ent_ptr)
   ld    de, #0xC000
   ld    a, e_y(ix)
   add   #start_height
   ld    b, a
   ld    c, e_x(ix)
   call  cpct_getScreenPtr_asm

   ld    e_prev_ptr   (ix), l
   ld    e_prev_ptr+1 (ix), h
   ld    e_prev_ptr2  (ix), l
   ld    e_prev_ptr2+1(ix), h

   ; Aumento el número total de entidades
   ld    a, (_num_entities)
   inc   a
   ld    (_num_entities), a
   
   ; Le añadimos al último elemento vivo el tamaño de una sola entidad
   ld    hl, (_last_ent_ptr)
   ld    bc, #entity_size
   add   hl, bc
   ld    (_last_ent_ptr), hl
   ret

; Elimina una entidad
; Parámetros de entrada
;     DE: puntero a la entidad
;
; Modifica: AF, BC, DE, HL
man_entity_destroy::
   ; Paso el último elemento a la posición donde está la entidad a eliminar
   ld    hl, (_last_ent_ptr)
   ld    bc, #entity_size
   sbc   hl, bc
   ld    (_last_ent_ptr), hl
   ldir  

   ; Decremento el número total de entidades
   ld    a, (_num_entities)
   dec   a
   ld    (_num_entities), a

   ret

; Devuelve en IX la dirección del array de entidades y en A el número
; Reminder: el IX puede operar con las posiciones que hemos definido arriba
man_entity_getArray::
   ld    ix, #_entity_array
   ld    a, (_num_entities)
   ret

; Devuelve en IX la dirección del array de entidades
man_entity_getArray_IX::
   ld    ix, #_entity_array
   ret

; Devuelve en A el número de entidades
man_entity_getArray_A::
   ld    a, (_num_entities)
   ret

; ¡¡ OJO !! Esta función tiene que llamarse siempre y cuando sea correcto
; el valor de IX (array).
;
; Salta a la siguiente posición en el array de entidades. Debe controlarse
; la cantidad de elementos restantes al terminar.
; Modifica: BC, IX
man_entity_nextEntity::   ; 
   ld    bc, #entity_size     ; Continuamos recorriendo elementos sumándole 
   add   ix, bc               ; a IX el tamaño de una entidad.
   ret

man_entity_playerHit::
   ; Cargamos datos del jugador
   ld    iy, #_entity_array
   ld    ix, #_pillow_hit
   ld    a, e_info(iy)
   cp    #0
   jr    z, renderLeft
      ld    a, e_x(iy)        ; Si es mirando a la derecha, le sumamos
      add   a, #6             ; 6 a la posición del jugador.
      ld    hl, #_pillow_0    ; Generamos el sprite hacia la derecha.
      ld    e_sptr(ix)  , l
      ld    e_sptr+1(ix), h
      jp    endRenderHit
 renderLeft:
      ld    a, e_x(iy)        ; Si es mirando a la izquierda, le restamos 5
      sub   a, #5             ; a la posición del jugador.
      ld    hl, #_pillow_1    ; Generamos el sprite hacia la izquierda.
      ld    e_sptr(ix)  , l
      ld    e_sptr+1(ix), h

 endRenderHit:
   ld    e_x(ix), a
   ld    a, e_y(iy)
   ld    e_y(ix), a
   ; Cargamos la entidad y modificamos sus datos
   ld    hl, #_pillow_hit
   ; Pintamos el golpe
   call  man_entity_create
   xor   a
   ld    (_hitON), a
   ret