; --------------------------------------
;; ARCHIVO DE CABECERA DEL ENTITY MANAGER
;; --------------------------------------

;; FUNCIONES PUBLICAS
.globl entity_manager_create 
.globl entity_manager_getEntityArray
.globl entity_manager_destroy_entity
.globl entity_manager_update
.globl entity_manager_forall_matching

;; CONSTANTES
max_entities = 7
sizeof_e = 17


;; Macro que define una entidad con todos sus componentes
.macro DefineEntity _name, _x, _y, _w, _h, _vx, _vy, _sprite_pointer, _cmp, _ai_st
_name::
    .db     _x                  ;; Posición x de la entidad
    .db     _y                  ;; Posición y de la entidad
    .db     _w                  ;; Ancho de la entidad
    .db     _h                  ;; Altura de la entidad
    .db     _vx                 ;; Velocidad en el eje x
    .db     _vy                 ;; Velocidad en el eje y
    .dw     _sprite_pointer     ;; Puntero a la zona de memoria donde empieza el sprite
    .dw     0x0000
    .db     0x00, 0x00          ;; AI-aim  (AI apunta a x) (AI apunta a y)
    .db     _cmp                ;; Componentes de la entidad
    .db     _ai_st              ;; AI (estado)
    .db     _ai_st              ;; AI (estado anterior)
    .dw     0x0000              ;; Next AI  patrol-step ()
.endm

;; Variables auxiliares para mayor legibilidad
;; del código al usar el registro puntero IX
e_x  = 0
e_y  = 1
e_w  = 2
e_h  = 3
e_vx = 4
e_vy = 5
e_sprite_pointer_l = 6
e_sprite_pointer_h = 7
e_last_sprite_pointer_position_l = 8
e_last_sprite_pointer_position_h = 9
e_ai_aim_x = 10
e_ai_aim_y = 11
e_cmp = 12
e_ai = 13
e_ai_pre = 14
e_ai_patrol_step_l = 15
e_ai_patrol_step_h = 16

;;ENTITY COMPONENTS
e_cmp_invalid = 0x00
e_cmp_alive = 0x01
e_cmp_physics = 0x02
e_cmp_render = 0x04
e_cmp_colision = 0x08
e_cmp_default = e_cmp_render | e_cmp_physics | e_cmp_alive | e_cmp_colision

;;AI ESTADO
e_ai_st_noAI = 0x00
e_ai_st_stand_by = 0x01
e_ai_st_move_to = 0x02
e_ai_st_patrol = 0x03