dos33fsprogs/games/mist/arbor_switches.s

426 lines
7.7 KiB
ArmAsm

;=============================
; elevator1 handle pulled
;=============================
; TODO: animate
elev1_handle:
; click speaker
bit SPEAKER
; check for water power
lda CHANNEL_SWITCHES
bpl no_elev1_water_power ; water on is high bit
; check for proper valves
lda CHANNEL_VALVES
and #$0b ; check V1,V2,V4,V5
cmp #$01 ; want V1 on, V2,V4,V5 off
beq elev1_water_power_good
no_elev1_water_power:
rts
elev1_water_power_good:
; go to bottom floor, which involves moving to CHANNEL level
lda #CHANNEL_IN_ELEV1_CLOSED
sta LOCATION
lda #DIRECTION_E
sta DIRECTION
lda #LOAD_CHANNEL
sta WHICH_LOAD
lda #$ff
sta LEVEL_OVER
lda CHANNEL_SWITCHES ; make elevator down
and #<(~CHANNEL_ELEVATOR1_UP)
sta CHANNEL_SWITCHES
rts
;=========================
;=========================
; close elevator1 door
;=========================
;=========================
elev1_close_door:
lda #ARBOR_INSIDE_ELEV1
sta LOCATION
jmp change_location
;==================================
;==================================
; hut handle, toggle top stair gate
;==================================
;==================================
hut_handle:
lda CHANNEL_SWITCHES
eor #CHANNEL_SW_GATE_TOP
sta CHANNEL_SWITCHES
jsr update_arbor_state
jmp change_location
;=============================
;=============================
; elevator2 handle pulled
;=============================
;=============================
; TODO: animate
elevator2_handle:
; click speaker
bit SPEAKER
; check for water power
lda CHANNEL_SWITCHES
bpl no_elev2_water_power ; water on is high bit
; check for proper valves
lda CHANNEL_VALVES
and #$1 ; check V1
beq elev2_water_power_good ; want V1 off
no_elev2_water_power:
rts
elev2_water_power_good:
lda #NIBEL_IN_ELEV2_TOP_CLOSED
sta LOCATION
lda #LOAD_NIBEL
sta WHICH_LOAD
lda #$ff
sta LEVEL_OVER
rts
;=========================
;=========================
; close elevator2 door
;=========================
;=========================
elevator2_close_door:
lda #ARBOR_INSIDE_ELEV2_CLOSED
sta LOCATION
jmp change_location
;=========================
;=========================
; handle_top_gate
;=========================
;=========================
handle_top_gate:
lda CHANNEL_SWITCHES
and #CHANNEL_SW_GATE_TOP
beq done_handle_top_gate ; if gate not open
lda #ARBOR_STEPS_TOP
sta LOCATION
jsr change_location
done_handle_top_gate:
rts
;=================================
;=================================
; handle gate at bottom of stairs
;=================================
;=================================
stair_gate:
lda CHANNEL_SWITCHES
and #CHANNEL_SW_GATE_BOTTOM
beq stair_gate_closed ; if gate not open
stair_gate_open:
; 13-16 close gate
lda CURSOR_X
cmp #16
bcc close_stair_gate
; otherwise, exit back to channelwood
lda #CHANNEL_STEPS_DOOR
sta LOCATION
lda #DIRECTION_E
sta DIRECTION
lda #LOAD_CHANNEL
sta WHICH_LOAD
lda #$ff
sta LEVEL_OVER
rts
close_stair_gate:
; open the gate
lda CHANNEL_SWITCHES
and #<(~CHANNEL_SW_GATE_BOTTOM)
jmp update_stair_gate
stair_gate_closed:
; open the gate
lda CHANNEL_SWITCHES
ora #CHANNEL_SW_GATE_BOTTOM
update_stair_gate:
sta CHANNEL_SWITCHES
jsr update_arbor_state
jmp change_location
;===============================================
; draw bridge1 bg
;===============================================
; if the elevator is down, erase it
; doing it this way is abour 40 bytes
; doing it with dedicated bg image would be about 400 bytes
draw_bridge1_bg:
; only if bridge down
lda CHANNEL_SWITCHES
and #CHANNEL_ELEVATOR1_UP
bne done_bridge1_bg
; only if facing east
lda DIRECTION
and #$f
cmp #DIRECTION_E
bne done_bridge1_bg
lda #18
sta XPOS
lda #10
sta YPOS
lda #<elev_down_patch_sprite
sta INL
lda #>elev_down_patch_sprite
sta INH
jsr put_sprite_crop
done_bridge1_bg:
rts
elev_down_patch_sprite:
.byte 4,6
.byte $55,$00,$00,$55
.byte $55,$00,$00,$55
.byte $55,$00,$00,$55
.byte $55,$00,$00,$55
.byte $55,$00,$00,$55
.byte $58,$08,$08,$58
;===============================================
;===============================================
; update all backgrounds based on switch states
;===============================================
;===============================================
update_arbor_state:
; update on elevator1
lda CHANNEL_SWITCHES
and #CHANNEL_ELEVATOR1_UP
beq make_elevator1_down
make_elevator1_up:
; change elevator view
ldy #LOCATION_EAST_BG
lda #<arrival_e_lzsa
sta location2,Y ; ARBOR_ARRIVAL_CLOSED
lda #>arrival_e_lzsa
sta location2+1,Y ; ARBOR_ARRIVAL_CLOSED
; connect elevator exit
ldy #LOCATION_EAST_EXIT
lda #ARBOR_ARRIVAL_OPEN
sta location2,Y ; ARBOR_ARRIVAL_CLOSED
jmp make_elevator1_done
make_elevator1_down:
; change elevator view
ldy #LOCATION_EAST_BG
lda #<arrival_noelev_e_lzsa
sta location2,Y ; ARBOR_ARRIVAL_CLOSED
lda #>arrival_noelev_e_lzsa
sta location2+1,Y ; ARBOR_ARRIVAL_CLOSED
; disconnect elevator exit
ldy #LOCATION_EAST_EXIT
lda #ARBOR_ARRIVAL_NOELEV
sta location2,Y ; ARBOR_ARRIVAL_CLOSED
make_elevator1_done:
; update based on switches
lda CHANNEL_SWITCHES
and #CHANNEL_SW_GATE_TOP
beq top_gate_closed
top_gate_open:
; change top gate to open
; change far view
ldy #LOCATION_SOUTH_BG
lda #<switch_hut_open_s_lzsa
sta location14,Y ; ARBOR_SWITCH_HUT
lda #>switch_hut_open_s_lzsa
sta location14+1,Y ; ARBOR_SWITCH_HUT
; change bridge view
ldy #LOCATION_WEST_BG
lda #<bridge7_open_w_lzsa
sta location22,Y ; ARBOR_BRIDGE7
lda #>bridge7_open_w_lzsa
sta location22+1,Y ; ARBOR_BRIDGE7
; change doors, elevator closed view
; should be gate open, elevator closed
lda #<doors_open_elev2_closed_w_lzsa
sta location23,Y ; ARBOR_DOORS
lda #>doors_open_elev2_closed_w_lzsa
sta location23+1,Y ; ARBOR_DOORS
; change doors, elevator open view
; should be gate open, elevator open
lda #<doors_open_w_lzsa
sta location24,Y ; ARBOR_DOORS_ELEV2_OPEN
lda #>doors_open_w_lzsa
sta location24+1,Y ; ARBOR_DOORS_ELEV2_OPEN
; change to allow traversing gate
ldy #LOCATION_SPECIAL_EXIT
lda #DIRECTION_W
sta location23,Y ; ARBOR_DOORS
sta location24,Y ; ARBOR_DOORS_ELEV2_OPEN
jmp top_gate_done
top_gate_closed:
; change top gate to closed
; change far view
ldy #LOCATION_SOUTH_BG
lda #<switch_hut_closed_s_lzsa
sta location14,Y ; ARBOR_SWITCH_HUT
lda #>switch_hut_closed_s_lzsa
sta location14+1,Y ; ARBOR_SWITCH_HUT
; change bridge view
ldy #LOCATION_WEST_BG
lda #<bridge7_closed_w_lzsa
sta location22,Y ; ARBOR_BRIDGE7
lda #>bridge7_closed_w_lzsa
sta location22+1,Y ; ARBOR_BRIDGE7
; change doors, elevator closed view
; should be gate closed, elevator closed
lda #<doors_closed_w_lzsa
sta location23,Y ; ARBOR_DOORS
lda #>doors_closed_w_lzsa
sta location23+1,Y ; ARBOR_DOORS
; change doors, elevator open view
; should be gate closed, elevator open
lda #<doors_elev2_open_w_lzsa
sta location24,Y ; ARBOR_DOORS_ELEV2_OPEN
lda #>doors_elev2_open_w_lzsa
sta location24+1,Y ; ARBOR_DOORS_ELEV2_OPEN
; change to disallow traversing gate
ldy #LOCATION_SPECIAL_EXIT
lda #$ff
sta location23,Y ; ARBOR_DOORS
sta location24,Y ; ARBOR_DOORS_ELEV2_OPEN
top_gate_done:
update_stair_door:
lda CHANNEL_SWITCHES
and #CHANNEL_SW_GATE_BOTTOM
beq bottom_gate_closed
bottom_gate_open:
; change bottom gate to open
ldy #LOCATION_WEST_BG
lda #<steps_bottom_open_w_lzsa
sta location30,Y ; ARBOR_STEPS_BOTTOM
lda #>steps_bottom_open_w_lzsa
sta location30+1,Y ; ARBOR_STEPS_BOTTOM
jmp bottom_gate_done
bottom_gate_closed:
ldy #LOCATION_WEST_BG
lda #<steps_bottom_closed_w_lzsa
sta location30,Y ; ARBOR_STEPS_BOTTOM
lda #>steps_bottom_closed_w_lzsa
sta location30+1,Y ; ARBOR_STEPS_BOTTOM
bottom_gate_done:
done_update_arbor_state:
rts