dos33fsprogs/games/lemm/move_lemming.s

1084 lines
16 KiB
ArmAsm
Raw Permalink Normal View History

; autosized lemmings state based on compile-time MAX_LEMMINGS value
; currently 10
lemming_x: .res MAX_LEMMINGS,0
lemming_y: .res MAX_LEMMINGS,0
lemming_direction: .res MAX_LEMMINGS,0
lemming_out: .res MAX_LEMMINGS,0
lemming_frame: .res MAX_LEMMINGS,0
2022-04-13 03:21:51 +00:00
lemming_exploding_frame:.res MAX_LEMMINGS,0
lemming_status: .res MAX_LEMMINGS,0
lemming_exploding: .res MAX_LEMMINGS,0
lemming_fall_distance: .res MAX_LEMMINGS,0
lemming_attribute: .res MAX_LEMMINGS,0
2022-03-13 06:28:37 +00:00
;==========================
; move the lemmings
2022-03-13 06:28:37 +00:00
;==========================
2022-03-10 06:10:42 +00:00
move_lemmings:
2022-03-11 05:53:18 +00:00
ldy #0
2022-03-30 18:46:46 +00:00
sty CURRENT_LEMMING ; reset loop
2022-03-22 04:05:49 +00:00
move_lemming_loop:
2022-03-30 18:46:46 +00:00
ldy CURRENT_LEMMING ; get current in Y
2022-03-11 05:53:18 +00:00
lda lemming_out,Y
2022-03-10 06:10:42 +00:00
2022-03-30 18:46:46 +00:00
beq skip_move_lemming ; if not out, don't move
2022-03-11 05:53:18 +00:00
really_move_lemming:
2022-03-12 23:03:53 +00:00
; bump frame
tya
tax
2022-03-30 18:46:46 +00:00
inc lemming_frame,X ; only can inc with X
2022-03-12 23:03:53 +00:00
2022-03-30 18:46:46 +00:00
lda lemming_status,Y ; use jump table based on status
2022-03-27 18:05:47 +00:00
tax
lda move_lemming_jump_h,X
pha
lda move_lemming_jump_l,X
pha
rts ; jump to it
2022-03-27 18:05:47 +00:00
done_move_lemming:
2022-03-10 06:10:42 +00:00
; sanity boundary check, remove if X<0 or X>40 or Y<0 or Y>180
ldy CURRENT_LEMMING
lda lemming_x,Y
; bmi lemming_in_space
cmp #40
bcs lemming_in_space ; if negative wraps around to 255
lda lemming_y,Y
cmp #180 ; if negative, wraps around to 255
bcc lemming_in_bounds ; so we catch it with this check too
2022-03-13 21:18:19 +00:00
lemming_in_space:
clc
jsr remove_lemming
lemming_in_bounds:
skip_move_lemming:
2022-03-30 18:46:46 +00:00
inc CURRENT_LEMMING ; loop until done
2022-03-27 18:05:47 +00:00
lda CURRENT_LEMMING
cmp #MAX_LEMMINGS
2022-03-30 18:46:46 +00:00
bne move_lemming_loop
2022-03-27 18:05:47 +00:00
really_done_checking_lemming:
rts
move_lemming_jump_l:
.byte <(do_lemming_falling-1)
.byte <(do_lemming_walking-1)
.byte <(do_lemming_digging-1)
.byte <(do_lemming_exploding-1)
.byte <(do_lemming_particles-1)
.byte <(do_lemming_splatting-1)
.byte <(do_lemming_floating-1)
.byte <(do_lemming_climbing-1)
.byte <(do_lemming_bashing-1)
.byte <(do_lemming_stopping-1)
.byte <(do_lemming_mining-1)
.byte <(do_lemming_building-1)
.byte <(do_lemming_shrugging-1)
.byte <(do_lemming_pullup-1)
move_lemming_jump_h:
.byte >(do_lemming_falling-1)
.byte >(do_lemming_walking-1)
.byte >(do_lemming_digging-1)
.byte >(do_lemming_exploding-1)
.byte >(do_lemming_particles-1)
.byte >(do_lemming_splatting-1)
.byte >(do_lemming_floating-1)
.byte >(do_lemming_climbing-1)
.byte >(do_lemming_bashing-1)
.byte >(do_lemming_stopping-1)
.byte >(do_lemming_mining-1)
.byte >(do_lemming_building-1)
.byte >(do_lemming_shrugging-1)
.byte >(do_lemming_pullup-1)
;=========================
2022-03-13 21:18:19 +00:00
;=========================
; falling
;=========================
2022-03-27 18:05:47 +00:00
;=========================
2022-03-10 06:10:42 +00:00
do_lemming_falling:
2022-03-27 18:05:47 +00:00
tya
tax
inc lemming_y,X ; fall speed
inc lemming_y,X
inc lemming_fall_distance,X ; how far
lda lemming_fall_distance,X
cmp #12
bcc not_fallen_enough ; blt
lda lemming_attribute,X
bpl not_fallen_enough ; see if high bit set
; we can switch to floating
lda #LEMMING_FLOATING
sta lemming_status,X
lda #0
sta lemming_frame,X
not_fallen_enough:
jsr collision_check_ground
2022-03-27 18:05:47 +00:00
2022-03-25 01:25:26 +00:00
jmp done_move_lemming
2022-03-10 06:10:42 +00:00
2022-03-23 01:10:57 +00:00
2022-03-27 18:05:47 +00:00
;=========================
2022-03-25 01:25:26 +00:00
;=========================
; floating
;=========================
2022-03-27 18:05:47 +00:00
;=========================
2022-03-25 01:25:26 +00:00
do_lemming_floating:
2022-03-27 18:05:47 +00:00
tya
tax
inc lemming_y,X ; fall speed
lda #0
sta lemming_fall_distance,X
jsr collision_check_ground
2022-03-27 18:05:47 +00:00
2022-03-10 06:10:42 +00:00
jmp done_move_lemming
2022-03-25 01:25:26 +00:00
2022-03-27 18:05:47 +00:00
;=========================
2022-03-13 21:18:19 +00:00
;=========================
; walking
;=========================
2022-03-27 18:05:47 +00:00
;=========================
2022-03-10 06:10:42 +00:00
do_lemming_walking:
2022-03-11 05:53:18 +00:00
2022-03-18 05:59:15 +00:00
; see if ground has risen up
jsr collision_check_hill
2022-03-11 05:53:18 +00:00
2022-03-13 06:28:37 +00:00
; collision detect walls
2022-03-22 04:05:49 +00:00
ldy CURRENT_LEMMING
lda lemming_y,Y
2022-03-11 05:53:18 +00:00
clc
adc #3 ; waist-high?
2022-03-22 04:05:49 +00:00
tax
2022-03-11 05:53:18 +00:00
2022-03-22 04:05:49 +00:00
lda hposn_high,X
2022-03-13 06:28:37 +00:00
clc
adc #$20
2022-03-11 05:53:18 +00:00
sta GBASH
2022-03-22 04:05:49 +00:00
lda hposn_low,X
2022-03-11 05:53:18 +00:00
sta GBASL
2022-03-13 21:18:19 +00:00
; increment
; only do this every 4th frame?
2022-03-22 04:05:49 +00:00
lda lemming_frame,Y
2022-03-13 21:18:19 +00:00
and #$3
beq walking_increment
2022-03-22 04:05:49 +00:00
bne walking_done
2022-03-13 21:18:19 +00:00
walking_increment:
; actually incrememt
2022-03-22 04:05:49 +00:00
clc ; increment/decrement X
lda lemming_x,Y
adc lemming_direction,Y ; A is now incremented version
; sta lemming_x,Y
tay ; Y is now incremented version
2022-03-11 05:53:18 +00:00
2022-03-22 04:05:49 +00:00
lda (GBASL),Y ; collision check
2022-04-02 05:39:16 +00:00
cmp #$ff ; don't collide with bridge
beq walking_no_wall
2022-03-11 05:53:18 +00:00
and #$7f
beq walking_no_wall
walking_yes_wall:
pha
2022-03-22 04:05:49 +00:00
; we hit a wall, reverse course, undo the increment
; Y is updated
jsr check_at_exit_xiny
2022-03-11 05:53:18 +00:00
2022-03-31 02:38:45 +00:00
; check if climber, if so climb
2022-03-22 04:05:49 +00:00
ldy CURRENT_LEMMING
2022-03-31 02:38:45 +00:00
pla
cmp #$10
beq not_climber ; HACK: special case so climbers
; don't climb over stoppers
2022-03-31 02:38:45 +00:00
lda lemming_attribute,Y
and #LEMMING_CLIMBER
beq not_climber
lda #LEMMING_CLIMBING
sta lemming_status,Y
jmp walking_done
not_climber:
; reverse direction
2022-03-22 04:05:49 +00:00
lda lemming_direction,Y
2022-03-11 05:53:18 +00:00
eor #$ff
clc
adc #1
2022-03-22 04:05:49 +00:00
sta lemming_direction,Y
jmp walking_no_increment
2022-03-11 05:53:18 +00:00
walking_no_wall:
2022-03-22 04:05:49 +00:00
; y is incremented version
2022-03-11 05:53:18 +00:00
tya
2022-03-22 04:05:49 +00:00
ldy CURRENT_LEMMING
sta lemming_x,Y
2022-03-11 05:53:18 +00:00
2022-03-22 04:05:49 +00:00
walking_no_increment:
2022-03-11 04:02:08 +00:00
jsr collision_check_ground
2022-03-10 06:10:42 +00:00
2022-03-22 04:05:49 +00:00
walking_done:
2022-03-11 05:53:18 +00:00
jmp done_move_lemming
2022-03-25 01:25:26 +00:00
2022-03-22 04:05:49 +00:00
;=====================
; digging
;=====================
2022-03-10 06:10:42 +00:00
do_lemming_digging:
2022-03-30 18:46:46 +00:00
; ldy #CURRENT_LEMMING
2022-03-30 18:46:46 +00:00
lda lemming_y,Y ; point to spot below us
2022-03-11 05:53:18 +00:00
clc
adc #9
2022-03-22 04:05:49 +00:00
tax
2022-03-11 05:53:18 +00:00
2022-03-22 04:05:49 +00:00
lda hposn_high,X
2022-03-13 06:28:37 +00:00
clc
2022-03-30 18:46:46 +00:00
adc #$20 ; point to background
2022-03-11 05:53:18 +00:00
sta GBASH
2022-03-22 04:05:49 +00:00
lda hposn_low,X
2022-03-11 05:53:18 +00:00
sta GBASL
2022-03-22 04:05:49 +00:00
lda lemming_x,Y
tay
2022-03-30 18:46:46 +00:00
2022-03-11 05:53:18 +00:00
lda #$0
2022-03-30 18:46:46 +00:00
sta (GBASL),Y ; erase bg
2022-03-11 05:53:18 +00:00
2022-03-30 18:46:46 +00:00
ldx CURRENT_LEMMING ; dig down
2022-03-22 04:05:49 +00:00
inc lemming_y,X
2022-03-11 05:53:18 +00:00
blurgh:
jsr collision_check_ground
2022-03-27 18:05:47 +00:00
jmp done_move_lemming
2022-03-11 05:53:18 +00:00
2022-03-10 06:10:42 +00:00
;=====================
; mining
;=====================
do_lemming_mining:
ldy CURRENT_LEMMING
lda lemming_frame,Y
and #$f
2022-03-30 18:55:49 +00:00
bne no_mining_this_frame ; only move dirt on frame 0
2022-03-31 04:25:49 +00:00
2022-03-30 18:55:49 +00:00
ldx #0 ; erase background
stx HGR_COLOR
; (X,A) to (X,A+Y) where X is xcoord/7
2022-03-30 18:55:49 +00:00
jsr hgr_box_page_toggle ; erase box page1
ldy CURRENT_LEMMING
lda lemming_x,Y
tax
lda lemming_y,Y
2022-03-30 18:55:49 +00:00
ldy #10
jsr hgr_box
2022-03-30 18:55:49 +00:00
jsr hgr_box_page_toggle ; erase box page2
ldy CURRENT_LEMMING
lda lemming_x,Y
tax
lda lemming_y,Y
2022-03-30 18:55:49 +00:00
ldy #10
jsr hgr_box
2022-03-30 18:55:49 +00:00
ldx CURRENT_LEMMING ; move 3 lines down
inc lemming_y,X
inc lemming_y,X
inc lemming_y,X
2022-03-30 18:55:49 +00:00
lda lemming_x,X ; move left or right
clc
adc lemming_direction,X
sta lemming_x,X
jsr collision_check_ground
no_mining_this_frame:
done_mining:
jmp done_move_lemming
2022-03-30 18:55:49 +00:00
2022-03-30 18:46:46 +00:00
;=====================
; bashing
;=====================
do_lemming_bashing:
ldy CURRENT_LEMMING
lda lemming_frame,Y
and #$f
2022-03-30 19:10:49 +00:00
bne no_bashing_this_frame
2022-03-30 18:46:46 +00:00
ldx #0
stx HGR_COLOR
; (X,A) to (X,A+Y) where X is xcoord/7
jsr hgr_box_page_toggle
ldy CURRENT_LEMMING
lda lemming_x,Y
2022-03-30 19:10:49 +00:00
clc
adc lemming_direction,Y
2022-03-30 18:46:46 +00:00
tax
lda lemming_y,Y
ldy #9
jsr hgr_box
jsr hgr_box_page_toggle
ldy CURRENT_LEMMING
lda lemming_x,Y
2022-03-30 19:10:49 +00:00
clc
adc lemming_direction,Y
2022-03-30 18:46:46 +00:00
tax
lda lemming_y,Y
ldy #9
jsr hgr_box
2022-03-30 19:10:49 +00:00
ldy CURRENT_LEMMING ; FIXME: combine with earlier?
lda lemming_x,Y
2022-03-30 18:46:46 +00:00
clc
2022-03-30 19:10:49 +00:00
adc lemming_direction,Y
sta lemming_x,Y
2022-03-30 18:46:46 +00:00
; here?
jsr collision_check_side
2022-03-30 19:10:49 +00:00
no_bashing_this_frame:
; jsr collision_check_ground
2022-03-30 18:46:46 +00:00
jmp done_move_lemming
2022-04-01 04:33:33 +00:00
;
; xxxxxxx
; xxxxxxx
; xxxxxxx
; xxxxxxx
;
2022-03-30 21:12:03 +00:00
;=====================
; building
;=====================
do_lemming_building:
ldy CURRENT_LEMMING
lda lemming_frame,Y
2022-04-01 04:33:33 +00:00
and #$7
beq yes_building_this_frame
jmp no_building_this_frame ; only move dirt on frame 0
2022-03-30 21:12:03 +00:00
2022-04-01 04:33:33 +00:00
yes_building_this_frame:
2022-04-02 05:39:16 +00:00
; ldx #7 ; draw white block
; stx HGR_COLOR
2022-03-30 21:12:03 +00:00
2022-04-01 04:33:33 +00:00
lda lemming_attribute,Y
and #$1
bne building_odd
building_even:
2022-03-30 21:12:03 +00:00
ldy CURRENT_LEMMING
2022-04-01 04:33:33 +00:00
lda lemming_y,Y
clc
2022-04-02 05:39:16 +00:00
adc #9
2022-04-01 04:33:33 +00:00
tax ; get row info for Y1 into GBASL/GBASH
lda hposn_high,X
sta GBASH
lda hposn_low,X
sta GBASL
2022-03-30 21:12:03 +00:00
lda lemming_x,Y
clc
adc lemming_direction,Y
2022-04-01 04:33:33 +00:00
tay
lda #$ff
sta (GBASL),Y
lda GBASH
clc
adc #$20
sta GBASH
lda #$ff
sta (GBASL),Y
jmp update_building
building_odd:
ldy CURRENT_LEMMING
2022-03-30 21:12:03 +00:00
lda lemming_y,Y
clc
2022-04-02 05:39:16 +00:00
adc #8
2022-03-30 21:12:03 +00:00
2022-04-01 04:33:33 +00:00
tax ; get row info for Y1 into GBASL/GBASH
lda hposn_high,X
sta GBASH
lda hposn_low,X
sta GBASL
2022-04-02 05:39:16 +00:00
lda lemming_x,Y ; build one block beyond
2022-03-30 21:12:03 +00:00
clc
adc lemming_direction,Y
2022-04-02 05:39:16 +00:00
sta build_smc4+1
sta build_smc3+1
clc
adc lemming_direction,Y
sta build_smc1+1
sta build_smc2+1
2022-04-01 04:33:33 +00:00
2022-04-02 05:39:16 +00:00
lda #$ff ; put one block
build_smc4:
ldy #$dd
2022-04-01 04:33:33 +00:00
sta (GBASL),Y
2022-04-02 05:39:16 +00:00
build_smc1:
ldy #$dd ; also put one beyond
2022-04-01 04:33:33 +00:00
sta (GBASL),Y
lda GBASH
2022-03-30 21:12:03 +00:00
clc
2022-04-01 04:33:33 +00:00
adc #$20
sta GBASH
lda #$ff
2022-04-02 05:39:16 +00:00
build_smc3:
ldy #$dd
2022-04-01 04:33:33 +00:00
sta (GBASL),Y
2022-04-02 05:39:16 +00:00
build_smc2:
ldy #$dd ; see if hit wall
lda (GBASL),Y
and #$7f
beq coast_clear
hit_something:
2022-04-01 04:33:33 +00:00
2022-04-02 05:39:16 +00:00
ldy CURRENT_LEMMING
lda #LEMMING_WALKING
sta lemming_status,Y
jmp keep_at_it
coast_clear:
lda #$ff
sta (GBASL),Y
2022-03-30 21:12:03 +00:00
2022-04-02 05:39:16 +00:00
keep_at_it:
2022-03-30 21:12:03 +00:00
ldx CURRENT_LEMMING ; move 2 lines up
dec lemming_y,X
dec lemming_y,X
; dec lemming_y,X
lda lemming_x,X ; move left or right
clc
adc lemming_direction,X
sta lemming_x,X
2022-04-01 04:33:33 +00:00
update_building:
ldx CURRENT_LEMMING
2022-03-31 02:38:45 +00:00
inc lemming_attribute,X
lda lemming_attribute,X
2022-04-01 04:33:33 +00:00
and #$f
cmp #11
2022-03-31 02:38:45 +00:00
bne done_building
cmp #8
bcc no_build_click
jsr click_speaker
no_build_click:
2022-03-31 02:38:45 +00:00
; hit the end!
lda #LEMMING_SHRUGGING
sta lemming_status,X
2022-04-01 04:33:33 +00:00
lda #0
sta lemming_frame,X
2022-03-30 21:12:03 +00:00
no_building_this_frame:
done_building:
jmp done_move_lemming
2022-03-31 02:38:45 +00:00
;========================
; stopping
;========================
do_lemming_stopping:
; we do want to see if something knocks the ground out from
; under us
2022-03-31 03:18:01 +00:00
; in practice that is tricky as the barrier we draw causes
; the lemming to jump. hmmm
; jsr collision_check_ground
2022-03-31 02:38:45 +00:00
jmp done_move_lemming
;========================
; shrugging
;========================
do_lemming_shrugging:
lda lemming_frame,Y
cmp #8
bne not_done_shrugging
lda #LEMMING_WALKING ; done shrug, start walking again
sta lemming_status,Y
not_done_shrugging:
jmp done_move_lemming
;========================
; climbing
;========================
do_lemming_climbing:
lda lemming_frame,Y
and #3
bne not_done_climbing
; climb
tya
tax
dec lemming_y,X
2022-03-31 03:18:01 +00:00
dec lemming_y,X
2022-03-31 02:38:45 +00:00
not_done_climbing:
2022-03-31 03:18:01 +00:00
jsr collision_check_ceiling
bcs done_climbing ; carry set we hit ceiling
; don't check pullup then
2022-03-31 03:18:01 +00:00
jsr collision_check_above
done_climbing:
2022-03-31 03:18:01 +00:00
jmp done_move_lemming
;========================
; pulling up
;========================
do_lemming_pullup:
lda lemming_frame,Y
cmp #8
bne not_done_pullup
lda lemming_x,Y
clc
adc lemming_direction,Y
sta lemming_x,Y
lda #LEMMING_WALKING
sta lemming_status,Y
jmp done_pullup
not_done_pullup:
; climb
tya
tax
dec lemming_y,X
done_pullup:
2022-03-31 02:38:45 +00:00
jmp done_move_lemming
2022-03-30 18:46:46 +00:00
2022-03-31 03:18:01 +00:00
2022-03-25 01:25:26 +00:00
;=====================
2022-03-27 18:05:47 +00:00
; do nothing
2022-03-25 01:25:26 +00:00
;=====================
2022-03-27 18:05:47 +00:00
; placeholders
2022-03-30 18:46:46 +00:00
do_lemming_exploding: ; nothing special
do_lemming_splatting: ; nothing special
do_lemming_particles: ; work done in draw
2022-03-25 01:25:26 +00:00
2022-03-27 18:05:47 +00:00
jmp done_move_lemming
2022-03-25 01:25:26 +00:00
2022-03-11 06:22:51 +00:00
;==========================
; remove lemming from game
2022-03-22 04:05:49 +00:00
;==========================
2022-03-23 01:10:57 +00:00
; Y points to CURRENT_LEMMING
; if C set it means they exited
2022-03-11 06:22:51 +00:00
2022-03-23 01:10:57 +00:00
remove_lemming:
2022-03-22 04:05:49 +00:00
2022-03-23 01:10:57 +00:00
bcc didnt_exit
2022-03-22 04:05:49 +00:00
2022-03-23 01:36:44 +00:00
sed
lda PERCENT_RESCUED_L
clc
adc PERCENT_ADD
sta PERCENT_RESCUED_L
bcc no_percent_oflo
inc PERCENT_RESCUED_H
2022-03-23 04:34:33 +00:00
no_percent_oflo:
2022-03-22 04:05:49 +00:00
cld
2022-03-11 06:22:51 +00:00
2022-03-23 04:34:33 +00:00
jsr update_percent_in
2022-03-23 01:36:44 +00:00
2022-03-23 01:10:57 +00:00
didnt_exit:
2022-03-23 01:36:44 +00:00
sed ; decrement BCD value
lda LEMMINGS_OUT
sec
sbc #1
sta LEMMINGS_OUT
cld
2022-03-23 01:10:57 +00:00
jsr click_speaker
lda #0
2022-03-23 04:34:33 +00:00
ldy CURRENT_LEMMING
2022-03-23 01:10:57 +00:00
sta lemming_out,Y
2022-03-11 06:22:51 +00:00
jsr update_lemmings_out
2022-03-23 01:10:57 +00:00
; if that was the last one, then level over
2022-03-22 04:05:49 +00:00
lda LEMMINGS_OUT
bne not_last_lemming
lda #LEVEL_WIN
sta LEVEL_OVER
not_last_lemming:
2022-03-10 06:10:42 +00:00
rts
2022-03-11 06:22:51 +00:00
;=============================
; collision check side
;=============================
; for bashing
; maybe can also be used when building?
collision_check_side:
ldy CURRENT_LEMMING
lda lemming_y,Y
clc
adc #3
tax
lda hposn_high,X
clc
adc #$20 ; check bg, not fg
sta GBASH
lda hposn_low,X
sta GBASL
lda lemming_x,Y
clc
adc lemming_direction,Y
tay
lda (GBASL),Y
and #$7f
bne gotta_keep_going
broke_on_through_to_the_other_side:
ldy CURRENT_LEMMING
lda #LEMMING_WALKING
sta lemming_status,Y
gotta_keep_going:
rts
2022-03-16 01:00:30 +00:00
2022-03-31 03:18:01 +00:00
;=============================
; collision check above
;=============================
; looking above right/left
; useful for climbers to see if at top
collision_check_above:
ldy CURRENT_LEMMING
lda lemming_y,Y
tax
lda hposn_high,X
clc
adc #$20 ; check bg, not fg
sta GBASH
lda hposn_low,X
sta GBASL
lda lemming_x,Y
clc
adc lemming_direction,Y
tay
lda (GBASL),Y
and #$7f
bne gotta_keep_climbing
at_the_top:
ldy CURRENT_LEMMING
lda #LEMMING_PULLUP
sta lemming_status,Y
lda #0 ; reset frame for pullup
sta lemming_frame,Y
gotta_keep_climbing:
rts
;=============================
; collision check ceiling
;=============================
collision_check_ceiling:
ldy CURRENT_LEMMING
lda lemming_y,Y
tax
lda hposn_high,X
clc
adc #$20 ; check bg, not fg
sta GBASH
lda hposn_low,X
sta GBASL
lda lemming_x,Y
tay
lda (GBASL),Y
and #$7f
beq done_check_ceiling ; if empty space above us, OK
hit_head:
; o/~ I hit my head, I heard the phone ring... o/~
; face other direction, fall
ldy CURRENT_LEMMING
lda lemming_direction,Y
eor #$ff
clc
adc #1
sta lemming_direction,Y
lda #LEMMING_FALLING
sta lemming_status,Y
sec
rts
2022-03-31 03:18:01 +00:00
done_check_ceiling:
clc
2022-03-31 03:18:01 +00:00
rts
2022-03-13 06:28:37 +00:00
;=============================
; collision check ground
;=============================
2022-03-11 04:02:08 +00:00
collision_check_ground:
2022-03-30 18:46:46 +00:00
ldy CURRENT_LEMMING
2022-03-22 04:05:49 +00:00
lda lemming_y,Y
2022-03-11 04:02:08 +00:00
clc
2022-03-30 18:46:46 +00:00
adc #9 ; FIXME: should be 10?
2022-03-22 04:05:49 +00:00
tax
2022-03-11 04:02:08 +00:00
2022-03-22 04:05:49 +00:00
lda hposn_high,X
2022-03-13 06:28:37 +00:00
clc
adc #$20 ; check bg, not fg
2022-03-11 04:02:08 +00:00
sta GBASH
2022-03-22 04:05:49 +00:00
lda hposn_low,X
2022-03-11 04:02:08 +00:00
sta GBASL
2022-03-22 04:05:49 +00:00
lda lemming_x,Y
tay
2022-03-11 04:02:08 +00:00
lda (GBASL),Y
and #$7f
2022-03-18 05:59:15 +00:00
beq ground_falling ; if empty space below us, fall
2022-03-23 01:10:57 +00:00
2022-03-30 18:46:46 +00:00
on_the_ground:
; if we get here we're on the ground
; if we were previously falling/floating we need to do something
; otherwise do nothing
ldy CURRENT_LEMMING
lda lemming_status,Y
2022-03-30 18:46:46 +00:00
cmp #LEMMING_FALLING
beq hit_ground
cmp #LEMMING_FLOATING
beq hit_ground
bne done_check_ground ; could rts here?
2022-03-30 18:46:46 +00:00
hit_ground:
2022-03-23 01:10:57 +00:00
; hit ground walking
ldy CURRENT_LEMMING
lda lemming_fall_distance,Y
2022-03-23 04:34:33 +00:00
cmp #32
2022-03-23 01:10:57 +00:00
bcs lemming_goes_splat
lda #0
sta lemming_fall_distance,Y
2022-03-18 05:59:15 +00:00
lda #LEMMING_WALKING ; else, walk
2022-03-25 01:25:26 +00:00
jmp update_status_check_ground
2022-03-23 01:10:57 +00:00
2022-03-30 18:46:46 +00:00
; nothing beneath us, falling
2022-03-11 04:02:08 +00:00
ground_falling:
2022-03-25 01:25:26 +00:00
ldy CURRENT_LEMMING
lda lemming_status,Y ; if floating, don't go back to fall
cmp #LEMMING_FLOATING
beq done_check_ground
2022-03-11 04:02:08 +00:00
lda #LEMMING_FALLING
2022-03-25 01:25:26 +00:00
update_status_check_ground:
2022-03-22 04:05:49 +00:00
ldy CURRENT_LEMMING
sta lemming_status,Y
2022-03-25 01:25:26 +00:00
done_check_ground:
2022-03-11 04:02:08 +00:00
rts
2022-03-18 05:59:15 +00:00
2022-03-23 01:10:57 +00:00
lemming_goes_splat:
2022-03-24 04:21:50 +00:00
lda #LEMMING_SPLATTING
sta lemming_status,Y
lda #0
sta lemming_frame,Y
; clc
; jsr remove_lemming
2022-03-23 01:10:57 +00:00
rts
2022-03-18 05:59:15 +00:00
;=============================
; collision check hill
;=============================
collision_check_hill:
2022-03-22 04:05:49 +00:00
lda lemming_y,Y
2022-03-18 05:59:15 +00:00
clc
adc #8
2022-03-22 04:05:49 +00:00
tax
2022-03-18 05:59:15 +00:00
2022-03-22 04:05:49 +00:00
lda hposn_high,X
2022-03-18 05:59:15 +00:00
clc
adc #$20 ; check bg, not fg
sta GBASH
2022-03-22 04:05:49 +00:00
lda hposn_low,X
2022-03-18 05:59:15 +00:00
sta GBASL
2022-03-22 04:05:49 +00:00
lda lemming_x,Y
tay
2022-03-18 05:59:15 +00:00
lda (GBASL),Y
and #$7f
beq on_ground ; if empty space below us, good
underground:
2022-03-22 04:05:49 +00:00
ldx CURRENT_LEMMING
dec lemming_y,X ; bump us up
2022-03-18 05:59:15 +00:00
on_ground:
rts
2022-03-22 04:05:49 +00:00
;=============================
; check at exit
;=============================
check_at_exit_xiny:
tya
ldy CURRENT_LEMMING
jmp check_at_exit_y
check_at_exit:
; see if at exit
ldy CURRENT_LEMMING
; check X
lda lemming_x,Y
check_at_exit_y:
exit_x1_smc:
cmp #31
bcc not_done_level
exit_x2_smc:
cmp #35
bcs not_done_level
; check Y
lda lemming_y,Y
exit_y1_smc:
cmp #116
bcc not_done_level
exit_y2_smc:
cmp #127
bcs not_done_level
; done level
2022-03-23 01:10:57 +00:00
sec
2022-03-22 04:05:49 +00:00
jsr remove_lemming
not_done_level:
rts
2022-04-10 01:22:18 +00:00
;=============================
; check if hit hazzard
;=============================
; TODO: make configurable
collision_check_hazzard:
ldy #0
sty CURRENT_LEMMING
check_hazzard_loop:
ldy CURRENT_LEMMING
2022-04-13 02:38:43 +00:00
lda lemming_out,Y
beq continue_check_hazzard
2022-04-10 01:22:18 +00:00
lda lemming_y,Y
cmp #130
bcs in_hazzard
bcc continue_check_hazzard
in_hazzard:
lda lemming_status,Y
cmp #LEMMING_SPLATTING
beq continue_check_hazzard ; don't re-splat
lda #LEMMING_SPLATTING
sta lemming_status,Y
lda #0
sta lemming_frame,Y
continue_check_hazzard:
inc CURRENT_LEMMING
lda CURRENT_LEMMING
cmp #MAX_LEMMINGS
bne check_hazzard_loop
rts
2022-04-13 02:38:43 +00:00
;=============================
; check if hit hazzard2
;=============================
; TODO: make configurable
collision_check_hazzard2:
ldy #0
sty CURRENT_LEMMING
check_hazzard_loop2:
ldy CURRENT_LEMMING
lda lemming_out,Y
beq continue_check_hazzard2
lda lemming_x,Y
cmp #10
bcs continue_check_hazzard2
in_hazzard2:
lda lemming_status,Y
cmp #LEMMING_SPLATTING
beq continue_check_hazzard2 ; don't re-splat
lda #LEMMING_SPLATTING
sta lemming_status,Y
lda #0
sta lemming_frame,Y
continue_check_hazzard2:
inc CURRENT_LEMMING
lda CURRENT_LEMMING
cmp #MAX_LEMMINGS
bne check_hazzard_loop2
rts