dos33fsprogs/games/ootw/ootw_c2/ootw_c2_elevator.s

841 lines
14 KiB
ArmAsm

; Ootw Checkpoint2 -- Using the elevator
ootw_elevator:
;===========================
; load dome for later
lda #>(dome_lzsa)
sta getsrc_smc+2 ; LZSA_SRC_HI
lda #<(dome_lzsa)
sta getsrc_smc+1 ; LZSA_SRC_LO
lda #$10 ; load to page $1000
jsr decompress_lzsa2_fast
;==============================
; setup physicist
lda #16
sta PHYSICIST_Y
;==============================
; setup per-room variables
check_elevator7:
lda WHICH_JAIL
cmp #7
bne check_elevator8
elevator7:
lda #(-4+128)
sta LEFT_LIMIT
lda #(21+128)
sta RIGHT_LIMIT
; set left exit
lda #3
sta eel_smc+1
; set up exit
lda #10
sta going_up_smc+1
; set down exit
lda #8
sta going_down_smc+1
lda #48
sta ELEVATOR_OFFSET
jmp elevator_setup_done
check_elevator8:
cmp #8
bne check_elevator9
elevator8:
lda #(-4+128)
sta LEFT_LIMIT
lda #(21+128)
sta RIGHT_LIMIT
; set left exit
lda #4
sta eel_smc+1
; set up exit
lda #7
sta going_up_smc+1
; set down exit
lda #9
sta going_down_smc+1
lda #96
sta ELEVATOR_OFFSET
jmp elevator_setup_done
check_elevator9:
cmp #9
bne elevator10
elevator9:
lda #(-4+128)
sta LEFT_LIMIT
lda #(21+128)
sta RIGHT_LIMIT
; set left exit
lda #6
sta eel_smc+1
; set up exit
lda #8
sta going_up_smc+1
; no down exit
lda #144
sta ELEVATOR_OFFSET
jmp elevator_setup_done
; The dome
elevator10:
lda #(4+128)
sta LEFT_LIMIT
lda #(30+128)
sta RIGHT_LIMIT
; set up exit
; no up exit
; set down exit
lda #7
sta going_down_smc+1
lda #0
sta ELEVATOR_OFFSET
; fallthrough
elevator_setup_done:
;=============================
; load background image
jsr elevator_load_background
;=================================
; copy to screen
jsr gr_copy_to_current
; jsr page_flip
;============================
; init shields
jsr init_shields
;=====================
; setup walk collision
jsr recalc_walk_collision
;=================================
; setup vars
lda #0
sta GAIT
;============================
; Elevator Loop
;============================
elevator_loop:
lda #0
sta GAME_OVER
;================================
; copy background to current page
jsr gr_copy_to_current
;================================
; draw elevator
lda #16
sta XPOS
lda #32
sta YPOS
lda FRAMEL
and #$10
bne elevator_anim2
lda #<elevator_sprite1
sta INL
lda #>elevator_sprite1
sta INH
jmp draw_elevator
elevator_anim2:
lda #<elevator_sprite2
sta INL
lda #>elevator_sprite2
sta INH
draw_elevator:
jsr put_sprite_crop
;===============================
; check keyboard
jsr handle_keypress
;===============================
; move physicist
jsr move_physicist
;===============
; check room limits
jsr check_screen_limit
;===============
; draw physicist
jsr draw_physicist
;================
; handle gun
;================
jsr handle_gun
;===============
; page flip
jsr page_flip
;================
; inc frame count
inc FRAMEL
bne elevator_frame_no_oflo
inc FRAMEH
elevator_frame_no_oflo:
;==========================
; handle elevator
;==========================
lda PHYSICIST_X
cmp #16
bcc not_on_elevator ; blt
cmp #23
bcs not_on_elevator ; bge
lda #1
bne update_elevator ; bra
not_on_elevator:
lda #0
update_elevator:
sta ON_ELEVATOR
;==========================
; handle elevating
;==========================
lda PHYSICIST_STATE
elevator_check_up:
cmp #P_ELEVATING_UP
bne elevator_check_down
going_up:
jsr move_elevator
going_up_smc:
lda #7
sta WHICH_JAIL
jmp done_elevator
elevator_check_down:
cmp #P_ELEVATING_DOWN
bne going_nowhere
going_down:
jsr move_elevator
going_down_smc:
lda #4
sta WHICH_JAIL
jmp done_elevator
going_nowhere:
;==================================
; see if we should play city movie
;==================================
lda WHICH_JAIL
cmp #10
bne no_city_movie
lda PHYSICIST_X
cmp #28
bne no_city_movie
lda CITY_MOVIE_SEEN
bne no_city_movie
jsr play_city_movie
lda #1
sta CITY_MOVIE_SEEN
lda #0
sta PHYSICIST_STATE
no_city_movie:
;==========================
; check if done this room
;==========================
lda GAME_OVER
beq still_in_elevator
cmp #$ff ; if $ff, we died
beq done_elevator
;===============================
; check if exited room to right
cmp #1
beq elevator_exit_left
; exit to right ???
; it's never possible to exit right from an elevator screen
elevator_exit_right:
jmp still_in_elevator
elevator_exit_left:
lda #37
sta PHYSICIST_X
eel_smc:
lda #0
sta WHICH_CAVE
jmp done_elevator
; loop forever
still_in_elevator:
jmp elevator_loop
done_elevator:
rts
;===============================
; load proper background to $c00
;===============================
elevator_load_background:
lda ELEVATOR_OFFSET
cmp #24
bcs elevator_bg_no_dome ; bge
; dome, dome on the range
; loaded the dome at entry to level, rather than every cycle
lda ELEVATOR_OFFSET
tay
jsr gr_copy_to_offset
rts
elevator_bg_no_dome:
ldy #0
elevator_background_loop:
; self modify line we're on
lda gr_offsets_l,Y
sta line0_left_loop+1
sta line0_center_loop+1
sta line0_right_loop+1
lda gr_offsets_h,Y
clc
adc #$8
sta line0_left_loop+2
sta line0_center_loop+2
sta line0_right_loop+2
sty TEMP
; calculate framebuffer offset
tya
clc
adc ELEVATOR_OFFSET
sec
sbc #24
tay
; draw left part
lda elevator_fb,Y
and #$f0
beq elevator_right_none
lda #$88
elevator_right_none:
ldx #0
line0_left_loop:
sta $c00,X
inx
cpx #17
bne line0_left_loop
; draw center part
lda elevator_fb,Y
and #$0f
beq line0_center_loop
lda #$88
line0_center_loop:
sta $c00,X
inx
cpx #25
bne line0_center_loop
lda #$88
line0_right_loop:
sta $c00,X
inx
cpx #40
bne line0_right_loop
ldy TEMP
iny
cpy #24
bne elevator_background_loop
rts
elevator_fb:
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
; /----------------\
.byte $80 ; ######## ######## 0 (24)
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ;+######## ########
.byte $80 ; ######## ######## ; 24 (48) (Room4)
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ;+######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ;+######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ;+######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ;+######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $80 ; ######## ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $00 ; ########
.byte $80 ; ######## ########
.byte $88 ; ####################
.byte $88 ; ####################
.byte $88 ; ####################
.byte $88 ; ####################
.byte $88 ; ####################
.byte $88 ; ####################
.byte $88 ;+####################
;===================================
; play city movie
;===================================
play_city_movie:
ldy #0
city_loop:
; load background
lda city_frames+1,Y
sta getsrc_smc+2 ; LZSA_SRC_HI
lda city_frames,Y
sta getsrc_smc+1 ; LZSA_SRC_LO
tya
pha
lda #$c
jsr decompress_lzsa2_fast
jsr gr_copy_to_current
jsr page_flip
ldx #2
city_long_delay:
lda #250
jsr WAIT
dex
bne city_long_delay
pla
tay
iny
iny
cpy #36
bne city_loop
city_end:
jsr elevator_load_background
rts
city_frames:
.word city01_lzsa ; 0
.word city02_lzsa ; 1
.word city03_lzsa ; 2
.word city04_lzsa ; 3
.word city05_lzsa ; 4
.word city06_lzsa ; 5
.word city07_lzsa ; 6
.word city08_lzsa ; 7
.word city09_lzsa ; 8
.word city10_lzsa ; 9
.word city11_lzsa ; 10
.word city12_lzsa ; 11
.word city13_lzsa ; 12
.word city14_lzsa ; 13
.word city14_lzsa ; 14
.word city14_lzsa ; 15
.word city14_lzsa ; 16
.word city14_lzsa ; 17
;====================================
; run the elevator ride
;====================================
move_elevator:
lda PHYSICIST_STATE
cmp #P_ELEVATING_UP
bne move_elevator_down
move_elevator_up:
lda WHICH_JAIL
cmp #10 ; if top floor, no up
beq elevator_all_done
lda ELEVATOR_OFFSET
sec
sbc #48
sta elevator_end_smc+1
lda #$C6 ; dec
sta elevator_direction_smc
jmp move_elevator_loop
move_elevator_down:
lda WHICH_JAIL
cmp #9 ; if bottom floor, no down
beq elevator_all_done
lda ELEVATOR_OFFSET
clc
adc #48
sta elevator_end_smc+1
lda #$E6 ; inc
sta elevator_direction_smc
move_elevator_loop:
lda #0
sta PHYSICIST_STATE
elevator_direction_smc:
inc ELEVATOR_OFFSET ; E6=inc, C6=DEC
jsr elevator_load_background
jsr gr_copy_to_current
;===============
; draw physicist
jsr draw_physicist
;===============
; increment frame count
inc FRAMEL
bne elevator_moving_frame_no_oflo
inc FRAMEH
elevator_moving_frame_no_oflo:
;================================
; draw elevator moving
lda #16
sta XPOS
lda #32
sta YPOS
lda FRAMEL
lsr
; lsr
and #$6
tay
lda elevator_moving_sprites,Y
sta INL
lda elevator_moving_sprites+1,Y
sta INH
jsr put_sprite_crop
;========================
; flip pages
jsr page_flip
lda ELEVATOR_OFFSET
elevator_end_smc:
cmp #$ff
bne move_elevator_loop
elevator_all_done:
lda #0
sta PHYSICIST_STATE
rts
elevator_sprite1:
.byte 10,1
.byte $5A,$25,$25,$25,$25,$25,$25,$25,$25,$A5
elevator_sprite2:
.byte 10,1
.byte $A5,$25,$25,$25,$25,$25,$25,$25,$25,$5A
; low/high nothing
; high/low xBxxxxxx
; low/high xxBBBxxx
; high low xxxxxxBx
elevator_moving_sprites:
.word elevator_moving_sprite0
.word elevator_moving_sprite1
.word elevator_moving_sprite2
.word elevator_moving_sprite3
elevator_moving_sprite0:
.byte 10,1
.byte $5A,$25,$25,$25,$25,$25,$25,$25,$25,$A5
elevator_moving_sprite1:
.byte 10,1
.byte $A5,$25,$75,$25,$25,$25,$25,$25,$25,$5A
elevator_moving_sprite2:
.byte 10,1
.byte $5A,$25,$25,$75,$75,$75,$25,$25,$25,$A5
elevator_moving_sprite3:
.byte 10,1
.byte $A5,$25,$25,$25,$25,$25,$25,$75,$25,$5A