ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 1.
Hexadecimal [16-Bits]



                              1 .include "ia.h.s"
                              1 .globl ia_update
                              2 .globl ia_update_one
                              3 .globl ia_mover_drcha_izq
                              4 .globl ia_mover_arriba_abajo
                              5 .globl ia_seguimiento_player
                              6 .globl ia_patron
                              7 .globl cambia_direccion_patron
                              8 .globl ia_variable_tiempo
                              9 .globl ia_arquero
                             10 .globl ia_cangrejo
                             11 .globl ia_topo
                             12 .globl ia_update_cont_shot
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 2.
Hexadecimal [16-Bits]



                              2 .include "man/entity.h.s"
                              1 .globl entity_create
                              2 .globl entity_copy
                              3 .globl entity_doForAll
                              4 .globl entity_doForAll_matching
                              5 .globl entity_doForAll_pairs_matching
                              6 .globl entity_update
                              7 .globl entity_vector
                              8 .globl entity_set4destruction
                              9 .globl entity_set4creation
                             10 .globl entity_register
                             11 .globl num_entities
                             12 .globl getEntity2
                             13 
                             14 
                             15 ; Constantes
                     0000    16 e_tipo            = 0
                     0001    17 e_cmps            = 1
                     0002    18 e_x               = 2
                     0003    19 e_y               = 3
                     0004    20 e_vx              = 4
                     0005    21 e_vy              = 5
                     0006    22 e_w               = 6
                     0007    23 e_h               = 7
                     0008    24 e_spriteL         = 8
                     0009    25 e_spriteH         = 9
                     000A    26 e_iaL             = 10
                     000B    27 e_iaH             = 11
                     000C    28 e_animL           = 12
                     000D    29 e_animH           = 13
                     000E    30 e_anim_st         = 14
                     000F    31 e_animCounter     = 15
                     0010    32 e_collidesAgainst = 16
                     0011    33 e_last_dir        = 17
                     0012    34 e_last_dirY       = 18
                     0013    35 e_player_shot     = 19
                     0014    36 e_actualizaMove   = 20
                     0015    37 e_contMove        = 21
                     0016    38 e_aim_X           = 22
                     0017    39 e_aim_Y           = 23
                     0018    40 e_hp              = 24
                     0019    41 e_perteneceL      = 25
                     001A    42 e_perteneceH      = 26
                     001B    43 e_tablaAnimL      = 27
                     001C    44 e_tablaAnimH      = 28
                     001D    45 e_anim_especial   = 29
                     001E    46 e_invencibilidad  = 30
                     001F    47 e_atacando        = 31
                             48 
                             49 
                             50 ;; Tipos
                     0000    51 e_type_invalid  = 0x00 
                     0001    52 e_type_player   = 0x01
                     0002    53 e_type_zombie   = 0x02  ;; realmente no es para el zombie, es para todos los enemigos
                     0004    54 e_type_shot     = 0x04
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 3.
Hexadecimal [16-Bits]



                     0008    55 e_type_arcoiris = 0x08
                     0010    56 e_type_vida     = 0x10
                     0080    57 e_type_dead     = 0x80
                     007F    58 e_type_default  = 0x7F
                             59 
                             60 ;; Components
                     0001    61 e_cmp_render   = 0x01
                     0002    62 e_cmp_movable  = 0x02
                     0004    63 e_cmp_input    = 0x04
                     0008    64 e_cmp_ia       = 0x08
                     0010    65 e_cmp_animated = 0x10
                     0020    66 e_cmp_collider = 0x20
                     0040    67 e_cmp_vidaextra = 0x40
                             68 
                     0010    69 k_max_num_entities = 16
                     0020    70 k_size_entity      = 32
                             71 
                             72 
                             73 
                             74 ;; Define an entity 
                             75 .macro DefineEntity _name, _tipo, _cmps, _x, _y, _vx, _vy, _w, _h, _sprite, _ia, _anim, _anim_st,_animCounter, _collides, _lastdir, _lastdirY , _playerShot, _actualizaMove, _contMove, _aimX, _aimY, _hp, _pertenece, _tablaAnim, _animEspecial, _invencible, _atacando
                             76    _name:
                             77       .db _tipo      ;; (Invalid 00, Player 01, Enemigo 02, Dead 80, Default 7F)
                             78       .db _cmps      ;; ()
                             79       .db _x,  _y    ;; x, y
                             80       .db _vx, _vy   ;; Vx, Vy
                             81       .db _w, _h     ;; Width, Height
                             82       .dw _sprite    ;; sprite (puntero al sprite)
                             83       .dw _ia        ;; IA     (puntero a funcion)
                             84       .dw _anim      ;; puntero a la animacion
                             85       .db _anim_st
                             86       .db _animCounter  ;; contador de animacion
                             87       .db _collides  ;; Collides Against
                             88       .db _lastdir, _lastdirY   ;; Ultima direccion a la que apunta la entidad (solo para ver hacia donde dispara el player)
                             89       .db _playerShot ;; 1 si la entidad ya ha disparado, 0 si no
                             90       .db _actualizaMove
                             91       .db _contMove
                             92       .db _aimX, _aimY
                             93       .db _hp
                             94       .dw _pertenece
                             95       .dw _tablaAnim    ;; puntero a la tabla que le corresponde de animaciones
                             96       .db _animEspecial ;; indica si es normal (0) o especial (1)
                             97       .db _invencible
                             98       .db _atacando
                             99 .endm
                            100 
                            101 ;; Define an entity with default values
                            102 .macro DefineEntityDefault _name, _suf
                            103                         ;;  Tipo  cmps  x     y      vx   vy   width height  sprite   ia     anim  status counter  collides  last_dir last_dir  player_shot actualizaMove contMove aimX, aimY    HP   pertenece tablaAnim especial invencibile atacando
                            104    DefineEntity _name'_suf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000, 0x0000, 0x0000, 0x00, 0x00,    0x00,    0x00,    0x00,       0x00,       0x00,       0x00,     0x00, 0x00,  0x00,  0x0000,  0x0000,   0x00,        0xDE,     0xAD;;
                            105 .endm
                            106 
                            107 ;; Define N default entities (changing the names)
                            108 .macro DefineNEntities _name, _n
                            109    _c = 0
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 4.
Hexadecimal [16-Bits]



                            110    .rept _n
                            111       DefineEntityDefault _name, \_c
                            112       _c = _c + 1 
                            113    .endm
                            114 .endm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 5.
Hexadecimal [16-Bits]



                              3 .include "man/entity_templates.h.s"
                              1 .globl player1
                              2 .globl player2
                              3 .globl zombie
                              4 .globl arquero
                              5 .globl arcoiris
                              6 .globl shot1
                              7 .globl vida
                              8 .globl shot_arquero
                              9 .globl ghostX
                             10 .globl ghostY
                             11 .globl monster
                             12 .globl semiseguidor
                             13 .globl cangrejo
                             14 .globl topo
                             15 .globl muriendo_tmp_cmps
                             16 .globl zBoss
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 6.
Hexadecimal [16-Bits]



                              4 .include "man/game.h.s"
                              1 .globl game_init 
                              2 .globl game_play 
                              3 .globl game_menu
                              4 .globl render_init
                              5 .globl cpct_waitVSYNC_asm
                              6 .globl game_create_template
                              7 .globl cpct_drawStringM0_asm
                              8 .globl cpct_akp_musicPlay_asm
                              9 .globl cpct_akp_musicInit_asm
                             10 .globl cpct_zx7b_decrunch_s_asm
                             11 .globl cpct_akp_stop_asm
                             12 .globl set_int_handler
                             13 .globl cpct_akp_SFXInit_asm
                             14 .globl cpct_akp_SFXPlay_asm
                             15 .globl cpct_akp_SFXStop_asm
                             16 
                             17 .globl bool_final_juego
                             18 .globl bool_game_over
                             19 .globl bool_final_ronda
                             20 .globl cont_bajas_enemigos
                             21 .globl incrementa_cont_bajas_enemigos
                             22 
                             23 .globl cpct_setPALColour_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 7.
Hexadecimal [16-Bits]



                              5 .include "sys/collision.h.s"
                              1 .globl sys_collision_update
                              2 .globl cpct_drawSolidBox_asm
                              3 .globl cpct_getRandom_mxor_u8_asm
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 8.
Hexadecimal [16-Bits]



                              6 
                              7 .globl bool_multijugador
                              8 .globl bool_disparo
                              9 
   A5A8 00                   10 registro_aux_ix2: .db 0x0000 ;; registro auxiliar
                             11 
   A5A9 30                   12 timer_direccion: .db #0x30
   A5AA 64                   13 timer_ia_variable: .db #0d100
                             14 
   A5AB                      15 ia_mover_drcha_izq:
                             16     ;; EN IX tenemos la entidad
                             17     ;ld b, e_vy(ix)
                             18     ;ld e_last_dirY(ix), b
   A5AB DD 36 05 00   [19]   19     ld e_vy(ix), #0 ;; Si solo queremos que se mueva hacia los lados, nunca tendra velocidad en Y
                             20                     ;; Por si acaso, se la quito
   A5AF DD 7E 04      [19]   21     ld a, e_vx(ix)
   A5B2 FE 00         [ 7]   22     cp #0
   A5B4 C2 CE A5      [10]   23     jp nz, fin_comprobacion_vx
   A5B7 DD 7E 11      [19]   24         ld a, e_last_dir(ix) ;;Comprobamos que direccion estaba llevando 
   A5BA FE 00         [ 7]   25         cp #0                ;;antes de nada porque si no tuviera velocidad,
   A5BC FA CA A5      [10]   26         jp m, negativo       ;;este metodo por si solo no mueve nada
   A5BF DD 36 04 01   [19]   27             ld e_vx(ix), #1
   A5C3 DD 36 11 01   [19]   28             ld e_last_dir(ix), #1 ;; Cuando movamos la ia, tambien cambiamos la ultima direccion
   A5C7 C3 CE A5      [10]   29             jp fin_comprobacion_vx
   A5CA                      30         negativo:
   A5CA DD 36 04 FF   [19]   31             ld e_vx(ix), #-1
                             32 
   A5CE                      33     fin_comprobacion_vx:
   A5CE DD 7E 02      [19]   34     ld a, e_x(ix)
   A5D1 FE 06         [ 7]   35     cp #0x6
   A5D3 20 09         [12]   36     jr nz, no_borde_izq
                             37         ;; Cambia hacia la derecha
   A5D5 DD 36 04 01   [19]   38         ld e_vx(ix), #1
   A5D9 DD 36 11 01   [19]   39         ld e_last_dir(ix), #1 ;; Cuando movamos la ia, tambien cambiamos la ultima direccion
   A5DD C9            [10]   40         ret
   A5DE                      41     no_borde_izq:
                             42 
   A5DE FE 44         [ 7]   43     cp #0x44 ;; borde drecha - tam_Enemigo
                             44 
   A5E0 20 09         [12]   45     jr nz, no_borde_drcha
                             46         ;; Cambia hacia la izq
   A5E2 DD 36 04 FF   [19]   47         ld e_vx(ix), #-1
   A5E6 DD 36 11 FF   [19]   48         ld e_last_dir(ix), #-1 ;; Cuando movamos la ia, tambien cambiamos la ultima direccion
   A5EA C9            [10]   49         ret
   A5EB                      50     no_borde_drcha:
                             51 
   A5EB C9            [10]   52 ret 
                             53 
                             54 
   A5EC                      55 ia_mover_arriba_abajo:
                             56     ;; EN IX tenemos la entidad
                             57     ;; Al igual que antes, si solo se mueve de arriba a abajo
                             58     ;; le quitamos la velocidad en X no vaya a ser que llegue con velocidad
   A5EC DD 36 04 00   [19]   59     ld e_vx(ix), #0
                             60 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 9.
Hexadecimal [16-Bits]



   A5F0 DD 7E 05      [19]   61     ld a, e_vy(ix)
   A5F3 FE 00         [ 7]   62     cp #0
   A5F5 C2 0F A6      [10]   63     jp nz, fin_comprobacion_vy
   A5F8 DD 7E 12      [19]   64         ld a, e_last_dirY(ix) ;;Comprobamos que direccion estaba llevando 
   A5FB FE 00         [ 7]   65         cp #0                 ;;antes de nada porque si no tuviera velocidad,
   A5FD FA 0B A6      [10]   66         jp m, negativoY       ;;este metodo por si solo no mueve nada
   A600 DD 36 05 04   [19]   67             ld e_vy(ix), #4
   A604 DD 36 12 04   [19]   68             ld e_last_dirY(ix), #4 ;; Cuando movamos la ia, tambien cambiamos la ultima direccion
   A608 C3 0F A6      [10]   69             jp fin_comprobacion_vy
   A60B                      70         negativoY:
   A60B DD 36 05 FC   [19]   71             ld e_vy(ix), #-4
                             72 
   A60F                      73     fin_comprobacion_vy:
                             74 
   A60F DD 7E 03      [19]   75     ld a, e_y(ix)
   A612 FE 20         [ 7]   76     cp #0x20
   A614 20 09         [12]   77     jr nz, no_borde_arriba
                             78         ;; Cambia hacia la derecha
   A616 DD 36 05 04   [19]   79         ld e_vy(ix), #4
   A61A DD 36 12 04   [19]   80         ld e_last_dirY(ix), #4 ;; Cuando movamos la ia, tambien cambiamos la ultima direccion
   A61E C9            [10]   81         ret
   A61F                      82     no_borde_arriba:
                             83 
   A61F FE 94         [ 7]   84     cp #0x94 ;; borde drecha - tam_Enemigo
                             85 
   A621 20 09         [12]   86     jr nz, no_borde_abajo
                             87         ;; Cambia hacia la izq
   A623 DD 36 05 FC   [19]   88         ld e_vy(ix), #-4
   A627 DD 36 12 FC   [19]   89         ld e_last_dirY(ix), #-4 ;; Cuando movamos la ia, tambien cambiamos la ultima direccion
   A62B C9            [10]   90         ret
   A62C                      91     no_borde_abajo:
                             92 
   A62C C9            [10]   93 ret 
                             94 
                             95 
                             96 
   A62D                      97 move_to:
                             98     ;; COMPROBAMOS LA X
   A62D DD 7E 02      [19]   99     ld a, e_x(ix) ;; A = Enemigo_X
   A630 DD 96 16      [19]  100     sub a, e_aim_X(ix) ;; a = enemy_x - player_x
                            101     
   A633 38 08         [12]  102     jr c, enemigo_derecha_player ;; Si la resta es negativa, -->  player_X  > enemigo_X
   A635 28 0C         [12]  103     jr z, misma_posicion_x
   A637 DD 36 04 FF   [19]  104         ld e_vx(ix), #-1         ;; Por tanto, hay que mover el enemigo hacia la izq
   A63B 18 0A         [12]  105         jr check_y               ;; Pasamos a comprobar la y
                            106 
   A63D                     107     enemigo_derecha_player:      ;; Si es positiva, la x del enemigo esta mas a la derecha que la del player
   A63D DD 36 04 01   [19]  108     ld e_vx(ix), #1              ;; Por tanto, hay que mover el enemigo hacia la drcha
   A641 18 04         [12]  109     jr check_y
                            110 
   A643                     111     misma_posicion_x:
   A643 DD 36 04 00   [19]  112     ld e_vx(ix), #0
                            113     
                            114     ;; COMPROBAMOS LA Y
   A647                     115     check_y:
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 10.
Hexadecimal [16-Bits]



   A647 DD 7E 03      [19]  116     ld a, e_y(ix)  ;; A = Enemy_Y
   A64A DD 96 17      [19]  117     sub a, e_aim_Y(ix) ;; A = Enemy_Y - Player_Y
                            118     
   A64D 38 07         [12]  119     jr c, enemigo_arriba_player ;; Si hay carry (EnemyY - PlayerY < 0 --> Hay carry)
   A64F 28 0A         [12]  120     jr z, misma_posicion_y
                            121         ; no hay carry y no es cero --> EnemyY > Player_Y --> Enemigo Abajo
   A651 DD 36 05 FC   [19]  122         ld e_vy(ix), #-4        ;; ENEMIGO se mueve hacia ARRIBA
   A655 C9            [10]  123         ret                 
                            124 
   A656                     125     enemigo_arriba_player:      ;; Si es positiva, la x del enemigo esta mas a la derecha que la del player
   A656 DD 36 05 04   [19]  126     ld e_vy(ix), #4             ;; Por tanto, hay que mover el enemigo hacia la izquierda restando posiciones
   A65A C9            [10]  127     ret
                            128 
   A65B                     129     misma_posicion_y:
   A65B DD 36 05 00   [19]  130     ld e_vy(ix), #0
                            131     
                            132 
   A65F C9            [10]  133 ret
                            134 
                            135 
                            136 ;; IA 2 - ARQUERO
   A660                     137 ia_arquero:
                            138     ;; EN IX tenemos la entidad Arquero
                            139     ;; Movemos al enemigo 
                            140     ;call ia_mover_drcha_izq
                            141 
   A660 CD EC A5      [17]  142     call ia_mover_arriba_abajo
                            143  
                            144     ;; Comprobamos si podemos disparar con arquero_player_shot
   A663 DD 7E 13      [19]  145     ld a, e_player_shot(ix)
   A666 FE 00         [ 7]  146     cp #0
   A668 C0            [11]  147     ret nz
                            148     ;; Comprobamos si vemos al player para dispararle
   A669 FD 21 F6 8F   [14]  149     ld iy, #entity_vector ;; Cargamos los datos del jugador en iy
                            150 
                            151     ;; if (X_enemy == X_arquero)
   A66D FD 7E 02      [19]  152     ld a, e_x(iy)
   A670 DD BE 02      [19]  153     cp e_x(ix)
                            154 
   A673 20 38         [12]  155     jr nz, no_lo_veo
   A675 3E 01         [ 7]  156         ld a, #1
   A677 32 D4 95      [13]  157         ld (bool_disparo), a
                            158         ;; Si coinciden las X, el arquero dispara 
   A67A DD 36 13 01   [19]  159         ld e_player_shot(ix), #1
   A67E DD 36 1F 01   [19]  160         ld e_atacando(ix), #1
                            161         
                            162         ;; Creamos un disparo
   A682 11 B2 95      [10]  163         ld de, #shot_arquero
                            164         
                            165         ;; Tenemos que ver si el disparo va hacia arriba o hacia abajo
   A685 FD 7E 03      [19]  166         ld a, e_y(iy)
   A688 DD BE 03      [19]  167         cp e_y(ix)
   A68B FA 96 A6      [10]  168         jp m, arquero_abajo
                            169             ;; Dispara hacia abajo 
   A68E 26 04         [ 7]  170             ld h, #4
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 11.
Hexadecimal [16-Bits]



   A690 DD 36 05 04   [19]  171             ld e_vy(ix), #4 ;; Al verlo abajo, cambiamos la dirección del arquero
   A694 18 06         [12]  172             jr acaba_ia_arquero
   A696                     173         arquero_abajo:
                            174             ;; Dispara hacia arriba
   A696 26 FC         [ 7]  175             ld h, #-4
   A698 DD 36 05 FC   [19]  176             ld e_vy(ix), #-4 ;; Al verlo abajo, cambiamos la dirección del arquero
                            177             
                            178             
   A69C                     179         acaba_ia_arquero:
                            180 
   A69C DD 7E 02      [19]  181         ld a, e_x(ix)  ;; X_shot = X_arquero 
   A69F DD 46 03      [19]  182         ld b, e_y(ix)
   A6A2 0E 00         [ 7]  183         ld c, #0       ;; VX_shot = 0
   A6A4 2E 01         [ 7]  184         ld l, #1
                            185 
   A6A6 DD E5         [15]  186         push ix
                            187 
   A6A8 CD DD 92      [17]  188         call entity_set4creation
   A6AB DD E1         [14]  189         pop ix
                            190         
                            191     
   A6AD                     192     no_lo_veo:
                            193 
   A6AD C9            [10]  194 ret
                            195 
   A6AE 00                  196 boll_create: .db #0
                            197 
                            198 
                            199 ;; IA 1 - ZOMBIE
   A6AF                     200 ia_seguimiento_player:
                            201 
                            202     ;; Cogemos los datos del jugador y nos los ponemos como objetivo
   A6AF CD B6 A6      [17]  203     call target_player  
                            204 
                            205     ;; Llamamos a MoveTo
   A6B2 CD 2D A6      [17]  206     call move_to
                            207     
   A6B5 C9            [10]  208 ret
                            209 
   A6B6                     210 target_player:
   A6B6 FD 21 F6 8F   [14]  211     ld iy, #entity_vector ;; Cargamos los datos del jugador en iy
   A6BA FD 46 02      [19]  212     ld b, e_x(iy)
   A6BD FD 4E 03      [19]  213     ld c, e_y(iy)
   A6C0 DD 70 16      [19]  214     ld e_aim_X(ix), b
   A6C3 DD 71 17      [19]  215     ld e_aim_Y(ix), c
                            216 
                            217     ;push iy
                            218 
   A6C6 3A BE 96      [13]  219     ld a, (bool_multijugador)
   A6C9 FE 01         [ 7]  220     cp #1
   A6CB 20 32         [12]  221     jr nz, no_multi_player
                            222 
                            223         ;; CALCULO DISTANCIA CON PLAYER 1, y lo guardo en C
   A6CD FD 7E 02      [19]  224         ld a, e_x(iy)   ;; A = PlayerX
   A6D0 DD 96 02      [19]  225         sub e_x(ix)      ;; A = playerX - enemyX
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 12.
Hexadecimal [16-Bits]



   A6D3 47            [ 4]  226         ld b, a         ;; B = A 
                            227         ;;
   A6D4 DD 7E 03      [19]  228         ld a, e_y(ix)
   A6D7 DD 96 03      [19]  229         sub e_y(ix)
                            230         ;;
   A6DA 80            [ 4]  231         add b           ;; A = diferenciaX + diferencia Y (con player1)
   A6DB 4F            [ 4]  232         ld c, a         ;; C = A
                            233 
                            234 
                            235         ;; IY => PLAYER 2
   A6DC 11 20 00      [10]  236         ld de, #k_size_entity
   A6DF FD 19         [15]  237         add iy, de
                            238 
                            239 
                            240         ;; CALCULO DIFERENCIAS CON PLAYER 2, y lo guardo en A
   A6E1 FD 7E 02      [19]  241         ld a, e_x(iy)   ;; A = PlayerX
   A6E4 DD 96 02      [19]  242         sub e_x(ix)      ;; A = playerX - enemyX
   A6E7 47            [ 4]  243         ld b, a         ;; B = A 
                            244 
   A6E8 DD 7E 03      [19]  245         ld a, e_y(ix)
   A6EB DD 96 03      [19]  246         sub e_y(ix)
                            247         
   A6EE 80            [ 4]  248         add b           ;; A = diferenciaX + diferencia Y (con player1)
                            249         
                            250 
                            251         ; si la diferencia en A < C (objetivo del player2)
   A6EF B9            [ 4]  252         cp c
   A6F0 FA FF A6      [10]  253         jp m, no_multi_player
                            254             ;; player 1 mas cerca
   A6F3 FD 46 02      [19]  255             ld b, e_x(iy)
   A6F6 FD 4E 03      [19]  256             ld c, e_y(iy)
                            257 
   A6F9 DD 70 16      [19]  258             ld e_aim_X(ix), b
   A6FC DD 71 17      [19]  259             ld e_aim_Y(ix), c
                            260 
   A6FF                     261     no_multi_player:
                            262     
                            263     ;pop iy
                            264     
                            265 
                            266     ;; Metemos la posicion objetivo del Zombie en los datos de la entidad aim_X y aim_Y
                            267     
   A6FF C9            [10]  268 ret 
                            269 
   A700                     270 velocidades_enemigo_patron:
   A700 01 04               271     .db #1, #4 ;; velocidad abajo derecha
   A702 01 FC               272     .db #1, #-4 ;; velocidad arriba derecha
   A704 FF 04               273     .db #-1, #4 ;; velocidad abajo izquierda
   A706 FF FC               274     .db #-1, #-4 ;; velocidad arriba izquierda
                            275 
   A708                     276 ia_patron:
   A708 3A A9 A5      [13]  277     ld a, (timer_direccion)
   A70B FE 00         [ 7]  278     cp #0
   A70D 20 05         [12]  279     jr nz, no_move
                            280         ;; Si el tiempo llega a 0
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 13.
Hexadecimal [16-Bits]



   A70F CD 19 A7      [17]  281         call cambia_direccion_patron
   A712 3E 30         [ 7]  282         ld a, #0x30
   A714                     283     no_move:
   A714 3D            [ 4]  284     dec a
   A715 32 A9 A5      [13]  285     ld (timer_direccion), a
   A718 C9            [10]  286 ret
                            287 
   A719                     288 cambia_direccion_patron:
   A719 CD 5F B6      [17]  289     call cpct_getRandom_mxor_u8_asm ;; Destroys AF, BC, DE, HL
   A71C 7D            [ 4]  290     ld a, l
   A71D E6 03         [ 7]  291     and #0x03   ; Me devuelve una de estas opciones --> 00 01 10 11 (0,1,2 o 3 en A)
                            292 
   A71F 21 00 A7      [10]  293     ld hl, #velocidades_enemigo_patron
                            294 
   A722                     295     comprueba_aleatorio:
   A722 B7            [ 4]  296     or a
   A723 FE 00         [ 7]  297     cp #0
   A725 28 05         [12]  298     jr z, encontrada
   A727 23            [ 6]  299         inc hl
   A728 23            [ 6]  300         inc hl
   A729 3D            [ 4]  301         dec a
   A72A 18 F6         [12]  302         jr comprueba_aleatorio
   A72C                     303     encontrada:
                            304 
   A72C 22 A8 A5      [16]  305     ld (registro_aux_ix2), hl
                            306 
   A72F FD 2A A8 A5   [20]  307     ld iy, (registro_aux_ix2)
   A733 FD 7E 00      [19]  308     ld a, 0(iy)
   A736 FD 46 01      [19]  309     ld b, 1(iy)
   A739 DD 77 04      [19]  310     ld e_vx(ix), a
   A73C DD 70 05      [19]  311     ld e_vy(ix), b
   A73F C9            [10]  312 ret
                            313 
   A740                     314 ia_topo:
                            315 
                            316     ;; IX => Topo
                            317 
                            318     ;; Miramos si tenemos objetivo
   A740 DD 7E 16      [19]  319     ld a, e_aim_X(ix)
   A743 FE 00         [ 7]  320     cp #0
   A745 20 11         [12]  321     jr nz, ya_tenemos_objetivo
                            322         ;; NO tenemos un objetivo
                            323 
                            324         ;; Cogemos los datos del jugador y nos los ponemos como objetivo
   A747 CD B6 A6      [17]  325         call target_player  
                            326 
                            327         ;; le quitamos 1 a la X (porque peta en el borde drcho)
   A74A DD 7E 16      [19]  328         ld a, e_aim_X(ix)   ; A = 44
   A74D FE 40         [ 7]  329         cp #0x40            ; A = 44 - 40
   A74F FA 58 A7      [10]  330         jp m, no_resto_X
                            331             ;; Si estoy en el borde derecho
   A752 DD 35 16      [23]  332             dec e_aim_X(ix)
   A755 DD 35 16      [23]  333             dec e_aim_X(ix)
   A758                     334         no_resto_X:
                            335 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 14.
Hexadecimal [16-Bits]



   A758                     336     ya_tenemos_objetivo:
                            337 
                            338     ;; Llamamos a MoveTo
   A758 CD 2D A6      [17]  339     call move_to
                            340 
                            341     ;; Si la velocidad del topo (Vx==0 y Vy==0) --> habré llegado al objetivo
   A75B DD 7E 04      [19]  342     ld a, e_vx(ix)
   A75E FE 00         [ 7]  343     cp #0
   A760 20 25         [12]  344     jr nz, no_ha_llegado_a_objetivo
                            345         ;; VX == 0 
   A762 DD 7E 05      [19]  346         ld a, e_vy(ix)
   A765 FE 00         [ 7]  347         cp #0
   A767 20 1E         [12]  348         jr nz, no_ha_llegado_a_objetivo
                            349 
                            350             ;; VX == 0 y VY==0  --> topo llega al objetivo
                            351 
                            352             ;; Ya no es invencible
   A769 DD 36 1E 00   [19]  353             ld e_invencibilidad(ix), #0x00
                            354 
   A76D DD 34 13      [23]  355             inc e_player_shot(ix)
   A770 DD 7E 13      [19]  356             ld a, e_player_shot(ix)
   A773 FE 40         [ 7]  357             cp #0x40        ;; Esto es lo que debe tardar la animacion del topo cuando esta arriba
   A775 20 0F         [12]  358             jr nz, contador_no_ha_acabado
                            359                 ;; Si el topo ha estado parado un rato entonces, resetea el objetivo a 0, para que se vuelva a mover
   A777 3E 00         [ 7]  360                 ld a, #0
   A779 DD 77 16      [19]  361                 ld e_aim_X(ix), a
   A77C DD 77 17      [19]  362                 ld e_aim_Y(ix), a
                            363 
                            364                 ;; Resetea tamb el contador
   A77F DD 77 13      [19]  365                 ld e_player_shot(ix), a
                            366 
                            367                 ;; Y ahora ya es invencible (pasa a estar bajo tierra)
   A782 DD 36 1E 01   [19]  368                 ld e_invencibilidad(ix), #0x01
                            369 
   A786                     370             contador_no_ha_acabado:
   A786 C9            [10]  371             ret
   A787                     372     no_ha_llegado_a_objetivo:
   A787 DD 36 1E 01   [19]  373         ld e_invencibilidad(ix), #0x01
                            374     
   A78B C9            [10]  375 ret
                            376 
   A78C                     377 ia_cangrejo:
                            378 
   A78C DD E5         [15]  379     push ix
                            380 
                            381     ;; Reseteamos la invencibilidad (se le puede disparar)
   A78E 3E 00         [ 7]  382     ld a, #0
   A790 DD 77 1E      [19]  383     ld e_invencibilidad(ix), a
                            384 
                            385     ;; Miramos si hay un disparo vivo desde hace mucho
   A793 3A F6 91      [13]  386     ld a, (num_entities)
   A796 DD 21 F6 8F   [14]  387     ld ix, #entity_vector
   A79A 01 20 00      [10]  388     ld bc, #k_size_entity
   A79D DD 09         [15]  389     add ix, bc
                            390 
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 15.
Hexadecimal [16-Bits]



   A79F                     391     recorremosEntidades: ;; menos el player
                            392 
   A79F 47            [ 4]  393         ld b, a ; B = num_entidades_restantes
                            394 
                            395         ;;comprobamos si la entidad es valida o no
   A7A0 DD 7E 00      [19]  396         ld a, e_tipo(ix) 
   A7A3 FE 00         [ 7]  397         cp #e_type_invalid
   A7A5 28 19         [12]  398         jr z, noHayValidas
                            399 
                            400         ;; Comprobamos si es de tipo disparo
   A7A7 FE 04         [ 7]  401         cp #e_type_shot
   A7A9 20 0A         [12]  402         jr nz, no_Es_disparo
                            403             ;; Es un disparo
                            404 
                            405             ;; Comprobamos si lleva vivo X tiempo if(a > 10)
   A7AB DD 7E 13      [19]  406             ld a, e_player_shot(ix)
   A7AE FE 0A         [ 7]  407             cp #0x0A
   A7B0 FA B5 A7      [10]  408             jp m, no_se_protege
   A7B3 18 11         [12]  409                 jr cangrejo_protegete
   A7B5                     410             no_se_protege:
   A7B5                     411         no_Es_disparo:
                            412 
   A7B5 C5            [11]  413         push bc
                            414 
                            415         ;; Pasamos a la siguiente entidad
   A7B6 01 20 00      [10]  416         ld bc, #k_size_entity
   A7B9 DD 09         [15]  417         add ix, bc 
                            418         
   A7BB C1            [10]  419         pop bc 
   A7BC 78            [ 4]  420         ld a, b
   A7BD 3D            [ 4]  421         dec a
   A7BE 20 DF         [12]  422         jr nz, recorremosEntidades
                            423 
   A7C0                     424     noHayValidas:
                            425 
   A7C0 DD E1         [14]  426     pop ix
                            427 
   A7C2 CD AF A6      [17]  428     call ia_seguimiento_player
                            429 
   A7C5 C9            [10]  430 ret
                            431 
   A7C6                     432 cangrejo_protegete:
                            433 
   A7C6 DD E1         [14]  434     pop ix
                            435 
   A7C8 3E 00         [ 7]  436     ld a, #0x00 
                            437 
                            438     ;; Lo dejamos parado
   A7CA DD 77 04      [19]  439     ld e_vx(ix), a 
   A7CD DD 77 05      [19]  440     ld e_vy(ix), a
                            441 
                            442     ; Invencibilidad = true
   A7D0 3E 01         [ 7]  443     ld a, #1
   A7D2 DD 77 1E      [19]  444     ld e_invencibilidad(ix), a
                            445   
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 16.
Hexadecimal [16-Bits]



                            446 
                            447     ;; Cambiamos sprite ¿depende de reichel, a lo mejor no hace falta tampoco?
                            448 
                            449     
   A7D5 C9            [10]  450 ret
                            451 
                            452 
                            453 ;; Esta IA es para los disparos del player. Simplemente actualiza el contador (se va a reutilizar la variable player_Shot)
                            454 ;; PlayerShot se supone que es para el player (0-puede disparar // 1-no puede pq ya habia disparado)
                            455 ;; Pues para el Shot, es un contador de cuantas iteraciones lleva vivo el disparo. Se usa para que los cangrejos/escuderos se escondan
   A7D6                     456 ia_update_cont_shot:
                            457     ;; IX => Disparo
   A7D6 DD 34 13      [23]  458     inc e_player_shot(ix)
                            459 
   A7D9 C9            [10]  460 ret
                            461 
   A7DA                     462 ia_variable_tiempo:
                            463 ;; Si el timer es mayor de 80, tomamos ia de arriba a abajo, si es mayor de 40 de izquierda a derecha y si es menor que te siga
   A7DA 3A AA A5      [13]  464     ld a, (timer_ia_variable)
   A7DD FE 32         [ 7]  465     cp #50
   A7DF F2 EA A7      [10]  466     jp p, mueve_arriba
   A7E2 F5            [11]  467         push af
   A7E3 CD AB A5      [17]  468         call ia_mover_drcha_izq ;; Esta es la llamada que ejecuta el comportamiento 1 >>>>>>>>>>
   A7E6 F1            [10]  469         pop af
   A7E7 C3 EF A7      [10]  470         jp modificar_timer
                            471         ;; Si quisieramos cambiar los dos comportamientos que siguen, solo cambiamos la linea de arrriba y la de abajo
   A7EA                     472     mueve_arriba:
   A7EA F5            [11]  473     push af
   A7EB CD EC A5      [17]  474     call ia_mover_arriba_abajo ;; y esta el comportamiento 2 >>>>>>>>>>>>>
                            475 
   A7EE F1            [10]  476     pop af
                            477     
   A7EF                     478     modificar_timer:
   A7EF 3D            [ 4]  479     dec a
   A7F0 FE 00         [ 7]  480     cp #0
   A7F2 C2 F7 A7      [10]  481     jp nz, timer_no_cero
   A7F5 3E 64         [ 7]  482         ld a, #100
   A7F7                     483     timer_no_cero:
   A7F7 32 AA A5      [13]  484     ld (timer_ia_variable), a
   A7FA C9            [10]  485 ret
                            486 
   A7FB                     487 ia_update_one:
   A7FB DD 6E 0A      [19]  488     ld l, e_iaL(ix)
   A7FE DD 66 0B      [19]  489     ld h, e_iaH(ix)
                            490 
                            491     ;ld hl, e_ia(ix)
   A801 22 05 A8      [16]  492     ld (metodo_IA), hl
                     025D   493     metodo_IA = . + 1
   A804 CD AB A5      [17]  494     call ia_mover_drcha_izq
   A807 C9            [10]  495 ret
                            496 
                            497 
   A808                     498 ia_update:
                            499     ;; COMPROBAR SIGNATURE CON entity_doForAll_matching
   A808 21 FB A7      [10]  500     ld hl, #ia_update_one
ASxxxx Assembler V02.00 + NoICE + SDCC mods  (Zilog Z80 / Hitachi HD64180), page 17.
Hexadecimal [16-Bits]



   A80B 06 08         [ 7]  501     ld b , #e_cmp_ia
   A80D CD 4F 92      [17]  502     call entity_doForAll_matching
   A810 C9            [10]  503 ret
