; ##-----------------------------LICENSE NOTICE------------------------------------
; ##  This file is part of Hacktank
; ##
; ##  Hacktank 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.
; ##
; ##  Hacktank 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 Hacktank.  If not, see <http://www.gnu.org/licenses/>.
; ##------------------------------------------------------------------------------


.area _DATA
.area _CODE
.include "cpctelera.h.s"
.include "pj.h.s"
.include "main.h.s"




DefineEntity hero_data, 0x30, 0x45, 0x01, 0x00, 0x04, 0x0C, #_sprite_Spritesheet_00 , ent_moveKeyboard,0x30,0x45,0x00,0x00,0x00,0x00,0,0,0,0
DefineEntity hero_data_default, 0x30, 0x45, 0x01, 0x00, 0x04, 0x0C, #_sprite_Spritesheet_00 , ent_moveKeyboard,0x30,0x45,0x00,0x00,0x00,0x00,0,0,0,0

;DefineEntity enemy_data, 0x30, 0x01, #00, 0x04, 0x04, 0x0C, 0x00 , ent_move,0x00,0x00
disparos:
DefineNBalas disparos, k_max_num_bala
;DefineEntity enemy_data, 0x30, 0x01, #01, 0x04, 0x04, 0x0C, 0x00 , ent_move

;Definebala enemy_data, 0x30, 0x01, #00, #-04, 0x04, 0x0C, 0x00 , ent_move,0x00,0x00;
obstaculos:
DrawableEntity obs1, 0x10, 0x10, 0x04, 0x0C,  #_sprite_prueba,0x00,0x00
DrawableEntity obs2, 0x20, 0x20, 0x04, 0x0C,  #_sprite_prueba,0x00,0x00
DrawableEntity obs3, 0x30, 0x30, 0x04, 0x0C,  #_sprite_prueba,0x00,0x00
k_size=6
k_number=2

n_pulsado_new: .db 00
n_cartucho: .db 00

n_num_bala:.db 00
n_next_bala: .dw disparos

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DIBUJAR UNA ENTIDAD
;; REGISTROS DESTRUIDOS: AF, BC, DE, HL
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;reiniciar pj
pj_reiniciar:
  call reiniciar_bala
  ld a,#0
  ld (n_cartucho),a
  ld (n_num_bala),a

  ld de,#hero_data
  ld hl, #hero_data_default
  call ent_copy
ret
;mover ix donde iy
ent_reset_pos:


  ld a, de_anty(iy)
  ld    de_y(ix), a
  ld    de_anty(ix), a

  ld a,de_antx(iy)
  ld    de_x(ix), a
  ld    de_antx(ix), a



ret
;espejar velocidad y
ent_mirror_y:
  ld a,e_vy(ix)
  sub  e_vy(ix)
  sub  e_vy(ix)
  ld e_vy(ix),a
ret
;espejar velocidad x
ent_mirror_x:
  ld a,e_vx(ix)
  sub  e_vx(ix)
  sub  e_vx(ix)
  ld e_vx(ix),a
ret

;aleatorio
rng_max_power:
  ex af,af';'
  call  cpct_getRandom_mxor_u8_asm
  ;ld a,#10;cargar el maximo que quieres
  ex af,af';'
  ld c,a
  ld b,l
  jr bucleini
  pos1:
  ld a,b
  srl a
  ld b,a
  bucleini:
  ld a,c
  sub a,b
  ;add a,#0x7F
  jr c, pos1;no hay acarreo positivo
  ;b resultado
ret

;copiar entidades
ent_copy:
  ld bc ,#k_entity_size
  ldir
ret
;n_cartucho
;bala de todos
bal_doForAll:
  ld a,(n_cartucho)
  ld d,a
  ld a,#k_max_num_bala
  ld ix, #disparos
  ld (metodo2),hl
  buc2:
    bit 0,d
    jr z, nada
    push de
    push af
    metodo2=.+1
    call ent_draw
    pop af
    pop de
    nada:
    srl d
    ld bc, #k_bala_size
    add ix,bc

    dec a
  jr nz, buc2
ret

coll_x:
  ld a,de_x(ix)
  sub a,c
  cp a,#80
  jr nc, colx;no ha
  add a,c
  add a,c
  add a, de_w(ix)
  dec a
  cp a,#80
  jr nc, colx;no hay acarreo positivo
  ret

  colx:
    call ent_mirror_x
    call retroceder
ret
coll_y:
  ld a,de_y(ix)
  sub a,c
  cp a,#200
  jr nc, coly;no hay acarreo positivo
  add a,c
  add a,c
  add a, de_h(ix)
  dec a
  cp a,#200
  jr nc, coly;no hay acarreo positivo
  ret

  coly:
    call ent_mirror_y
    call retroceder
ret

;contar tiempo para destruir bala
tiempo_dest:
  ld a,n_contmuerte(ix)
  inc a
  ld n_contmuerte(ix),a
  cp a,#k_contmuerte_max
  jr nz,acabado_nada
    call destruir_bala
  acabado_nada:
ret
;destruir bala
destruir_bala:
  ld c,a
  ld a,(n_num_bala)
  dec a
  ld (n_num_bala),a
  ld a,n_cartucho_bala(ix)
  ld b,a
  ld a,(n_cartucho)
  sub a,b
  ld (n_cartucho),a
  ld a,c
  call cleartotal
  ;call ren_clear1
  ;call ren_clearO
ret
moveleft:
  ld a, de_x(ix)
  cp #0
  jp z,no_mover
  ld e_vx(ix), #-1
  jp ent_move_x

moveright:
  ld    a, de_x(ix)
  add   de_w(ix)
  cp #0x50
  jp z,no_mover
  ld e_vx(ix), #1
  jp ent_move_x

moveup:
  ld a, de_y(ix)
  cp #0
  jp z,no_mover
  ld e_vy(ix), #-4
  jp ent_move_y
ret

movedown:
  ld    a, de_y(ix)
  add   de_h(ix)
  cp #0xC8
  jp z,no_mover
  ld e_vy(ix), #4
  jp ent_move_y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DIBUJAR UNA ENTIDAD
;; REGISTROS DESTRUIDOS: AF, BC, DE, HL
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ent_draw:

  jp ren_drawEntity



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BORRA UNA ENTIDAD
;; REGISTROS DESTRUIDOS: AF, BC, DE, HL
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ent_clear:

;;;

   jp ren_clearO



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ACTUALIZAR UNA ENTIDAD
;; REGISTROS DESTRUIDOS:
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ent_update:
   ld     h, e_up_h(ix)
   ld     l, e_up_l(ix)
   jp    (hl)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MOVER UNA ENTIDAD CON TECLADO
;; REGISTROS DESTRUIDOS:
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ent_moveKeyboard:
  ;;;;;;;;;A
  call cpct_scanKeyboard_asm
  ld hl, #Key_A
  call cpct_isKeyPressed_asm
  jr z, a_no_pulsada
    call  moveleft
  a_no_pulsada:
  ;;;;;;;;;D
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_D
  call cpct_isKeyPressed_asm
  jr z, d_no_pulsada
    call moveright
  d_no_pulsada:
  ;;;;;;;;;W
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_W
  call cpct_isKeyPressed_asm
  jr z, w_no_pulsada
    call moveup
  w_no_pulsada:
  ;;;;;;;;;S
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_S
  call cpct_isKeyPressed_asm
  jr z, s_no_pulsada
    call movedown
  s_no_pulsada:
  no_mover:
  ;;;;;;;;;Space
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_Space
  call cpct_isKeyPressed_asm
  jr z, space_no_pulsada
  ld a,(n_pulsado_new)
  bit 0,a
    jr nz,space_pulsada_mal
    ld a,(n_pulsado_new)
    set 0,a
    ld (n_pulsado_new),a
    call shoot
    jr space_pulsada_mal
    space_no_pulsada:
      ;ld a, #00
      ld a,(n_pulsado_new)
      res 0,a
      ld (n_pulsado_new),a
    space_pulsada_mal:
  ;;;;;;;;;;;;;;;-N
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_N
  call cpct_isKeyPressed_asm
  ;;ejemplo
    jr z, n_no_pulsada
    ld a,(n_pulsado_new)
    bit 7,a;;change bit
      jr nz,n_pulsada_mal
      ld a,(n_pulsado_new)
      set 7,a;change bit
      ld (n_pulsado_new),a
      ;;;function here
      ;call pj_reiniciar
      ;jp muerte
      ;jp siguiente_nivel
      ;call enem_disparo
      ;call sfx
      ;call prueba111
      ;pop af
      ret
      ;;;function here
      jr n_pulsada_mal
  n_no_pulsada:
  ld a,(n_pulsado_new)
  res 7,a;change bit
  ld (n_pulsado_new),a
  n_pulsada_mal:


  ;;;;;;;;;;;;;left
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_CursorLeft
  call cpct_isKeyPressed_asm
  jr z, left_no_pulsada
  ld a,(n_pulsado_new)
  bit 1,a;;change bit
    jr nz,left_pulsada_mal
    ld a,(n_pulsado_new)
    set 1,a;change bit
    ld (n_pulsado_new),a
    ;;;function here
    call girarderecha
    ;;;function here
    jr left_pulsada_mal
  left_no_pulsada:
  ld a,(n_pulsado_new)
  res 1,a;change bit
  ld (n_pulsado_new),a
  left_pulsada_mal:


  ;;;;;;;;;;;;;;right
  ;call cpct_scanKeyboard_asm
  ld hl, #Key_CursorRight
  call cpct_isKeyPressed_asm
  jr z, right_no_pulsada
  ld a,(n_pulsado_new)
  bit 2,a;;change bit
    jr nz,right_pulsada_mal
    ld a,(n_pulsado_new)
    set 2,a;change bit
    ld (n_pulsado_new),a
    ;;;function here
    call girarizquierda
    ;;;function here
    jr right_pulsada_mal
  right_no_pulsada:
  ld a,(n_pulsado_new)
  res 2,a;change bit
  ld (n_pulsado_new),a
  right_pulsada_mal:
ret
;movimiento enemigos
ent_move_enemigos:
  ld a,#0
  ld c,a

  ld a,e_inx(ix)
  ld b,a
  ld a,e_maxx(ix)
  sub a,b
  jr z, acabadox
  ld a,e_inx(ix)
  inc a
  ld e_inx(ix),a
  inc c
  push bc
  call ent_move_x
  pop bc
  acabadox:
  ld a,e_iny(ix)
  ld b,a
  ld a,e_maxy(ix)
  sub a,b
  jr z, acabadoy
  ld a,e_iny(ix)
  inc a
  ld e_iny(ix),a
  inc c
  push bc
  call ent_move_y
  pop bc
  acabadoy:

  ld a,c
  cp a,#0
  jp nz ,continuar

  ld a,#0
  ld e_inx(ix),a
  ld e_iny(ix),a

  ld a,#10
  call rng_max_power
  ld e_maxx(ix),b

  ld a,#10
  call rng_max_power
  ld e_maxy(ix),b

  ld a,#2
  call rng_max_power
  ld b,a
  cp a,#1
  jr z, derecha
  ld a,#-1
  jr xterminado
  derecha:
  ld a,#1
  xterminado:
  ld e_vx(ix),a


  ld a,#2
  call rng_max_power
  ld b,a
  cp a,#1
  jr z ,arriba
  ld a,#4
  jr yterminado
  arriba:
  ld a,#-4
  yterminado:
  ld e_vy(ix),a




  continuar:
ret

;ix bala
;iy enemigo
coll_matarpj:
  call coll_xbueno
  cp a,#0
  jp z ,nohaynadaaa
  jp muerte
  nohaynadaaa:
ret
coll_destruct:
  call coll_xbueno
  cp a,#0
  jp z ,nohaynadaa
  jp colision_destructiva
  nohaynadaa:
ret

;eliminar bala,eliminar enemigo,comprobar si el juego ha acabado
;call collbuenodos
;call retroceder

colisiones_pared:
  ld c,#12
  call coll_y
  ld c,#3
  call coll_x
ret
colisiones:
  call coll_xbueno
  cp a,#0
  jp z ,nohaynada
  call collbuenodos
  call retroceder
  nohaynada:
ret
coll_xbueno:

  ld a,de_x(ix)
  add a,de_w(ix)
  dec a
  cp a,de_x(iy)
  jp c, nocol;no hay acarreo positivo

  ld a,de_x(iy)
  add a,de_w(iy)
  dec a
  cp a,de_x(ix)
  jp c, nocol;no hay acarreo positivo
  ;collx bien

  ld a,de_y(ix)
  add a,de_h(ix)
  dec a
  cp a,de_y(iy)
  jp c, nocol;no hay acarreo positivo

  ld a,de_y(iy)
  add a,de_h(iy)
  dec a
  cp a,de_y(ix)
  jp c, nocol;no hay acarreo positivo
  ;colly bien

  ld a,#1
  ret
  nocol:
  ld a,#0
ret
collbuenodos:

  ld a,de_antx(ix)
  add a,de_w(ix)
  dec a
  cp a,de_x(iy)
  jr c, espejox;no hay acarreo positivo

  ld a,de_x(iy)
  add a,de_w(iy)
  dec a
  cp a,de_antx(ix)
  jr c, espejox;no hay acarreo positivo

  jr nocolx
  espejox:
  call ent_mirror_x
  nocolx:

  ld a,de_anty(ix)
  add a,de_h(ix)
  dec a
  cp a,de_y(iy)
  jr c, espejoy;no hay acarreo positivo

  ld a,de_y(iy)
  add a,de_h(iy)
  dec a
  cp a,de_anty(ix)
  jr c, espejoy;no hay acarreo positivo

  jr nocoly
  espejoy:
  call ent_mirror_y
  nocoly:

ret
retroceder:
  ld    a, de_anty(ix)
  ld de_y(ix),a
  ld    a, de_antx(ix)
  ld de_x(ix),a
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MOVER UNA ENTIDAD
;; REGISTROS DESTRUIDOS:
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ent_move_x:
   ld    a, de_x(ix)
   add   e_vx(ix)
   ;call coll_x
   ld    de_x(ix), a
   ret
ent_move_y:
  ld    a, de_y(ix)
  add   e_vy(ix)
  ;call coll_y
  ld    de_y(ix), a
  ret
ent_move:
call ent_move_x
jr ent_move_y

sfx_play:
  ld l, #01
  ld h, #15
  ld e, #36
  ld d, #0
  ld bc, #0
  ld a, #2

  call cpct_akp_SFXPlay_asm
ret

sfx:


  call sfx_play
ret


;;
;; MAIN function. This is the entry point of the application.
;;    _main:: global symbol is required for correctly compiling and linking
;;
