mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-01-22 19:31:58 +00:00
c8f2973d96
longstanding bug, problem was we did a collision check *after* wrapping X position and moving to next room so we were colliding with the far side of the screen and somtimes stopping unnecessarily
238 lines
3.2 KiB
ArmAsm
238 lines
3.2 KiB
ArmAsm
; Move that Peasant!
|
|
|
|
move_peasant:
|
|
|
|
; redraw peasant if moved
|
|
|
|
lda PEASANT_XADD
|
|
ora PEASANT_YADD
|
|
bne really_move_peasant
|
|
|
|
jmp peasant_the_same
|
|
|
|
really_move_peasant:
|
|
|
|
; restore bg behind peasant
|
|
|
|
lda PEASANT_Y
|
|
sta SAVED_Y1
|
|
clc
|
|
adc #28
|
|
sta SAVED_Y2
|
|
|
|
ldx PEASANT_X
|
|
txa
|
|
inx
|
|
|
|
jsr hgr_partial_restore
|
|
|
|
|
|
;=========================
|
|
;=========================
|
|
; move peasant
|
|
;=========================
|
|
;=========================
|
|
|
|
|
|
;==========================
|
|
; first move in X direction
|
|
|
|
clc
|
|
lda PEASANT_X
|
|
adc PEASANT_XADD ; A = new X
|
|
|
|
bmi peasant_x_negative ; if newx <0, handle
|
|
|
|
cmp #40
|
|
bcs peasant_x_toobig ; if newx>=40, hanfle (bge)
|
|
|
|
|
|
;======================================
|
|
; not off screen, so check if collision
|
|
|
|
pha
|
|
|
|
tay
|
|
; FIXME: should we add YADD first, like we do in peasant_move_tiny?
|
|
|
|
ldx PEASANT_Y
|
|
jsr peasant_collide
|
|
|
|
pla
|
|
|
|
bcc do_move_peasant_y ; no X collide
|
|
|
|
;==================================
|
|
; we collided in X, so stop moving
|
|
|
|
jsr stop_peasant ; stop moving
|
|
|
|
; leave PEASANT_X same as was
|
|
lda PEASANT_X
|
|
jmp do_move_peasant_y
|
|
|
|
;============================
|
|
peasant_x_toobig:
|
|
|
|
jsr move_map_east
|
|
|
|
lda #0 ; new X location
|
|
|
|
jmp done_movex
|
|
|
|
;============================
|
|
peasant_x_negative:
|
|
|
|
jsr move_map_west
|
|
|
|
lda #39 ; new X location
|
|
|
|
jmp done_movex
|
|
|
|
; check edge of screen
|
|
done_movex:
|
|
; if we get here we changed screens
|
|
sta PEASANT_X ; update new location
|
|
jmp peasant_the_same ; skip checking for Y collision
|
|
|
|
|
|
|
|
; Move Peasant Y
|
|
do_move_peasant_y:
|
|
sta PEASANT_X
|
|
clc
|
|
lda PEASANT_Y
|
|
adc PEASANT_YADD ; newy in A
|
|
|
|
cmp #45 ; if <45 then off screen
|
|
bcc peasant_y_negative ; blt
|
|
|
|
cmp #160 ; if >=150 then off screen
|
|
bcs peasant_y_toobig ; bge
|
|
|
|
; check collide
|
|
|
|
pha
|
|
|
|
ldy PEASANT_X
|
|
tax ; newy
|
|
jsr peasant_collide
|
|
|
|
pla
|
|
|
|
bcc done_movey ; no collide
|
|
|
|
jsr stop_peasant ; stop moving
|
|
|
|
lda PEASANT_Y ; leave same
|
|
|
|
jmp done_movey
|
|
|
|
|
|
;============================
|
|
peasant_y_toobig:
|
|
|
|
jsr move_map_south
|
|
|
|
lda #45 ; new X location
|
|
|
|
jmp done_movey
|
|
|
|
|
|
;============================
|
|
peasant_y_negative:
|
|
|
|
jsr move_map_north
|
|
|
|
lda #160 ; new X location
|
|
|
|
jmp done_movey
|
|
|
|
; check edge of screen
|
|
done_movey:
|
|
sta PEASANT_Y
|
|
|
|
; if we moved off screen, don't re-draw peasant ?
|
|
|
|
peasant_the_same:
|
|
|
|
rts
|
|
|
|
|
|
|
|
; when peasants collide
|
|
|
|
;===================
|
|
; peasant_collide
|
|
;===================
|
|
; newx/7 in Y
|
|
; newy in X
|
|
; returns C=0 if no collide
|
|
; C=1 if collide
|
|
peasant_collide:
|
|
; rrrr rtii top 5 bits row, bit 2 top/bottom
|
|
|
|
; add 28 to collide with feet
|
|
txa
|
|
clc
|
|
adc #28
|
|
tax
|
|
|
|
txa
|
|
and #$04 ; see if odd/even
|
|
beq peasant_collide_even
|
|
|
|
peasant_collide_odd:
|
|
lda #$f0
|
|
bne peasant_collide_mask ; bra
|
|
|
|
peasant_collide_even:
|
|
lda #$0f
|
|
peasant_collide_mask:
|
|
|
|
sta MASK
|
|
|
|
txa
|
|
lsr
|
|
lsr ; need to divide by 8 then * 2
|
|
lsr ; can't just div by 4 as we need to mask bottom bit
|
|
asl
|
|
tax
|
|
|
|
lda gr_offsets,X
|
|
sta INL
|
|
lda gr_offsets+1,X
|
|
sta INH
|
|
|
|
lda (INL),Y ; get value
|
|
|
|
and MASK
|
|
|
|
; ldy MASK
|
|
; cpy #$f0
|
|
; beq in_top
|
|
;in_bottom:
|
|
; and #$0f
|
|
; jmp done_feet
|
|
;in_top:
|
|
; lsr
|
|
; lsr
|
|
; lsr
|
|
; lsr
|
|
;done_feet:
|
|
|
|
beq collide_true ; true if color 0
|
|
;bne collide_false
|
|
|
|
collide_false:
|
|
clc
|
|
rts
|
|
|
|
collide_true:
|
|
sec
|
|
rts
|
|
|
|
|
|
|
|
.include "gr_offsets.s"
|