; ##-----------------------------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"
;.include "render.h.s"


malos_espera:.db 00
k_malos_espera_max=80;velocidad movimiento
mostrar_bala:.db 00
mostrar_bala_max=100;velicidad disparo


aux: .dw 0000
com: .db 00
n_obs: .db 00
n_ens: .db 00
en_cartucho:.db 00
n_nivel1: .db 00
n_nivel2: .db 00
n_nivel3: .db 00



enmigos_mov:.db 00

n_mapa_actual:.dw 0000

selector_de_nivel:
nivel1:.dw _nivel1
nivel2:.dw _nivel2
nivel3:.dw _nivel3
nivel4:.dw _nivel4
nivel5:.dw _nivel5
nivel6:.dw _nivel6
nivel7:.dw _nivel7
nivel8:.dw _nivel8
nivel9:.dw _nivel9
nivel10:.dw _nivel10
nivel11:.dw _nivel11
nivel12:.dw _nivel12
nivel13:.dw _nivel13
nivel14:.dw _nivel14
nivel15:.dw _nivel15
nivel16:.dw _nivel16
_nivel1: ;;sin obstaculo con un solo enemigo sin disparar ni moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x01
  .db 0x20, 0x20
  ;.db 0x40, 0x70

_nivel2: ;;sin obstaculo con dos enemigos sin disparar ni moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x02
  .db 0x20, 0x20
  .db 0x40, 0x70

_nivel3: ;;sin obstaculo con tres enemigos sin disparar ni moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x03
  .db 0x20, 0x20
  .db 0x40, 0x70
  .db 0x10, 0x40
  ;.db 0x40, 0x70

_nivel4: ;;sin obstaculo con cuatro enemigo sin disparar ni moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x04
  .db 0x20, 0x20
  .db 0x40, 0x70
  .db 0x10, 0x40
  .db 0x10, 0x10

_nivel5: ;;sin obstaculo con un solo enemigo disparando pero sin moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x01
  .db 0x10, 0x10
  ;.db 0x40, 0x70

_nivel6: ;;sin obstaculo con dos enemigos disparando pero sin moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x02
  .db 0x10, 0x10
  .db 0x40, 0x70

_nivel7: ;;sin obstaculo con tres enemigos disparando pero sin moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x02
  .db 0x20, 0x20
  .db 0x40, 0x10
  ;.db 0x40, 0x70

_nivel8: ;;sin obstaculo con cuatro enemigo disparando pero sin moverse
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x04
  .db 0x10, 0x20
  .db 0x40, 0x70
  .db 0x20, 0x60
  .db 0x02, 0x20

_nivel9: ;;sin obstaculo con un solo enemigo disparando moviendose
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x01
  .db 0x20, 0x20
  ;.db 0x40, 0x70

_nivel10: ;;sin obstaculo con dos enemigos disparando moviendose
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x02
  .db 0x20, 0x20
  .db 0x40, 0x70

_nivel11: ;;sin obstaculo con tres enemigos disparando moviendose
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x03
  .db 0x20, 0x20
  .db 0x40, 0x70
  .db 0x10, 0x40
  ;.db 0x40, 0x70

_nivel12: ;;sin obstaculo con cuatro enemigo disparando moviendose
  ;;obstaculos
  .db 0x00;numero

  ;;enemigos
  .db 0x04
  .db 0x20, 0x20
  .db 0x40, 0x70
  .db 0x10, 0x40
  .db 0x10, 0x10

_nivel13: ;;con obstaculo con un solo enemigo disparando moviendose
  ;;obstaculos
  .db 0x01;numero
  .db 0x30, 0x30

  ;;enemigos
  .db 0x01
  .db 0x10, 0x10
  ;.db 0x40, 0x70

_nivel14: ;;con obstaculo con dos enemigos disparando moviendose
  ;;obstaculos
  .db 0x02;numero
  .db 0x30, 0x30
  .db 0x10, 0x40

  ;;enemigos
  .db 0x02
  .db 0x10, 0x10
  .db 0x40, 0x70

_nivel15: ;;con obstaculo con tres enemigos disparando moviendose
  ;;obstaculos
  .db 0x03;numero
  .db 0x30, 0x30
  .db 0x10, 0x40
  .db 0x40, 0x55
  ;;enemigos
  .db 0x03
  .db 0x20, 0x20
  .db 0x40, 0x70
  .db 0x10, 0x60
  ;.db 0x40, 0x70

_nivel16: ;;con obstaculo con cuatro enemigo disparando moviendose
  ;;obstaculos
  .db 0x04;numero
  .db 0x30, 0x30
  .db 0x10, 0x40
  .db 0x70, 0x55
  .db 0x50, 0x90

  ;;enemigos
  .db 0x04
  .db 0x20, 0x20
  .db 0x40, 0x70
  .db 0x70, 0x70
  .db 0x50, 0x100
obsarray:
  DrawableEntity obs, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs1, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs2, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs3, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs4, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs5, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs6, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs7, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs8, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs9, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0
  DrawableEntity obs10, 0x00, 0x00, 0x04, 0x0C, #_sprite_Obstaculo,0,0



ensarray:
  DefineEntity enem, 0x20, 0x28, 0x01, 0x00, 0x04, 0x0C, #_sprite_Enemigo , ent_move_enemigos,0x20,0x28,0,0,0,0,#1,#bala_0,0,0
  DefineEntity enem1, 0x20, 0x28, 0x01, 0x00, 0x04, 0x0C, #_sprite_Enemigo , ent_move_enemigos,0x20,0x28,0,0,0,0,#2,#bala_01,0,0
  DefineEntity enem2, 0x20, 0x28, 0x01, 0x00, 0x04, 0x0C, #_sprite_Enemigo , ent_move_enemigos,0x20,0x28,0,0,0,0,#4,#bala_02,0,0
  DefineEntity enem3, 0x20, 0x28, 0x01, 0x00, 0x04, 0x0C, #_sprite_Enemigo , ent_move_enemigos,0x20,0x28,0,0,0,0,#8,#bala_03,0,0
  DefineEntity enem4, 0x20, 0x28, 0x01, 0x00, 0x04, 0x0C, #_sprite_Enemigo , ent_move_enemigos,0x20,0x28,0,0,0,0,#16,#bala_04,0,0
  DefineEntity enem5, 0x20, 0x28, 0x01, 0x00, 0x04, 0x0C, #_sprite_Enemigo , ent_move_enemigos,0x20,0x28,0,0,0,0,#32,#bala_05,0,0


balarray:
  Definebala bala_0, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x30,0x01,0x00,0x00;
  Definebala bala_01, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x30,0x01,0x00,0x00;
  Definebala bala_02, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x30,0x01,0x00,0x00;
  Definebala bala_03, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x30,0x01,0x00,0x00;
  Definebala bala_04, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x30,0x01,0x00,0x00;
  Definebala bala_05, 0x30, 0x01, 0x00, 0xFC, 0x02, 0x08, #_g_Bala , ent_move,0x00,0x00,0x30,0x01,0x00,0x00;


palabra_conseguido:
palabra:
  .db #_G,#_A,#_M,#_E,_espacio,#_O,#_V,#_E,#_R,0x00
titulo:
  .db #_H,#_A,#_C,#_K,#_T,#_A,#_N,#_K,0x00
palabra_ganar:
  .db #_Y,#_O,#_U,_espacio,#_W,#_I,#_N,_exclamacion,0x00
palabra_empezar:
  .db #_P,#_R,#_E,#_S,#_S,_espacio,#_v,_espacio,#_T,#_O,_espacio,#_S,#_T,#_A,#_R,#_T,0x00
palabra_reiniciar:
  .db #_P,#_R,#_E,#_S,#_S,_espacio,#_v,_espacio,#_T,#_O,_espacio,#_R,#_E,#_S,#_T,#_A,#_R,#_T,0x00
palabra_continuar:
  .db #_C,#_O,#_N,#_T,#_I,#_N,#_U,#_E,_espacio,#_v,0x00
palabra_nivel:
  .db #_L,#_E,#_V,#_E,#_L,_espacio
  num1:
  .db #_0
  num2:
  .db #_0
  num3:
  .db #_0,0x00
;comprueba si alguno de los maos es golpeado por nuestras balas y destruye ambas de ser cierto
coll_destruct_int:
  push ix
  pop iy
  ld hl,#coll_destruct
  ld ix, #ensarray
  ld bc, #k_entity_size
  call malo_doForAll
  push iy
  pop ix
ret
;hace una accion para todos los enemigos
malo_doForAll:
    ld a,(en_cartucho)
    ld d,a
    ld a,(n_ens)
    ld (metodo2),hl

    buc222:
    push bc
      bit 0,d
      jr z, nada
      push de
      push af
      metodo2=.+1
      call ent_draw
      pop af
      pop de
      nada:
      srl d
      pop bc
      add ix,bc

      dec a
    jr nz, buc222
  ret

;pinta en los dos bufers la parabra que este en aux
pintar_despues_de_empezar:
  ld    de, #0xC000       ;;Comienzo memoria de video

  ld     c, #23        ;; C = Entity X
  ld     b, #192        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm

  ld    de, #0x8000       ;;Comienzo memoria de video

  ld     c, #23        ;; C = Entity X
  ld     b, #192        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm


ret

pintar_centro:
  ld    de, #0xC000       ;;Comienzo memoria de video

  ld     c, #4        ;; C = Entity X
  ld     b, #100        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm

  ld    de, #0x8000       ;;Comienzo memoria de video

  ld     c, #4        ;; C = Entity X
  ld     b, #100        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm


ret

pintar_titulo:
  ld    de, #0xC000       ;;Comienzo memoria de video

  ld     c, #23        ;; C = Entity X
  ld     b, #100        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm

  ld    de, #0x8000       ;;Comienzo memoria de video

  ld     c, #23        ;; C = Entity X
  ld     b, #100        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm


ret

pintar_antes_de_empezar:
  ld    de, #0xC000       ;;Comienzo memoria de video

  ld     c, #8        ;; C = Entity X
  ld     b, #192        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm

  ld    de, #0x8000       ;;Comienzo memoria de video

  ld     c, #8        ;; C = Entity X
  ld     b, #192        ;; B = Entity Y
  call cpct_getScreenPtr_asm
  ld iy,(aux)
  call cpct_drawStringM0_asm


ret
;avanza de nivel,reinicia la escena, aumente en uno el nivel y pone una palabra
siguiente_nivel:
;call cpct_akp_stop_asm
;cancionnivelpasado
call pj_reiniciar
;
ld a,#0
ld (en_cartucho),a







  ld a,#0
  ld (com),a
  ;sumar adecuadamente
  ld a,(n_nivel3)
  inc a
  cp a,#10
  jp nz, nosumdec
  ld a,#0
  ld (n_nivel3),a


  ld a,(n_nivel2)
  inc a
  cp a,#10
  jp nz, nosum
  ld a,#0
  ld (n_nivel2),a

  ld a,(n_nivel1)
  inc a
  ld (n_nivel1),a


  jp juegopasado

  nosumdec:
  ld (n_nivel3),a
  jp juegopasado

  nosum:
  ld (n_nivel2),a
  jp juegopasado

juegopasado:
ld a,(n_nivel3)
cp a,#5
jp nz, nopasado
ld a,(n_nivel2)
cp a,#1
jp nz, nopasado

ld de, #_win
call cpct_akp_musicInit_asm
;cancion ya

call reset_pantalla
ld hl,#palabra_ganar
ld (aux),hl
call pintar_despues_de_empezar
ld hl,#palabra_reiniciar
ld (aux),hl
call pintar_centro
ld a,#0
ld (n_nivel3),a
ld (n_nivel2),a

jp loop
nopasado:
ld de, #_nivel
call cpct_akp_musicInit_asm
;cancion ya
call reset_pantalla
ld hl,#palabra_continuar
ld (aux),hl
call pintar_despues_de_empezar
jp loop


;reinicia la escena y pone una palabra
muerte:
;cancionmuerte

ld de, #_game_over
call cpct_akp_musicInit_asm
;cancion ya
;call cpct_akp_stop_asm
  call pj_reiniciar
  ;
  ld a,#0
  ld (en_cartucho),a
  call reset_pantalla
  ld a,#0
  ld (com),a
  ld hl,#palabra
  ld (aux),hl
  call pintar_despues_de_empezar
jp loop


;dibuja un objeto
obs_draw:
  ld (aux),iy
  ld ix,(aux)
jp ren_drawEntity

;hace una accion para todos los objetos
obs_doForAll:
  ld a, (n_obs)
  cp #0
  jr z,hata
  ld iy, #obsarray
  ld (metodo),hl

  buc2:
    push af
    metodo=.+1
    call invocar_obs
    pop af
    ld bc, #K_drawable_size
    add iy,bc

    dec a
  jr nz, buc2
  hata:
ret

;destruye un enemigo y una bala, uno en ix enemigo  iy bala
colision_destructiva:

  call destroy
  push ix
  push iy
  pop ix
  pop iy
  call destroy
  push ix
  push iy
  pop ix
  pop iy

  ld a,(n_cartucho)
  sub a,n_cartucho_bala(iy)
  ld (n_cartucho),a
  ld a,(n_num_bala)
  dec a
  ld (n_num_bala),a

  ld a,(en_cartucho)
  sub a,cart_enem(ix)
  cp a,#0
  jp nz, noterminadoaun
  jp siguiente_nivel
  noterminadoaun:
  ld (en_cartucho),a

;iy enemigo cargar ix bala y destruir
ld h,enem_disparo_h(ix)
ld l,enem_disparo_l(ix)
ld (aux),hl
ld ix,  (aux)
call destroy


ret
;pone los valores por defecto de un enemigo
enem_reiniciar:



  ld b,enem_disparo_h(iy)
  ld c,enem_disparo_l(iy)
  ld (aux),bc
  push ix
  ld ix,  (aux)

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

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

  pop ix
  ld e_inx(iy),#0
  ld e_iny(iy),#0
  ld e_maxx(iy),#0
  ld e_maxy(iy),#0
  ld e_disp_cont(iy),#0
  ld e_disp_max(iy),#mostrar_bala_max

  ;ld de,#hero_data
  ;ld hl, #hero_data_default
  ;call ent_copy
ret
;invoca los objetos y enemigos en funcion del nivel en que se encuentre
invocar_obs:
  ld a,#k_malos_espera_max
  ld (malos_espera),a
  ld a,#0
  ld (mostrar_bala),a
  ;;1X100+2X10+3 sacar nivel adecuadamente

  ld b,#100
  ld a,(n_nivel1)
  call mult
  push bc
  ld b,#10
  ld a,(n_nivel2)
  call mult
  pop hl
  add hl,bc
  ld a,(n_nivel3)
  ld b,#0
  ld c,a
  add hl,bc
  ld a,l
  ;(enmigos_mov)0 no dispara;1 no se mueve
  ;,jytrfcrgehtdf
  cp a,#9
  jp nc,dispara
  set 1,b
  ;nodispara:
  dispara:
  cp a,#4
  jp nc,mueve
  set 0,b
  ;;nomueve
  mueve:
  push af
  ld a,b
  ld (enmigos_mov),a
  pop af
  ;ld (enmigos_mov),b
  ;push hl
  ;pop bc
  ld b,#2
  call mult
  ;bc
  ld hl,#selector_de_nivel
  add hl,bc
  ld e,(hl)
  ld bc,#1
  add hl,bc
  ld d,(hl)
  ld (n_mapa_actual),de

  ld ix,(n_mapa_actual)




  ;ld ix,#nivel1
  ld a,de_x(ix)
  ld (n_obs),a
  inc ix
  ld iy,#obsarray
  ;K_drawable_size4a32
  ;obsarray
  inc a
  jp obscond
  buc:
  push af


  ;ld bc, #k_entity_size
  ;add ix,bc
  ;ld a,de_x(ix)
  ld a,de_x(ix)
  ld de_x(iy), a

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

  ld bc, #2
  add ix,bc
  ld bc, #K_drawable_size
  add iy,bc

  pop af
  obscond:
  dec a
  jr nz, buc

  ld a,de_x(ix)
  ld (n_ens),a
  inc ix
  ld iy,#ensarray
  ;ld a,(en_cartucho)
  ld h,#0
  buc111:

  push af

  sla h
  inc h

  ;ld bc, #k_entity_size
  ;add ix,bc
  ;ld a,de_x(ix)
  ld a,de_x(ix)
  ld de_antx(iy), a
  ld de_x(iy), a

  ld a, de_y(ix)
  ld de_anty(iy), a
  ld de_y(iy),a
  ;final ya
  call enem_reiniciar

  ld bc, #2
  add ix,bc
  ld bc, #k_entity_size
  add iy,bc

  pop af
  dec a
  jr nz, buc111
  ld a,h
  ld (en_cartucho),a

ret
;colisiones con algun objeti
coll_obj:
  ld hl, #colisiones
  call obs_doForAll
ret

;disparo de los enemigos ix enemigo
disparobueno:

  ld    iy, #hero_data
  ld b,de_x(iy)
  ld c,de_y(iy)

  ld hl, #enem_disparo
  call enem_disparo
ret


;;ld    iy, #bala_0
unavariable: .db #6
isr:

  ex af, af';'
  exx
  push af
  push bc
  push de
  push hl
  push iy

  ld a, (unavariable)
  dec a
  ld (unavariable), a
  jr nz, return

  call z, cpct_akp_musicPlay_asm
  ld a, #6
  ld (unavariable), a

  return:
    pop iy
    pop hl
    pop de
    pop bc
    pop af
    exx
   ex af,af';'

ret
disparosenemigoscont::

ld a,e_disp_cont(ix)
cp a,e_disp_max(ix)
jr nz,esperar_disparooo
ld e_disp_cont(ix),#0

ld a,#50
call rng_max_power
ld a,#120
add a,b
ld e_disp_max(ix),b

call disparobueno



esperar_disparooo:
ld a,e_disp_cont(ix)
inc a
ld e_disp_cont(ix),a
ret

_main::
  ld sp,#0x8000
   ;; Disable firmware to prevent it from interfering with string drawing
   call cpct_disableFirmware_asm
   call ren_clarBackbuffer

   ld    c, #0
   call cpct_setVideoMode_asm

   ld hl, #_sprite_palette
   ld de, #11
   call cpct_setPalette_asm

   ld   hl, #_g_tileset
   call cpct_etm_setTileset2x4_asm

   call reset_pantalla


  ;call ent_new
  ld hl,#0x0405;fondo-letra
  call cpct_setDrawCharM0_asm
  ;cpct_setDrawCharM0(3, 5);

  ld hl,#palabra_empezar
  ld (aux),hl
  call pintar_antes_de_empezar
  ld hl,#titulo
  ld (aux),hl
  call pintar_titulo



  ld de, #_song_ingame
  call cpct_akp_musicInit_asm

  ;ld hl, #isr
  ;call cpct_setInterruptHandler_asm

  ;call cpct_akp_stop_asm

  ld de, #_sfx
  call cpct_akp_SFXInit_asm

loop:
;call cuadrado
  ld a,(com)
  cp a,#0
  jp z, start
  ;codigo del heroe
    ld    ix, #hero_data
    call ent_clear
    call ent_update
    ld bc, #k_bala_size
    ld hl, #coll_matarpj
    ld ix, #balarray
    ld iy, #hero_data
    call malo_doForAll
    ld ix, #hero_data
    call colisiones_pared
    ld hl, #colisiones
    call obs_doForAll
    call ent_draw
  ;codigo enemigo

    ld hl, #ent_clear
    ld ix, #ensarray
    ld bc, #k_entity_size
    call malo_doForAll
    ;enemigos mas lentos
    ld a,(enmigos_mov)
    bit 1,a
    jp nz,nomove
    ld a,(malos_espera)
    cp a,#k_malos_espera_max
    jr nz,esperar
    ld a,#0
    ld (malos_espera),a

    ld hl, #ent_update
    ld ix, #ensarray
    ld bc, #k_entity_size
    call malo_doForAll

    ld hl, #colisiones_pared
    ld ix, #ensarray
    ld bc, #k_entity_size
    call malo_doForAll

    ld bc, #k_entity_size
    ld hl, #coll_obj
    ld ix, #ensarray
    call malo_doForAll
    ;disparo modular de otra manera

    esperar:

    ld a,(malos_espera)
    inc a
    ld (malos_espera),a
    nomove:

    ld a,(enmigos_mov)
    bit 0,a
    jp nz,nodisp

    ld hl, #disparosenemigoscont
    ld bc, #k_entity_size
    ld ix, #ensarray
    call malo_doForAll
    nodisp:
    ld hl, #ent_draw
    ld bc, #k_entity_size
    ld ix, #ensarray
    call malo_doForAll



  ;balas enemigos
  ld a,(mostrar_bala)
  cp a,#mostrar_bala_max
  jr nz,esperarb
  ld a,(enmigos_mov)
  bit 0,a
  jp nz,noin
    ld hl, #ent_clear
    ld ix, #balarray
    ld bc, #k_bala_size
    call malo_doForAll

    ld hl, #ent_update
    ld ix, #balarray
    ld bc, #k_bala_size
    call malo_doForAll

    ld hl, #colisiones_pared
    ld ix, #balarray
    ld bc, #k_bala_size
    call malo_doForAll

    ld hl, #coll_obj
    ld ix, #balarray
    ld bc, #k_bala_size
    call malo_doForAll

    ld hl, #ent_draw
    ld ix, #balarray
    ld bc, #k_bala_size
    call malo_doForAll
    jr noin
    esperarb:

    ld a,(mostrar_bala)
    inc a
    ld (mostrar_bala),a
    noin:
  ;balas personaje
    ld hl, #tiempo_dest
    call bal_doForAll

    ld hl, #ent_clear
    call bal_doForAll
    ld hl, #ent_update
    call bal_doForAll
    ;colisiones con enemigos
    ld hl, #coll_destruct_int
    call bal_doForAll

    ld hl, #colisiones_pared
    call bal_doForAll

    ld hl, #coll_obj
    call bal_doForAll

    ld hl, #ent_draw
    call bal_doForAll
  ;resto del loop

  call cpct_waitVSYNC_asm
  call switch
  terminarbucle::
jp    loop
;codigo para pulsar v para empezar
 start:
 call cpct_scanKeyboard_asm
 ld hl, #Key_V
 call cpct_isKeyPressed_asm
 jr z, V_no_pulsada
   ld a,#1
   ld (com),a
   ;cancionjuego
   ld hl, #isr
   call cpct_setInterruptHandler_asm
   ld de, #_song_ingame
   call cpct_akp_musicInit_asm
   call reset_pantalla
   ;;cancion acabada
   ld a,(n_nivel1)
   ld b,a
   ld a,(n_nivel2)
   ld c,a
   ld a,(n_nivel3)
   inc a
   cp a,#0x0A
   jr nz,unidad_no_diez

   ld a,#0
   inc c
   unidad_no_diez:
   add a,#_0
   ld (num3),a
   ld a,c
   cp a,#0x0A
   jr nz,decena_no_diez
   ld c,#0
   inc b
   decena_no_diez:
   ld a,c
   add a,#_0
   ld (num2),a
   ld a,b
   add a,#_0
   ld (num1),a
   ld hl,#palabra_nivel
   ld (aux),hl
   call pintar_despues_de_empezar



   ;;
   call invocar_obs
   ld hl, #obs_draw
   call obs_doForAll
   call switch
   ;call invocar_obs
   ld hl, #obs_draw
   call obs_doForAll
   ;mostrar nivel
   ;mostrar vidas;si las ponemos
   V_no_pulsada:

 jp    loop
