duke: redraw sprites, and more sprites

a bit shorter which makes math easier
This commit is contained in:
Vince Weaver 2020-12-14 16:01:47 -05:00
parent 67b78c5e1f
commit 75fcf81a91
7 changed files with 473 additions and 317 deletions

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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
View 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

View File

@ -108,6 +108,7 @@ SCORE2 = $93
UPDATE_STATUS = $94
DUKE_FALLING = $95
DUKE_SHOOTING = $96
; done game puzzle state