dos33fsprogs/games/peasant/move_peasant.s

247 lines
3.3 KiB
ArmAsm
Raw Permalink Normal View History

2021-08-24 17:52:11 +00:00
; Move that Peasant!
move_peasant:
; redraw peasant if moved
lda PEASANT_XADD
ora PEASANT_YADD
2021-08-24 18:32:04 +00:00
bne really_move_peasant
jmp peasant_the_same
really_move_peasant:
2021-08-24 17:52:11 +00:00
; restore bg behind peasant
2022-02-21 06:48:48 +00:00
jsr erase_peasant
;=========================
;=========================
; move peasant
;=========================
;=========================
2021-08-24 17:52:11 +00:00
;==========================
; first move in X direction
2021-08-24 17:52:11 +00:00
clc
lda PEASANT_X
2021-08-24 18:32:04 +00:00
adc PEASANT_XADD ; A = new X
bmi peasant_x_negative ; if newx <0, handle
2021-08-24 17:52:11 +00:00
cmp #40
2021-08-24 18:32:04 +00:00
bcs peasant_x_toobig ; if newx>=40, hanfle (bge)
;======================================
; not off screen, so check if collision
2021-08-24 18:32:04 +00:00
pha
tay
2021-12-24 06:00:22 +00:00
; FIXME: should we add YADD first, like we do in peasant_move_tiny?
2021-08-24 18:32:04 +00:00
ldx PEASANT_Y
jsr peasant_collide
pla
bcc do_move_peasant_y ; no X collide
2021-08-24 18:32:04 +00:00
;==================================
; we collided in X, so stop moving
2021-08-24 18:32:04 +00:00
jsr stop_peasant ; stop moving
2021-08-24 18:32:04 +00:00
; leave PEASANT_X same as was
lda PEASANT_X
jmp do_move_peasant_y
2021-08-24 17:52:11 +00:00
;============================
peasant_x_toobig:
jsr move_map_east
2021-08-24 17:52:11 +00:00
lda #0 ; new X location
jmp done_movex
;============================
peasant_x_negative:
jsr move_map_west
2021-08-24 17:52:11 +00:00
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
2021-08-24 17:52:11 +00:00
; Move Peasant Y
do_move_peasant_y:
sta PEASANT_X
2021-08-24 17:52:11 +00:00
clc
lda PEASANT_Y
2021-08-24 18:32:04 +00:00
adc PEASANT_YADD ; newy in A
cmp #45 ; if <45 then off screen
2021-08-24 17:52:11 +00:00
bcc peasant_y_negative ; blt
2021-08-24 18:32:04 +00:00
cmp #160 ; if >=150 then off screen
2021-08-24 17:52:11 +00:00
bcs peasant_y_toobig ; bge
2021-08-24 18:32:04 +00:00
; 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
2021-08-24 17:52:11 +00:00
;============================
peasant_y_toobig:
jsr move_map_south
2021-08-24 17:52:11 +00:00
lda #45 ; new X location
jmp done_movey
;============================
peasant_y_negative:
jsr move_map_north
2021-08-24 17:52:11 +00:00
lda #160 ; new X location
2021-08-24 17:52:11 +00:00
jmp done_movey
; check edge of screen
done_movey:
sta PEASANT_Y
; if we moved off screen, don't re-draw peasant ?
2021-08-24 17:52:11 +00:00
peasant_the_same:
rts
2021-08-24 18:32:04 +00:00
2022-02-21 06:48:48 +00:00
;===========================
; erase peasant
;===========================
; restore bg behind peasant
erase_peasant:
lda PEASANT_Y
sta SAVED_Y1
clc
adc #28
sta SAVED_Y2
ldx PEASANT_X
txa
inx
jmp hgr_partial_restore ; tail call
2021-08-24 18:32:04 +00:00
; 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
2021-08-24 18:32:04 +00:00
and MASK
; ldy MASK
; cpy #$f0
; beq in_top
;in_bottom:
; and #$0f
; jmp done_feet
;in_top:
; lsr
; lsr
; lsr
; lsr
;done_feet:
2021-08-24 18:32:04 +00:00
beq collide_true ; true if color 0
;bne collide_false
collide_false:
clc
rts
collide_true:
sec
rts
.include "gr_offsets.s"