junglejourney

changeset 46:94c31bab0877

Added collision checking between the projectile and the enemies.
author David Boddie <david@boddie.org.uk>
date Mon Aug 22 01:03:55 2011 +0200
parents 2cf14232ef0f
children eb8ce2b29b9a
files mapcode.oph
diffstat 1 files changed, 162 insertions(+), 2 deletions(-) [+]
line diff
     1.1 --- a/mapcode.oph	Sun Aug 21 21:46:42 2011 +0200
     1.2 +++ b/mapcode.oph	Mon Aug 22 01:03:55 2011 +0200
     1.3 @@ -1777,8 +1777,7 @@
     1.4  
     1.5  check_fire_key:
     1.6  
     1.7 -    lda $33fe
     1.8 -    and #15
     1.9 +    lda $33fd
    1.10      bne check_fire_key_exit
    1.11  
    1.12      ldx #182            ; (Return)
    1.13 @@ -1790,6 +1789,9 @@
    1.14      cmp #0
    1.15      bne check_fire_key_exit
    1.16  
    1.17 +    lda #15
    1.18 +    sta $33fd
    1.19 +
    1.20      jmp create_projectile   ; optimise away the rts
    1.21  
    1.22      check_fire_key_exit:
    1.23 @@ -2709,7 +2711,16 @@
    1.24      bcs move_projectile_destroy
    1.25  
    1.26      move_projectile_toggle:
    1.27 +
    1.28 +    jsr projectile_collide
    1.29 +    bcs move_projectile_destroy
    1.30 +
    1.31      jsr move_projectile_animate
    1.32 +
    1.33 +    lda #$06
    1.34 +    sta $74
    1.35 +    lda #$33
    1.36 +    sta $75
    1.37      jmp plot_character          ; optimise away the rts
    1.38  
    1.39      move_projectile_destroy:
    1.40 @@ -2799,6 +2810,144 @@
    1.41  
    1.42      rts
    1.43  
    1.44 +projectile_collide:
    1.45 +
    1.46 +    lda #$0c            ; set the character address
    1.47 +    sta $74
    1.48 +    lda #$33
    1.49 +    sta $75
    1.50 +
    1.51 +    projectile_collide_loop:
    1.52 +
    1.53 +        ldy #0
    1.54 +        lda ($74),y         ; type
    1.55 +        cmp #4
    1.56 +        bpl projectile_collide_check
    1.57 +
    1.58 +        jmp projectile_collide_next
    1.59 +
    1.60 +        projectile_collide_check:
    1.61 +
    1.62 +        ldy #2
    1.63 +        lda ($74),y         ; y
    1.64 +        sec
    1.65 +        sbc $3308           ; y - projectile y
    1.66 +        beq projectile_check_collide_y_equal
    1.67 +        cmp #1
    1.68 +        beq projectile_check_collide_y_greater
    1.69 +        cmp #255
    1.70 +        beq projectile_check_collide_y_less
    1.71 +
    1.72 +        jmp projectile_collide_next
    1.73 +
    1.74 +        projectile_check_collide_y_equal:
    1.75 +        ldy #3
    1.76 +        lda ($74),y         ; dy
    1.77 +        sec
    1.78 +        sbc $3309           ; dy - projectile dy
    1.79 +        bmi projectile_check_collide_y_equal_n
    1.80 +
    1.81 +        cmp #2                                  ; y - py >= 2 (to miss)
    1.82 +        bmi projectile_check_collide_x
    1.83 +
    1.84 +        projectile_check_collide_y_equal_n:
    1.85 +        cmp #253                                ; y - py <= -4 (to miss)
    1.86 +        bpl projectile_check_collide_x
    1.87 +
    1.88 +        jmp projectile_collide_next
    1.89 +
    1.90 +        projectile_check_collide_y_greater:         ; Y - py >= 2 (to miss)
    1.91 +        ldy #3                                      ; Y = 6 + y  (coordinates)
    1.92 +        lda ($74),y         ; dy                    ; 6 + y - py >= 2
    1.93 +        sec                                         ; y - py >= -4
    1.94 +        sbc $3309           ; dy - projectile dy
    1.95 +        cmp #252
    1.96 +        bmi projectile_check_collide_x
    1.97 +
    1.98 +        jmp projectile_collide_next
    1.99 +
   1.100 +        projectile_check_collide_y_less:            ; PY - y >= 4 (to miss)
   1.101 +        ldy #3                                      ; PY = 6 + py
   1.102 +        lda ($74),y         ; dy                    ; 6 + py - y >= 4
   1.103 +        sec                                         ; y - py <= 2
   1.104 +        sbc $3309           ; dy - projectile dy
   1.105 +        cmp #3
   1.106 +        bpl projectile_check_collide_x
   1.107 +
   1.108 +        jmp projectile_collide_next
   1.109 +
   1.110 +        projectile_check_collide_x:
   1.111 +        ldy #4
   1.112 +        lda ($74),y         ; x
   1.113 +        sec
   1.114 +        sbc $330a           ; x - projectile x
   1.115 +        beq projectile_check_collide_x_equal
   1.116 +        cmp #1
   1.117 +        beq projectile_check_collide_x_greater
   1.118 +        cmp #255
   1.119 +        beq projectile_check_collide_x_less
   1.120 +
   1.121 +        jmp projectile_collide_next
   1.122 +
   1.123 +        projectile_check_collide_x_equal:
   1.124 +
   1.125 +        ; A collision has occurred (enemies occupy the whole width of a tile).
   1.126 +        jmp projectile_check_collide_destroy
   1.127 +
   1.128 +        projectile_check_collide_x_greater:     ; X - px >= 2 (to miss)
   1.129 +        ldy #5                                  ; X = 4 + x  (coordinates)
   1.130 +        lda ($74),y         ; dx                ; 4 + x - px >= 2
   1.131 +        sec                                     ; x - px >= -2
   1.132 +        sbc $330b           ; dx - projectile dx
   1.133 +        cmp #254
   1.134 +        bpl projectile_collide_next
   1.135 +
   1.136 +        jmp projectile_check_collide_destroy
   1.137 +
   1.138 +        projectile_check_collide_x_less:        ; PX - x >= 4 (to miss)
   1.139 +        ldy #5                                  ; PX = 4 + px
   1.140 +        lda ($74),y         ; dx                ; 4 + px - x >= 4
   1.141 +        sec                                     ; x - px <= 0
   1.142 +        sbc $330b           ; dx - projectile dx
   1.143 +        bmi projectile_collide_next
   1.144 +
   1.145 +        jmp projectile_check_collide_destroy
   1.146 +
   1.147 +        projectile_collide_next:
   1.148 +        clc
   1.149 +
   1.150 +        ; Examine the next character.
   1.151 +        lda $74
   1.152 +        adc #6
   1.153 +
   1.154 +        cmp #$24
   1.155 +        bpl projectile_collide_exit
   1.156 +        sta $74
   1.157 +        jmp projectile_collide_loop
   1.158 +
   1.159 +    projectile_check_collide_destroy:
   1.160 +
   1.161 +    ; Unplot the enemy and replace it with an explosion.
   1.162 +
   1.163 +    jsr unplot_character
   1.164 +
   1.165 +    lda #3      ; explosion
   1.166 +    ldy #0
   1.167 +    sta ($74),y
   1.168 +
   1.169 +    lda #8
   1.170 +    ldy #1
   1.171 +    sta ($74),y
   1.172 +
   1.173 +    jsr plot_character
   1.174 +
   1.175 +    sec         ; set the carry flag to inform the caller that the projectile
   1.176 +    rts         ; should be destroyed
   1.177 +
   1.178 +    projectile_collide_exit:
   1.179 +    clc
   1.180 +    rts
   1.181 +
   1.182  set_palette:
   1.183                      ; $70=logical colour
   1.184                      ; $71=physical colour
   1.185 @@ -2962,6 +3111,9 @@
   1.186  
   1.187              jsr plot_buffer
   1.188  
   1.189 +            lda #0         ; reset projectile counter
   1.190 +            sta $33fd
   1.191 +
   1.192              lda #0         ; reset motion counter
   1.193              sta $33fe
   1.194  
   1.195 @@ -2988,6 +3140,14 @@
   1.196                  beq exit
   1.197                  clc
   1.198  
   1.199 +                lda $33fd
   1.200 +                cmp #0
   1.201 +                beq room_loop_no_update_projectile_counter
   1.202 +
   1.203 +                dec $33fd
   1.204 +
   1.205 +                room_loop_no_update_projectile_counter:
   1.206 +
   1.207                  dec $33ff   ; update generation counter
   1.208  
   1.209                  inc $33fe   ; update motion counter