mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-03-04 19:34:16 +00:00
climb: add rock collision
This commit is contained in:
parent
e88c70c92a
commit
54e1768aff
@ -316,9 +316,27 @@ move_bird_done:
|
||||
|
||||
ldx #0
|
||||
stx CURRENT_ROCK
|
||||
|
||||
move_rock_loop:
|
||||
|
||||
ldx CURRENT_ROCK
|
||||
|
||||
lda PEASANT_FALLING
|
||||
bne no_rock_collision
|
||||
|
||||
; collision detect
|
||||
|
||||
jsr rock_collide
|
||||
bcc no_rock_collision
|
||||
|
||||
; collision happened!
|
||||
|
||||
lda #1
|
||||
sta PEASANT_FALLING
|
||||
|
||||
no_rock_collision:
|
||||
|
||||
|
||||
lda rock_state,X
|
||||
beq move_rock_normal
|
||||
cmp #3
|
||||
@ -833,3 +851,158 @@ bird_no_collide:
|
||||
clc
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
;===========================
|
||||
; check for rock collisions
|
||||
;===========================
|
||||
; which rock in X
|
||||
|
||||
rock_collide:
|
||||
|
||||
; 0 = bit, 1 = little
|
||||
lda rock_type,X
|
||||
bne little_rock_collide
|
||||
|
||||
|
||||
;===========================
|
||||
; big rock collide
|
||||
|
||||
big_rock_collide:
|
||||
|
||||
; big rock is 3x22
|
||||
; little rock is 2x14
|
||||
; peasant is 3x30
|
||||
|
||||
; doing a sort of Minkowski Sum collision detection here
|
||||
; with the rectangular regions
|
||||
|
||||
; might be faster to set it up so you can subtract, but that leads
|
||||
; to issues when we go negative and bcc/bcs are unsigned compares
|
||||
|
||||
; if (rock_x+1<PEASANT_X-1) no_collide
|
||||
; equivalent, if (rock_x+2<PEASANT_X)
|
||||
; equivalent, if (PEASANT_X-1 >= rock_x+1)
|
||||
|
||||
lda rock_x,X
|
||||
sta TEMP_CENTER
|
||||
inc TEMP_CENTER ; rock_x+1
|
||||
|
||||
sec
|
||||
lda PEASANT_X
|
||||
sbc #1 ; A is PEASANT_X-1
|
||||
cmp TEMP_CENTER ; compare with rock_x+1
|
||||
bcs rock_no_collide ; bge
|
||||
|
||||
; if (rock_x+1>=PEASANT_X+3) no collide
|
||||
; equivalent, if (rock_x-2>=PEASANT_X)
|
||||
; equivalent, if (PEASANT_X+3<rock_x+1)
|
||||
|
||||
; carry clear here
|
||||
adc #4 ; A is now PEASANT_X+3
|
||||
cmp TEMP_CENTER
|
||||
bcc rock_no_collide ; blt
|
||||
|
||||
; bird = 16
|
||||
; rock = 22
|
||||
|
||||
; if (rock_y+11<PEASANT_Y-11) no_collide
|
||||
; equivalent, if (rock_y+22<PEASANT_Y)
|
||||
; equivalent, if (PEASANT_Y-11>=rock_y+11)
|
||||
|
||||
lda rock_y,X
|
||||
clc
|
||||
adc #11
|
||||
sta TEMP_CENTER
|
||||
|
||||
lda PEASANT_Y
|
||||
sec
|
||||
sbc #11 ; A is now PEASANT_Y-11
|
||||
cmp TEMP_CENTER
|
||||
bcs rock_no_collide ; blt
|
||||
|
||||
; if (rock_Y+11>=PEASANT_Y+41) no collide
|
||||
; equivalent, if (rock_y-30>=PEASANT_Y)
|
||||
; equivalent, if (PEASANT_Y+41<rock_y+11)
|
||||
|
||||
; carry clear here
|
||||
adc #41 ; A is now bird_y+30
|
||||
cmp TEMP_CENTER
|
||||
bcc rock_no_collide ; blt
|
||||
|
||||
rock_yes_collide:
|
||||
sec
|
||||
rts
|
||||
|
||||
rock_no_collide:
|
||||
clc
|
||||
rts
|
||||
|
||||
;=================================
|
||||
; little rock collision
|
||||
; Arkansas here we come
|
||||
|
||||
little_rock_collide:
|
||||
|
||||
; little rock is 2x14
|
||||
; peasant is 3x30
|
||||
|
||||
; doing a sort of Minkowski Sum collision detection here
|
||||
; with the rectangular regions
|
||||
|
||||
; if (PEASANT_X >= rock_x+2) no collide
|
||||
|
||||
; rr
|
||||
; ppp
|
||||
|
||||
lda rock_x,X
|
||||
sta TEMP_CENTER
|
||||
inc TEMP_CENTER ; rock_x+1
|
||||
inc TEMP_CENTER ; rock_x+2
|
||||
|
||||
sec
|
||||
lda PEASANT_X ; A is PEASANT_X
|
||||
cmp TEMP_CENTER ; compare with rock_x+1
|
||||
bcs rock_no_collide ; bge
|
||||
|
||||
|
||||
; if (PEASANT_X+3<rock_x)
|
||||
; if (PEASANT_X+5<rock_x+2)
|
||||
|
||||
; rrzz
|
||||
; pppzz
|
||||
|
||||
; carry clear here
|
||||
adc #5 ; A is now PEASANT_X+5
|
||||
cmp TEMP_CENTER ; rock_x+2
|
||||
bcc rock_no_collide ; blt
|
||||
|
||||
; bird = 16
|
||||
; big rock = 22
|
||||
; little rock = 14
|
||||
|
||||
; if (rock_y+7<PEASANT_Y-7) no_collide
|
||||
; equivalent, if (rock_y+14<PEASANT_Y)
|
||||
; equivalent, if (PEASANT_Y-7>=rock_y+7)
|
||||
|
||||
lda rock_y,X
|
||||
clc
|
||||
adc #7
|
||||
sta TEMP_CENTER
|
||||
|
||||
lda PEASANT_Y
|
||||
sec
|
||||
sbc #7 ; A is now PEASANT_Y-7
|
||||
cmp TEMP_CENTER
|
||||
bcs rock_no_collide ; blt
|
||||
|
||||
; if (rock_Y+7>=PEASANT_Y+37) no collide
|
||||
; equivalent, if (rock_y-30>=PEASANT_Y)
|
||||
; equivalent, if (PEASANT_Y+37<rock_y+7)
|
||||
|
||||
; carry clear here
|
||||
adc #27 ; A is now bird_y+30
|
||||
cmp TEMP_CENTER
|
||||
bcc rock_no_collide ; blt
|
||||
bcs rock_yes_collide ; bra
|
||||
|
Loading…
x
Reference in New Issue
Block a user