mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-03-06 03:29:46 +00:00
duke: redraw sprites, and more sprites
a bit shorter which makes math easier
This commit is contained in:
parent
67b78c5e1f
commit
75fcf81a91
@ -45,7 +45,7 @@ duke.o: duke.s zp.inc hardware.inc duke.s \
|
||||
print_help.s gr_fast_clear.s \
|
||||
graphics/duke_graphics.inc \
|
||||
maps/level1_map.lzsa \
|
||||
status_bar.s draw_duke.s gr_putsprite_crop.s \
|
||||
status_bar.s draw_duke.s move_duke.s gr_putsprite_crop.s \
|
||||
draw_tilemap.s \
|
||||
sound_effects.s \
|
||||
keyboard.s handle_laser.s
|
||||
|
470
duke/draw_duke.s
470
duke/draw_duke.s
@ -1,301 +1,4 @@
|
||||
|
||||
DUKE_SPEED = $80
|
||||
|
||||
;=========================
|
||||
; move duke
|
||||
;=========================
|
||||
move_duke:
|
||||
|
||||
jsr duke_get_feet_location ; get location of feet
|
||||
|
||||
jsr check_falling ; check for/handle falling
|
||||
|
||||
jsr duke_collide ; check for right/left collision
|
||||
|
||||
jsr handle_jumping ; handle jumping
|
||||
|
||||
lda DUKE_WALKING
|
||||
beq done_move_duke
|
||||
|
||||
lda DUKE_DIRECTION
|
||||
bmi move_left
|
||||
|
||||
lda DUKE_X
|
||||
cmp #22
|
||||
bcc duke_walk_right
|
||||
|
||||
duke_scroll_right:
|
||||
|
||||
clc
|
||||
lda DUKE_XL
|
||||
adc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcc skip_duke_scroll_right
|
||||
|
||||
inc TILEMAP_X
|
||||
|
||||
jsr copy_tilemap_subset
|
||||
|
||||
skip_duke_scroll_right:
|
||||
|
||||
jmp done_move_duke
|
||||
|
||||
duke_walk_right:
|
||||
lda DUKE_XL
|
||||
clc
|
||||
adc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcc dwr_noflo
|
||||
inc DUKE_X
|
||||
dwr_noflo:
|
||||
jmp done_move_duke
|
||||
|
||||
move_left:
|
||||
|
||||
lda DUKE_X
|
||||
cmp #14
|
||||
bcs duke_walk_left
|
||||
|
||||
duke_scroll_left:
|
||||
|
||||
sec
|
||||
lda DUKE_XL
|
||||
sbc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcs skip_duke_scroll_left
|
||||
|
||||
dec TILEMAP_X
|
||||
|
||||
jsr copy_tilemap_subset
|
||||
|
||||
skip_duke_scroll_left:
|
||||
|
||||
jmp done_move_duke
|
||||
|
||||
duke_walk_left:
|
||||
|
||||
lda DUKE_XL
|
||||
sec
|
||||
sbc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcs dwl_noflo
|
||||
dec DUKE_X
|
||||
dwl_noflo:
|
||||
jmp done_move_duke
|
||||
|
||||
done_move_duke:
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;=========================
|
||||
; duke collide
|
||||
;=========================
|
||||
; only check above head if jumping
|
||||
|
||||
duke_collide:
|
||||
|
||||
lda DUKE_DIRECTION
|
||||
beq done_duke_collide
|
||||
|
||||
bmi check_left_collide
|
||||
|
||||
check_right_collide:
|
||||
lda DUKE_FOOT_OFFSET
|
||||
clc
|
||||
adc #1 ; underfoot is on next row (+16)
|
||||
|
||||
tax
|
||||
lda TILEMAP,X
|
||||
|
||||
; if tile# < 32 then we are fine
|
||||
cmp #32
|
||||
bcc done_duke_collide ; blt
|
||||
|
||||
lda #0 ;
|
||||
sta DUKE_WALKING
|
||||
jmp done_duke_collide
|
||||
|
||||
check_left_collide:
|
||||
|
||||
lda DUKE_FOOT_OFFSET
|
||||
sec
|
||||
sbc #1 ; underfoot is on next row (+16)
|
||||
|
||||
tax
|
||||
lda TILEMAP,X
|
||||
|
||||
; if tile# < 32 then we are fine
|
||||
cmp #32
|
||||
bcc done_duke_collide ; blt
|
||||
|
||||
lda #0 ;
|
||||
sta DUKE_WALKING
|
||||
jmp done_duke_collide
|
||||
|
||||
done_duke_collide:
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;=========================
|
||||
; check_jumping
|
||||
;=========================
|
||||
handle_jumping:
|
||||
|
||||
lda DUKE_JUMPING
|
||||
beq done_handle_jumping
|
||||
|
||||
dec DUKE_Y
|
||||
dec DUKE_Y
|
||||
dec DUKE_JUMPING
|
||||
bne done_handle_jumping
|
||||
lda #1 ; avoid gap before falling triggered
|
||||
sta DUKE_FALLING
|
||||
|
||||
|
||||
done_handle_jumping:
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
;=======================
|
||||
; duke_get_feet_location
|
||||
;=======================
|
||||
|
||||
; xx 0
|
||||
; xx 1
|
||||
; xx 0 xx 2
|
||||
; xx 1 xx 3
|
||||
;------ -----
|
||||
; xx 2 xx 4
|
||||
; xx 3 xx 5
|
||||
; xx 4 xx 6
|
||||
; xx 5 xx 7
|
||||
;------ -------
|
||||
; xx 6 xx 8
|
||||
; xx 7 xx 9
|
||||
; xx 8
|
||||
; xx 9
|
||||
;-----------------------
|
||||
duke_get_feet_location:
|
||||
|
||||
; this is tricky as we are 10 tall but tiles are 4 tall
|
||||
|
||||
; + 1 is because sprite is 4 pixels wide?
|
||||
|
||||
; screen is 16 wide, but ofsset 4 in
|
||||
|
||||
; block index of foot is (feet approximately 8 lower than Y)
|
||||
; INT((y+8)/4)*16 + (x-4+1/2)
|
||||
|
||||
; if 18,18 -> INT(26/4)*16 = 96 + 7 = 103 = 6R7
|
||||
|
||||
; 0 = 32 (2)
|
||||
; 1 = 32 (2)
|
||||
; 2 = 32 (2)
|
||||
; 3 = 32 (2)
|
||||
; 4 = 48 (3)
|
||||
; 5 = 48 (3)
|
||||
; 6 = 48 (3)
|
||||
; 7 = 48 (3)
|
||||
|
||||
lda DUKE_Y
|
||||
|
||||
clc
|
||||
adc #6 ; +8
|
||||
|
||||
lsr ; / 4 (INT)
|
||||
lsr
|
||||
|
||||
asl ; *4
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
|
||||
sta DUKE_FOOT_OFFSET
|
||||
|
||||
sec
|
||||
lda DUKE_X
|
||||
sbc #3
|
||||
lsr ; (x-3)/2
|
||||
|
||||
clc
|
||||
adc DUKE_FOOT_OFFSET
|
||||
sta DUKE_FOOT_OFFSET
|
||||
|
||||
rts
|
||||
|
||||
|
||||
;=========================
|
||||
; check_falling
|
||||
;=========================
|
||||
check_falling:
|
||||
|
||||
lda DUKE_JUMPING
|
||||
bne done_check_falling ; don't check falling if jumping
|
||||
|
||||
lda DUKE_FOOT_OFFSET
|
||||
clc
|
||||
adc #16 ; underfoot is on next row (+16)
|
||||
|
||||
tax
|
||||
lda TILEMAP,X
|
||||
|
||||
; if tile# < 32 then we fall
|
||||
cmp #32
|
||||
bcs feet_on_ground ; bge
|
||||
|
||||
;=======================
|
||||
; falling
|
||||
|
||||
lda #1
|
||||
sta DUKE_FALLING
|
||||
|
||||
; scroll but only if Y>=18
|
||||
|
||||
lda DUKE_Y
|
||||
cmp #18
|
||||
bcs scroll_fall ; bge
|
||||
|
||||
inc DUKE_Y
|
||||
inc DUKE_Y
|
||||
jmp done_check_falling
|
||||
|
||||
|
||||
scroll_fall:
|
||||
inc TILEMAP_Y
|
||||
|
||||
jsr copy_tilemap_subset
|
||||
jmp done_check_falling
|
||||
|
||||
feet_on_ground:
|
||||
|
||||
; clear falling
|
||||
lda #0
|
||||
sta DUKE_FALLING
|
||||
|
||||
; check to see if Y still hi, if so scroll back down
|
||||
|
||||
lda DUKE_Y
|
||||
cmp #18
|
||||
bcs done_check_falling ; bge
|
||||
|
||||
; too high up on screen, adjust down and also adjust tilemap down
|
||||
|
||||
inc DUKE_Y
|
||||
inc DUKE_Y
|
||||
dec TILEMAP_Y ; share w above?
|
||||
jsr copy_tilemap_subset
|
||||
|
||||
done_check_falling:
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
;=========================
|
||||
; draw duke
|
||||
;=========================
|
||||
@ -309,35 +12,176 @@ draw_duke:
|
||||
lda DUKE_DIRECTION
|
||||
bmi duke_facing_left
|
||||
|
||||
lda #<duke_sprite_stand_right
|
||||
sta INL
|
||||
;=========================
|
||||
; facing right
|
||||
|
||||
duke_facing_right:
|
||||
|
||||
check_falling_right:
|
||||
lda DUKE_FALLING
|
||||
beq check_jumping_right
|
||||
draw_falling_right:
|
||||
ldx #<duke_sprite_falling_right
|
||||
lda #>duke_sprite_falling_right
|
||||
jmp actually_draw_duke
|
||||
|
||||
check_jumping_right:
|
||||
lda DUKE_JUMPING
|
||||
beq check_shooting_right
|
||||
draw_jumping_right:
|
||||
ldx #<duke_sprite_jumping_right
|
||||
lda #>duke_sprite_jumping_right
|
||||
jmp actually_draw_duke
|
||||
|
||||
check_shooting_right:
|
||||
lda DUKE_SHOOTING
|
||||
beq check_walking_right
|
||||
draw_shooting_right:
|
||||
ldx #<duke_sprite_shooting_right
|
||||
lda #>duke_sprite_shooting_right
|
||||
jmp actually_draw_duke
|
||||
|
||||
check_walking_right:
|
||||
lda DUKE_WALKING
|
||||
beq draw_standing_right
|
||||
draw_walking_right:
|
||||
lda FRAMEL
|
||||
and #$02
|
||||
beq draw_standing_right
|
||||
|
||||
ldx #<duke_sprite_walking_right
|
||||
lda #>duke_sprite_walking_right
|
||||
jmp actually_draw_duke
|
||||
|
||||
draw_standing_right:
|
||||
ldx #<duke_sprite_stand_right
|
||||
lda #>duke_sprite_stand_right
|
||||
jmp actually_draw_duke
|
||||
|
||||
|
||||
;==================
|
||||
; facing left
|
||||
duke_facing_left:
|
||||
|
||||
lda #<duke_sprite_stand_left
|
||||
sta INL
|
||||
check_falling_left:
|
||||
lda DUKE_FALLING
|
||||
beq check_jumping_left
|
||||
draw_falling_left:
|
||||
ldx #<duke_sprite_falling_left
|
||||
lda #>duke_sprite_falling_left
|
||||
jmp actually_draw_duke
|
||||
|
||||
check_jumping_left:
|
||||
lda DUKE_JUMPING
|
||||
beq check_shooting_left
|
||||
draw_jumping_left:
|
||||
ldx #<duke_sprite_jumping_left
|
||||
lda #>duke_sprite_jumping_left
|
||||
jmp actually_draw_duke
|
||||
|
||||
check_shooting_left:
|
||||
lda DUKE_SHOOTING
|
||||
beq check_walking_left
|
||||
draw_shooting_left:
|
||||
ldx #<duke_sprite_shooting_left
|
||||
lda #>duke_sprite_shooting_left
|
||||
jmp actually_draw_duke
|
||||
|
||||
check_walking_left:
|
||||
lda DUKE_WALKING
|
||||
beq draw_standing_left
|
||||
draw_walking_left:
|
||||
lda FRAMEL
|
||||
and #$02
|
||||
beq draw_standing_left
|
||||
|
||||
ldx #<duke_sprite_walking_left
|
||||
lda #>duke_sprite_walking_left
|
||||
jmp actually_draw_duke
|
||||
|
||||
draw_standing_left:
|
||||
ldx #<duke_sprite_stand_left
|
||||
lda #>duke_sprite_stand_left
|
||||
jmp actually_draw_duke
|
||||
|
||||
|
||||
;====================
|
||||
; actually draw
|
||||
|
||||
actually_draw_duke:
|
||||
stx INL
|
||||
sta INH
|
||||
jsr put_sprite_crop
|
||||
|
||||
rts
|
||||
|
||||
duke_sprite_stand_right:
|
||||
.byte 4,5
|
||||
.byte $AA,$dA,$dA,$AA
|
||||
.byte $AA,$dd,$bb,$AA
|
||||
.byte $AA,$b3,$7A,$7A
|
||||
.byte $AA,$66,$6b,$AA
|
||||
.byte $AA,$56,$65,$AA
|
||||
.byte 4,4
|
||||
.byte $AA,$dd,$bd,$AA
|
||||
.byte $AA,$3d,$Ab,$AA
|
||||
.byte $AA,$6b,$b7,$A7
|
||||
.byte $AA,$56,$56,$AA
|
||||
|
||||
duke_sprite_stand_left:
|
||||
.byte 4,5
|
||||
.byte $AA,$dA,$dA,$AA
|
||||
.byte $AA,$bb,$dd,$AA
|
||||
.byte $7A,$7A,$b3,$AA
|
||||
.byte $AA,$6b,$66,$AA
|
||||
.byte $AA,$65,$56,$AA
|
||||
.byte 4,4
|
||||
.byte $AA,$bd,$dd,$AA
|
||||
.byte $AA,$Ab,$3d,$AA
|
||||
.byte $A7,$b7,$6b,$AA
|
||||
.byte $AA,$56,$56,$AA
|
||||
|
||||
duke_sprite_walking_right:
|
||||
.byte 4,4
|
||||
.byte $AA,$dd,$bd,$AA
|
||||
.byte $AA,$3d,$Ab,$AA
|
||||
.byte $AA,$6b,$b7,$A7
|
||||
.byte $56,$A6,$A6,$5A
|
||||
|
||||
duke_sprite_walking_left:
|
||||
.byte 4,4
|
||||
.byte $AA,$bd,$dd,$AA
|
||||
.byte $AA,$Ab,$3d,$AA
|
||||
.byte $A7,$b7,$6b,$AA
|
||||
.byte $5A,$A6,$A6,$56
|
||||
|
||||
duke_sprite_jumping_right:
|
||||
.byte 4,4
|
||||
.byte $AA,$dd,$bd,$AA
|
||||
.byte $AA,$3d,$Ab,$AA
|
||||
.byte $AA,$6b,$b7,$A7
|
||||
.byte $55,$A6,$AA,$AA
|
||||
|
||||
duke_sprite_jumping_left:
|
||||
.byte 4,4
|
||||
.byte $AA,$bd,$dd,$AA
|
||||
.byte $AA,$Ab,$3d,$AA
|
||||
.byte $A7,$b7,$6b,$AA
|
||||
.byte $AA,$AA,$A6,$55
|
||||
|
||||
duke_sprite_falling_right:
|
||||
.byte 4,4
|
||||
.byte $AA,$dd,$bd,$AA
|
||||
.byte $AA,$3d,$Ab,$AA
|
||||
.byte $AA,$6b,$67,$A7
|
||||
.byte $5A,$A6,$56,$AA
|
||||
|
||||
duke_sprite_falling_left:
|
||||
.byte 4,4
|
||||
.byte $AA,$bd,$dd,$AA
|
||||
.byte $AA,$Ab,$3d,$AA
|
||||
.byte $A7,$67,$6b,$AA
|
||||
.byte $AA,$56,$A6,$5A
|
||||
|
||||
duke_sprite_shooting_right:
|
||||
.byte 4,4
|
||||
.byte $AA,$dd,$bd,$AA
|
||||
.byte $AA,$d3,$Ab,$AA
|
||||
.byte $AA,$b7,$A7,$AA
|
||||
.byte $AA,$56,$56,$AA
|
||||
|
||||
duke_sprite_shooting_left:
|
||||
.byte 4,4
|
||||
.byte $AA,$bd,$dd,$AA
|
||||
.byte $AA,$Ab,$d3,$AA
|
||||
.byte $AA,$A7,$b7,$AA
|
||||
.byte $AA,$56,$56,$AA
|
||||
|
||||
|
14
duke/duke.s
14
duke/duke.s
@ -42,6 +42,7 @@ duke_start:
|
||||
sta SCORE2
|
||||
sta INVENTORY
|
||||
sta DUKE_FALLING
|
||||
sta DUKE_SHOOTING
|
||||
|
||||
lda #$10
|
||||
sta SCORE0
|
||||
@ -136,6 +137,16 @@ duke_loop:
|
||||
|
||||
jsr move_laser
|
||||
|
||||
|
||||
;========================
|
||||
; increment frame count
|
||||
;========================
|
||||
|
||||
inc FRAMEL
|
||||
bne no_frame_oflo
|
||||
inc FRAMEH
|
||||
no_frame_oflo:
|
||||
|
||||
;===========================
|
||||
; check end of level
|
||||
;===========================
|
||||
@ -146,6 +157,8 @@ duke_loop:
|
||||
jmp done_with_duke
|
||||
|
||||
|
||||
|
||||
|
||||
do_duke_loop:
|
||||
|
||||
; delay
|
||||
@ -181,6 +194,7 @@ done_with_duke:
|
||||
.include "print_help.s"
|
||||
|
||||
.include "draw_duke.s"
|
||||
.include "move_duke.s"
|
||||
.include "handle_laser.s"
|
||||
.include "draw_tilemap.s"
|
||||
|
||||
|
@ -56,5 +56,6 @@ done_draw_laser:
|
||||
|
||||
laser_sideways_sprite:
|
||||
.byte 4,1
|
||||
.byte $3A,$cA,$3A,$cA
|
||||
; .byte $3A,$cA,$3A,$cA
|
||||
.byte $A3,$Ac,$A3,$Ac
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
JUMP_HEIGHT = 9
|
||||
|
||||
;==============================
|
||||
; Handle Keypress
|
||||
@ -195,7 +196,7 @@ space_pressed:
|
||||
lda DUKE_FALLING
|
||||
bne done_keypress ; don't jump if falling
|
||||
|
||||
lda #7
|
||||
lda #JUMP_HEIGHT
|
||||
sta DUKE_JUMPING
|
||||
|
||||
jsr jump_noise
|
||||
@ -226,7 +227,7 @@ laser_left:
|
||||
laser_right:
|
||||
lda DUKE_X
|
||||
clc
|
||||
adc #3
|
||||
adc #2
|
||||
|
||||
laser_assign:
|
||||
sta LASER_X
|
||||
|
295
duke/move_duke.s
Normal file
295
duke/move_duke.s
Normal file
@ -0,0 +1,295 @@
|
||||
|
||||
DUKE_SPEED = $80
|
||||
|
||||
YDEFAULT = 20
|
||||
|
||||
;=========================
|
||||
; move duke
|
||||
;=========================
|
||||
move_duke:
|
||||
|
||||
jsr duke_get_feet_location ; get location of feet
|
||||
|
||||
jsr check_falling ; check for/handle falling
|
||||
|
||||
jsr duke_collide ; check for right/left collision
|
||||
|
||||
jsr handle_jumping ; handle jumping
|
||||
|
||||
lda DUKE_WALKING
|
||||
beq done_move_duke
|
||||
|
||||
lda DUKE_DIRECTION
|
||||
bmi move_left
|
||||
|
||||
lda DUKE_X
|
||||
cmp #22
|
||||
bcc duke_walk_right
|
||||
|
||||
duke_scroll_right:
|
||||
|
||||
clc
|
||||
lda DUKE_XL
|
||||
adc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcc skip_duke_scroll_right
|
||||
|
||||
inc TILEMAP_X
|
||||
|
||||
jsr copy_tilemap_subset
|
||||
|
||||
skip_duke_scroll_right:
|
||||
|
||||
jmp done_move_duke
|
||||
|
||||
duke_walk_right:
|
||||
lda DUKE_XL
|
||||
clc
|
||||
adc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcc dwr_noflo
|
||||
inc DUKE_X
|
||||
dwr_noflo:
|
||||
jmp done_move_duke
|
||||
|
||||
move_left:
|
||||
|
||||
lda DUKE_X
|
||||
cmp #14
|
||||
bcs duke_walk_left
|
||||
|
||||
duke_scroll_left:
|
||||
|
||||
sec
|
||||
lda DUKE_XL
|
||||
sbc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcs skip_duke_scroll_left
|
||||
|
||||
dec TILEMAP_X
|
||||
|
||||
jsr copy_tilemap_subset
|
||||
|
||||
skip_duke_scroll_left:
|
||||
|
||||
jmp done_move_duke
|
||||
|
||||
duke_walk_left:
|
||||
|
||||
lda DUKE_XL
|
||||
sec
|
||||
sbc #DUKE_SPEED
|
||||
sta DUKE_XL
|
||||
bcs dwl_noflo
|
||||
dec DUKE_X
|
||||
dwl_noflo:
|
||||
jmp done_move_duke
|
||||
|
||||
done_move_duke:
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;=========================
|
||||
; duke collide
|
||||
;=========================
|
||||
; only check above head if jumping
|
||||
|
||||
duke_collide:
|
||||
|
||||
lda DUKE_DIRECTION
|
||||
beq done_duke_collide
|
||||
|
||||
bmi check_left_collide
|
||||
|
||||
check_right_collide:
|
||||
lda DUKE_FOOT_OFFSET
|
||||
clc
|
||||
adc #1 ; underfoot is on next row (+16)
|
||||
|
||||
tax
|
||||
lda TILEMAP,X
|
||||
|
||||
; if tile# < 32 then we are fine
|
||||
cmp #32
|
||||
bcc done_duke_collide ; blt
|
||||
|
||||
lda #0 ;
|
||||
sta DUKE_WALKING
|
||||
jmp done_duke_collide
|
||||
|
||||
check_left_collide:
|
||||
|
||||
lda DUKE_FOOT_OFFSET
|
||||
sec
|
||||
sbc #1 ; underfoot is on next row (+16)
|
||||
|
||||
tax
|
||||
lda TILEMAP,X
|
||||
|
||||
; if tile# < 32 then we are fine
|
||||
cmp #32
|
||||
bcc done_duke_collide ; blt
|
||||
|
||||
lda #0 ;
|
||||
sta DUKE_WALKING
|
||||
jmp done_duke_collide
|
||||
|
||||
done_duke_collide:
|
||||
rts
|
||||
|
||||
|
||||
|
||||
;=========================
|
||||
; check_jumping
|
||||
;=========================
|
||||
handle_jumping:
|
||||
|
||||
lda DUKE_JUMPING
|
||||
beq done_handle_jumping
|
||||
|
||||
dec DUKE_Y
|
||||
dec DUKE_Y
|
||||
dec DUKE_JUMPING
|
||||
bne done_handle_jumping
|
||||
lda #1 ; avoid gap before falling triggered
|
||||
sta DUKE_FALLING
|
||||
|
||||
|
||||
done_handle_jumping:
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
;=======================
|
||||
; duke_get_feet_location
|
||||
;=======================
|
||||
|
||||
; xx 0
|
||||
; xx 1
|
||||
;------ -----
|
||||
; xx 0 xx 2
|
||||
; xx 1 xx 3
|
||||
; xx 2 xx 4
|
||||
; xx 3 xx 5
|
||||
;------ -------
|
||||
; xx 4 xx 6
|
||||
; xx 5 xx 7
|
||||
; xx 6
|
||||
; xx 7
|
||||
;-----------------------
|
||||
duke_get_feet_location:
|
||||
|
||||
; + 1 is because sprite is 4 pixels wide?
|
||||
|
||||
; screen is 16 wide, but ofsset 4 in
|
||||
|
||||
; block index of foot is (feet approximately 8 lower than Y)
|
||||
; INT((y+4)/4)*16 + (x-4+1/2)
|
||||
|
||||
; FIXME: if 18,18 -> INT(26/4)*16 = 96 + 7 = 103 = 6R7
|
||||
|
||||
; 0 = 32 (2)
|
||||
; 1 = 32 (2)
|
||||
; 2 = 32 (2)
|
||||
; 3 = 32 (2)
|
||||
; 4 = 48 (3)
|
||||
; 5 = 48 (3)
|
||||
; 6 = 48 (3)
|
||||
; 7 = 48 (3)
|
||||
|
||||
lda DUKE_Y
|
||||
|
||||
clc
|
||||
adc #6 ; +4
|
||||
|
||||
lsr ; / 4 (INT)
|
||||
lsr
|
||||
|
||||
asl ; *4
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
|
||||
sta DUKE_FOOT_OFFSET
|
||||
|
||||
sec
|
||||
lda DUKE_X
|
||||
sbc #3
|
||||
lsr ; (x-3)/2
|
||||
|
||||
clc
|
||||
adc DUKE_FOOT_OFFSET
|
||||
sta DUKE_FOOT_OFFSET
|
||||
|
||||
rts
|
||||
|
||||
|
||||
;=========================
|
||||
; check_falling
|
||||
;=========================
|
||||
check_falling:
|
||||
|
||||
lda DUKE_JUMPING
|
||||
bne done_check_falling ; don't check falling if jumping
|
||||
|
||||
lda DUKE_FOOT_OFFSET
|
||||
clc
|
||||
adc #16 ; underfoot is on next row (+16)
|
||||
|
||||
tax
|
||||
lda TILEMAP,X
|
||||
|
||||
; if tile# < 32 then we fall
|
||||
cmp #32
|
||||
bcs feet_on_ground ; bge
|
||||
|
||||
;=======================
|
||||
; falling
|
||||
|
||||
lda #1
|
||||
sta DUKE_FALLING
|
||||
|
||||
; scroll but only if Y>=20 (YDEFAULT)
|
||||
|
||||
lda DUKE_Y
|
||||
cmp #YDEFAULT
|
||||
bcs scroll_fall ; bge
|
||||
|
||||
inc DUKE_Y
|
||||
inc DUKE_Y
|
||||
jmp done_check_falling
|
||||
|
||||
|
||||
scroll_fall:
|
||||
inc TILEMAP_Y
|
||||
|
||||
jsr copy_tilemap_subset
|
||||
jmp done_check_falling
|
||||
|
||||
feet_on_ground:
|
||||
|
||||
; clear falling
|
||||
lda #0
|
||||
sta DUKE_FALLING
|
||||
|
||||
; check to see if Y still hi, if so scroll back down
|
||||
|
||||
lda DUKE_Y
|
||||
cmp #YDEFAULT
|
||||
bcs done_check_falling ; bge
|
||||
|
||||
; too high up on screen, adjust down and also adjust tilemap down
|
||||
|
||||
inc DUKE_Y
|
||||
inc DUKE_Y
|
||||
dec TILEMAP_Y ; share w above?
|
||||
jsr copy_tilemap_subset
|
||||
|
||||
done_check_falling:
|
||||
rts
|
||||
|
||||
|
||||
|
@ -108,6 +108,7 @@ SCORE2 = $93
|
||||
UPDATE_STATUS = $94
|
||||
|
||||
DUKE_FALLING = $95
|
||||
DUKE_SHOOTING = $96
|
||||
|
||||
; done game puzzle state
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user