;;-----------------------------LICENSE NOTICE------------------------------------
;;  This file is part of CPCtelera: An Amstrad CPC Game Engine 
;;  Copyright (C) 2021 Daniel José García Evans, Iván Alejandro Ontano Herrera,
;;  Sergio Izquierdo Pintado (PyroClastic Software)
;;
;;  Special Thanks to Ennio Fernando Velásquez Berlingeri (PyroBombastic)
;;
;;  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/>.

;;
;;PHYSICS SYSTEM
;;

.include "../globals.h.s"

sys_physics_update::
    ld hl, #sys_physics_update_entity
    ld b, #(e_cmps_alive | e_cmps_physics)  ;;comprobar mascaras de gravedad, fisicas y todo eso
    call man_entity_for_all_matching

    ret

sys_physics_update_entity: ;;lo llama una entidad en IX
        ;;eje vertical
        call sys_physics_gravity

        ld a, e_velY(ix)
        ld b, e_y(ix)
        add a, b
        ld e_y(ix), a


        ld a, e_cmps(ix)
        and #e_cmps_enemy
        jr z, avoid_enemy_clock ;;si es un enemigo se emplea el temporizador
            ;;ld a, e_cmps(ix)
            ;;ld b, a ;;guardo los campos
            ;;and #e_cmps_gravity ;;si es el golbin no se desactiva el render, si no al saltar queda mal
            ;;jr nz, always_render_goblin
            ;;    ld a, b ;;cargo los campos otra vez
            ;;    and #0b10111111  ;;pongo a 0 la mascara de render siempre
            ;;    ld e_cmps(ix), a
            ;;always_render_goblin:

            ld a, e_clock(ix)
            dec a
            ld e_clock(ix), a
            and a
            jr nz, check_limits ;;si el reloj no esta a 0 se salta el movimiento horizontal
                ;;se cambia el sprite de animacion y se renderiza el bicho
                ld a, (enemy_timer_max)
                ld e_clock(ix), a   ;;si el reloj esta a 0 se reinicia
                ld a, e_cmps(ix)
                ;;or #0b01000000            ;;y el de render a 1
                xor #0x01   ;;se pone el bit de animacion a 0 o 1
                ld e_cmps(ix), a
                ;;se aplican las fisicas horizontales
        avoid_enemy_clock:

        ;;eje horizontal
        ld a, e_velX(ix)
        ld b, e_x(ix)
        add a, b
        ld e_x(ix), a

        check_limits:
        ;;COMPROBACION CON EL TECHO
        ld a, e_y(ix)
        cp #16
        jr c, col_techo     ;;si esta por encima de las nubes del limite
            ;;si esta por debajo de las nubes del limite
            ;;COMPROBACION CON EL SUELO
            ld a, e_y(ix)
            ld b, e_h(ix)
            add b
            cp #184
            ret c
            ld a, #184
            sub b
            ld e_y(ix), a
            ld e_velY(ix), #0
            ret

        col_techo:
            ld e_y(ix), #16
            ld e_velY(ix), #1 ;;o Cero


ret

sys_physics_gravity:
    ld a, #(e_cmps_gravity) ;;comprobamos que tenga gravedad
    and e_cmps(ix)
    ret z

    ld a, e_velY(ix)
    inc a
    ld e_velY(ix), a

    ret