dos33fsprogs/ootw/ootw_cavern.s

267 lines
3.4 KiB
ArmAsm
Raw Normal View History

; Cavern scenes (with the slugs)
2019-01-17 21:58:19 +00:00
ootw_cavern:
;===========================
; Enable graphics
bit LORES
bit SET_GR
bit FULLGR
;==================
; setup drawing
2019-01-17 21:58:19 +00:00
lda #0
sta DRAW_PAGE
lda #1
sta DISP_PAGE
;======================
; setup room boundaries
lda #0
sta LEFT_LIMIT
lda #37
sta RIGHT_LIMIT
2019-01-17 21:58:19 +00:00
;=============================
; Load background to $c00
lda #$0c
sta BASH
lda #$00
sta BASL ; load image off-screen $c00
lda WHICH_CAVE
cave_bg0:
2019-01-17 22:14:19 +00:00
lda #>(cavern_rle)
2019-01-17 21:58:19 +00:00
sta GBASH
2019-01-17 22:14:19 +00:00
lda #<(cavern_rle)
2019-01-17 21:58:19 +00:00
sta GBASL
jmp cave_bg_done
cave_bg1:
lda #>(cavern2_rle)
sta GBASH
lda #<(cavern2_rle)
sta GBASL
cave_bg_done:
2019-01-17 21:58:19 +00:00
jsr load_rle_gr
;================================
2019-01-18 05:18:06 +00:00
; Load quake background to $1000
jsr gr_make_quake
2019-01-18 05:18:06 +00:00
2019-01-17 21:58:19 +00:00
;=================================
; copy $c00 background to both pages $400/$800
2019-01-17 21:58:19 +00:00
jsr gr_copy_to_current
jsr page_flip
jsr gr_copy_to_current
;=================================
; setup vars
lda #0
sta GAIT
2019-01-17 22:14:19 +00:00
sta GAME_OVER
2019-01-17 21:58:19 +00:00
;============================
; Cavern Loop (not a palindrome)
;============================
cavern_loop:
2019-01-18 05:18:06 +00:00
;==========================
; check for earthquake
earthquake_handler:
lda FRAMEH
and #3
bne earth_mover
lda FRAMEL
cmp #$ff
bne earth_mover
earthquake_init:
lda #200
sta EQUAKE_PROGRESS
2019-01-18 05:27:32 +00:00
lda #0
sta BOULDER_Y
jsr random16
lda SEEDL
and #$1f
clc
adc #4
sta BOULDER_X
2019-01-18 05:18:06 +00:00
earth_mover:
lda EQUAKE_PROGRESS
beq earth_still
and #$8
bne earth_calm
lda #2
bne earth_decrement
earth_calm:
lda #0
earth_decrement:
sta EARTH_OFFSET
dec EQUAKE_PROGRESS
jmp earth_done
earth_still:
lda #0
sta EARTH_OFFSET
earth_done:
2019-01-17 21:58:19 +00:00
;================================
; copy background to current page
2019-01-18 05:18:06 +00:00
lda EARTH_OFFSET
bne shake_shake
no_shake:
2019-01-17 21:58:19 +00:00
jsr gr_copy_to_current
2019-01-18 05:18:06 +00:00
jmp done_shake
shake_shake:
jsr gr_copy_to_current_1000
2019-01-18 05:18:06 +00:00
done_shake:
2019-01-17 21:58:19 +00:00
2019-01-18 17:00:25 +00:00
;===============
; handle slug death
lda SLUGDEATH
beq still_alive
collapsing:
lda SLUGDEATH_PROGRESS
cmp #18
bmi still_collapsing
really_dead:
lda #$ff
sta GAME_OVER
jmp just_slugs
still_collapsing:
tax
lda collapse_progression,X
sta INL
lda collapse_progression+1,X
sta INH
lda PHYSICIST_X
sta XPOS
lda PHYSICIST_Y
sec
sbc EARTH_OFFSET
sta YPOS
jsr put_sprite
lda FRAMEL
and #$1f
bne no_collapse_progress
inc SLUGDEATH_PROGRESS
inc SLUGDEATH_PROGRESS
no_collapse_progress:
2019-01-18 17:00:25 +00:00
jmp just_slugs
still_alive:
;===============
; check keyboard
jsr handle_keypress
2019-01-18 17:00:25 +00:00
2019-01-17 21:58:19 +00:00
;===============
; draw physicist
jsr draw_physicist
2019-01-18 17:00:25 +00:00
just_slugs:
2019-01-17 21:58:19 +00:00
;===============
; draw slugs
jsr draw_slugs
;======================
; draw falling boulders
2019-01-18 05:27:32 +00:00
lda BOULDER_Y
cmp #38
bpl no_boulder
lda #<boulder
sta INL
lda #>boulder
sta INH
lda BOULDER_X
sta XPOS
lda BOULDER_Y
sta YPOS
jsr put_sprite
lda FRAMEL
and #$3
bne no_boulder
inc BOULDER_Y
inc BOULDER_Y
2019-01-17 21:58:19 +00:00
2019-01-18 05:27:32 +00:00
no_boulder:
2019-01-17 21:58:19 +00:00
;=======================
; page flip
jsr page_flip
;========================
; inc frame count
inc FRAMEL
bne frame_no_oflo_c
inc FRAMEH
frame_no_oflo_c:
; pause?
; see if game over
lda GAME_OVER
2019-01-17 22:14:19 +00:00
cmp #$ff
beq done_cavern
; see if left level
cmp #1
bne still_in_cavern
lda #37
sta PHYSICIST_X
jmp ootw_pool
2019-01-17 21:58:19 +00:00
2019-01-17 22:14:19 +00:00
still_in_cavern:
2019-01-17 21:58:19 +00:00
; loop forever
jmp cavern_loop
done_cavern:
rts