; ##-----------------------------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"


;k_bala_size = 15

;de mia
;hl copia
balas:
Definebala enemy_data_0, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x00,0x00,0x00,0x00;
Definebala enemy_data_1, 0x30, 0x01, 0x01, 0xFC, 0x02, 0x08, #_g_Bala , ent_move2,0x03,0x00,0x00,0x00,0x00,0x00;1
Definebala enemy_data_2, 0x30, 0x01, 0x01, 0xFC, 0x02, 0x08, #_g_Bala , ent_move2,0x01,0x00,0x00,0x00,0x00,0x00;3
Definebala enemy_data_3, 0x30, 0x01, 0x01, 0xFC, 0x02, 0x08, #_g_Bala , ent_move3,0x03,0x00,0x00,0x00,0x00,0x00;3
Definebala enemy_data_4, 0x30, 0x01, 0x01, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x00,0x00,0x00,0x00
Definebala enemy_data_5, 0x30, 0x01, 0x01, 0xFD, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x00,0x00,0x00,0x00
Definebala enemy_data_6, 0x30, 0x01, 0x01, 0xFE, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x00,0x00,0x00,0x00
Definebala enemy_data_7, 0x30, 0x01, 0x01, 0xFF, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x00,0x00,0x00,0x00
Definebala enemy_data_8, 0x30, 0x01, 0x01, 0x00, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x00,0x00,0x00,0x00
;;;;;;;;;;;;;;;;;;;;;;;;;;;
hero_sprites:
.dw #_sprite_Spritesheet_00
.dw #_sprite_Spritesheet_01
.dw #_sprite_Spritesheet_02
.dw #_sprite_Spritesheet_03
.dw #_sprite_Spritesheet_04
.dw #_sprite_Spritesheet_05
.dw #_sprite_Spritesheet_06
.dw #_sprite_Spritesheet_07
.dw #_sprite_Spritesheet_08
.dw #_sprite_Spritesheet_09
.dw #_sprite_Spritesheet_10
.dw #_sprite_Spritesheet_11
.dw #_sprite_Spritesheet_12
.dw #_sprite_Spritesheet_13
.dw #_sprite_Spritesheet_14
.dw #_sprite_Spritesheet_15
.dw #_sprite_Spritesheet_16
.dw #_sprite_Spritesheet_17
.dw #_sprite_Spritesheet_18
.dw #_sprite_Spritesheet_19
.dw #_sprite_Spritesheet_20
.dw #_sprite_Spritesheet_21
.dw #_sprite_Spritesheet_22
.dw #_sprite_Spritesheet_23
.dw #_sprite_Spritesheet_24
.dw #_sprite_Spritesheet_25
.dw #_sprite_Spritesheet_26
.dw #_sprite_Spritesheet_27
.dw #_sprite_Spritesheet_28
.dw #_sprite_Spritesheet_29
.dw #_sprite_Spritesheet_30
.dw #_sprite_Spritesheet_31


n_pos_sprite:.db 00
n_pos_bala: .db 00
n_hem_bala: .db 00
;reiniciar bala
reiniciar_bala:

  ld a,#0
  ld (n_pos_bala),a
  ld (n_hem_bala),a
  ld (n_pos_sprite),a



ret
;disparos de los enemigos
;bc pos heroe
;ix enemigo
;iy nada creo
enem_disparo:
  ;bc pos x pos y heroe
  ;bala iy
  ;enem ix
  ;ld iy,#bala_0
  ;ld ix,#enem
  call efectosonidodisparoenem

  push ix
  ld h,enem_disparo_h(ix)
  ld l,enem_disparo_l(ix)
  ld (aux),hl
  ld iy,  (aux)
  ;balas_0
  ;enem
  ;hero_data
  ;destruir_bala
  ;#bala_0
  push ix
  push iy
  pop ix
  pop iy
  ;ld ix,#bala_0
  push bc
  call destroy
  pop bc
  push ix
  push iy
  pop ix
  pop iy
  ;ld ix,#enem
  ;ld iy,#hero_data
  ld a,de_x(ix)
  ld d,a
  ld a,b
  push bc
  sub a,d
  jr nc, positivox

  ld d,a
  sub a,d
  sub a,d
  positivox:
  ld d,a

  ld b,#4
  ;ld a,#k_bala_size

  call mult
  ld d,c




  pop bc

  ld a,de_y(ix)
  ld e,a
  ld a,c
  push bc
  sub a,e
  jr nc, positivoy

  ld e,a
  sub a,e
  sub a,e
  positivoy:
  ld e,a

  cp a,d
  jr c,unlado
  ;;e mas grnde Y
  ld b,e
  ld c,d
  jr div
  ;dividir Y/X
  unlado:
  ;lo otro
  ld b,d
  ld c,e
  div:
  ld a,c
  cp a,#0
  jr z,nodiv
  call dividir
  jr divsta
  nodiv:
  ld h,#4
  divsta:
  ;h
  ld a,#4
  cp a,h
  jr nc, nadadiv
  ld h,#4
  nadadiv:
  ;dec h
  ld a,e

  cp a,d
  jr c,unladoy
  ;;d mas grnde X
  ld a,#4
  sub a,h
  jr termlado
  unladoy:
  ld a,#4
  add a,h
  termlado:
  ;a bala adecuada
  ld hl,#balas
  ld b,a
  ld a,#k_bala_size

  call mult
  add hl,bc
  ;hl habemus bala
  ;;balas_0
  ;enem
  ;hero_data
  ;ld ix,#enem
  ;ld iy,#hero_data
  ;ex de,hl
  ld de,(aux)
  ;ex de,hl
  push bc
  call bal_copy
  pop bc
  ;ld b,de_x(ix)
  ;ld c,de_y(ix)
  ;ld d,de_x(iy)
  ;ld e,de_y(iy)
  ;push de;pasa bc
  ld d,de_x(ix)
  ld e,de_y(ix)
  push ix
  push iy
  pop ix
  pop iy
  ;ld ix,#balas
  ;add ix,bc
  ;clear
  ;;ix bala;iy enemigo
  call ent_reset_pos
  ld a,de_y(ix)
  inc a
  inc a
  inc a
  inc a
  ld de_y(ix),a
  ld de_anty(ix),a
  ld a,de_x(ix)
  inc a
  ld de_x(ix),a
  ld de_antx(ix),a
  ;ix bala
  pop bc;x-y  hero_data_default
  ld a,b
  cp a, d
  jr nc,nomx
  call ent_mirror_x
  nomx:
  ld a,c
  cp a, e
  jr c,nomy
  call ent_mirror_y
  nomy:
  pop ix
  ;ent_mirror_x
ret
;b divisendo
;c divisor
dividir::
;push bc
;pop de
ld a,c
cp a,#1
jp z,divacabar
  ld a,#0
  ld h,a
  ld a,b


  jr init
  estarto:
  inc h
  sub a,c
  init:
  cp a,c
  jr nc,estarto
  ;;h

  ;;dividir c entre dos
  ld b,a
  ;ld a,#0
  ld l,#0
  ;push af
  ld a,c
  ld c,#2
  ;pop af
  jr init2
  estarto2:
  inc l
  sub a,c
  init2:
  cp a,c
  jr nc,estarto2
  ;;dividir b,l
  ld c,l
  ld a,b


  jr init3
  estarto3:
  inc h
  sub a,c
  init3:
  cp a,c
  jr nc,estarto3
  ;h  coeficiente
ret
divacabar:
ld b,#0
ret
;copiar bala
bal_copy:
  ld bc ,#k_bala_size
  ldir
ret


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


;disparo heroe
shoot:
  ld a, (n_num_bala)
  cp #k_max_num_bala
  jp z,acabadoya
  call efectosonidodisparomio
  ; k_max_num_bala
    ld a,(n_pos_bala)
    ld b,a
    cp a,#9
    jr c, hem_pos;no hay acarreo positivo
      ;negativo
      ;ld a,b
      sub a,b
      sub a,b
      ld b,a
      hem_pos:
      ld hl,#balas
      ld a,#k_bala_size
      call mult
      add hl,bc
      ;;tenemos que bala disparar hl
      ;ld b,#0
      ld a,(n_cartucho)
      ld b,a
      ld a,#0
      ld c,a
      inc c
      bit 0,b
      jr z,terminado
        sla c
        inc a
        bit 1,b
        jr z,terminado
        sla c
        inc a
  terminado:
  ;c tenemos donde sumar al cartucho
    ;;;
    ;n_num_bala  k_bala_size
    ;ld a,(n_num_bala)
    ld b,a
    ld a,c
    ex af,af';'
    ld a,(n_cartucho)
    add a,c
    ld (n_cartucho),a

    ld a,#k_bala_size
    call mult
    ld a, (n_num_bala)
    inc a
    ld (n_num_bala), a

    ld de, #disparos
    ld ix,#disparos
    ex de,hl
    add hl,bc
    ex de,hl
    add ix,bc
    ;ld hl, #enemy_data_4
    ;ld a,c
    ;temenos en a


    call bal_copy
    ex af,af';'
    ld n_cartucho_bala(ix),a
    ;ld ix,#disparos;AQUIIIIIIIIIIIIIIIIIIII
    ld iy,#hero_data
    call ent_reset_pos
    ;;;;;;;
    ld hl,#_g_Bala2
    ld sprite_l(ix),l
    ld sprite_h(ix),h
    ld a,de_y(ix)
    inc a
    inc a
    inc a
    inc a
    ld de_y(ix),a
    ld de_anty(ix),a
    ld a,de_x(ix)
    inc a
    ld de_x(ix),a
    ld de_antx(ix),a

    ld a,(n_hem_bala)
    cp #00
    jr nz, hemisferio1
      ;hamisferio2
      ld a,(n_pos_bala)
      cp a,#9
      jp c, acabadoya;no hay acarreo positivo
        call ent_mirror_x
        jr acabadoya
  hemisferio1:

    ld a,(n_pos_bala)
    cp a,#9
    jr c, hem_pos2;no hay acarreo positivo
      ;negativo
      call ent_mirror_y
      jr acabadoya
  hem_pos2:;pos
    call ent_mirror_x
    jp ent_mirror_y
  acabadoya:
ret
girarderecha::

ld a,(n_pos_sprite)
dec a
cp a,#-1
jp nz, cambio_spritee
ld a,#31
cambio_spritee:



ld (n_pos_sprite),a
add a,a
ld iy, #hero_sprites
ld b,#0
ld c,a


add iy, bc

ld h,de_y(iy)
ld l,de_x(iy)
ld sprite_l(ix),l
ld sprite_h(ix),h




;multiplicar a por dos
;hero_sprites + bc pos buena




  ;n_pos_bala
  ;() contenido
  ;#  posicion
  ld a,(n_pos_bala)
  cp #-08
  jr nz,left_no_overflow
  call ent_cambio_hem
  ld a,#08
  left_no_overflow:
  dec a
  ld (n_pos_bala),a
ret
girarizquierda:

ld a,(n_pos_sprite)
inc a
cp a,#32
jp nz, cambio_sprite
ld a,#0
cambio_sprite:



ld (n_pos_sprite),a
add a,a
ld iy, #hero_sprites
ld b,#0
ld c,a


add iy, bc

ld h,de_y(iy)
ld l,de_x(iy)
ld sprite_l(ix),l
ld sprite_h(ix),h


  ld a,(n_pos_bala)
  cp #08
  jr nz,right_no_overflow
  call ent_cambio_hem
  ld a,#-08
  right_no_overflow:
  inc a
  ld (n_pos_bala),a
ret
ent_cambio_hem:
  ld a,(n_hem_bala)
  cp #00
  jr nz,left_acarreo

  inc a

  jr left_acabado
  left_acarreo:
  ld a,#00
  left_acabado:
  ld (n_hem_bala),a
ret
;a es la cantidad
;b es porque lo multiplicamos
;c aux
;d aux
;bc resultado
mult:
  ;ld a,#k_bala_size
  ld d,a
  ;sub a,d
  ;sub a,d
  ld c,#0
  jr init_mult
  bucle_mult:
  ld a,c
  add a,d
  ld c,a
  dec b
  init_mult:
  ld a,b
  cp a,#0
  jr nz,bucle_mult

  ;ld b,#0

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

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MOVER UNA ENTIDAD CON TECLADO
;; REGISTROS DESTRUIDOS:
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MOVER UNA ENTIDAD
;; REGISTROS DESTRUIDOS:
;; ENTRADA: IX -> Puntero a entidad
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;movimiento bala 1
ent_move2:
  ld a,n_contador_bala(ix)
  cp #00
  jr nz,no_move
  ld a,n_contador_bala_max(ix)
  ld n_contador_bala(ix),a
      ;ld e_vy(ix),#00
      jp ent_move
  no_move:
  ;ld e_vy(ix),#01
  dec a
  ld n_contador_bala(ix),a
  jp ent_move_y
;movimiento bala 2
ent_move3:
  ld a,n_contador_bala(ix)
  cp #00
  jr nz,move
  ld a,n_contador_bala_max(ix)
  ld n_contador_bala(ix),a
      ;ld e_vy(ix),#00
      jp ent_move_y
  move:
  ;ld e_vy(ix),#01
  dec a
  ld n_contador_bala(ix),a
  jp ent_move
