dos33fsprogs/games/mist/stoney_puzzles.s
Vince Weaver b1238af49d re-arranged the entire directory structure
this will probably upset people
2021-01-05 15:29:31 -05:00

2010 lines
33 KiB
ArmAsm

; The Stone Ship Puzzles
; by deater (Vince Weaver) <vince@deater.net>
; at start, no electricity
; all lights on umbrella off
; tunnels dark and flooded
; steps to cabin are flooded, lights off past airlock, can't
; touch book
; lighthouse is flooded
; lights are always on in red/blue rooms
; umbrella pump -- only one can be on, touching twice toggles
; #1 drains main cabin
; #2 drains tunnels
; #3 drain the elevator room
; treasure chest
; 1st drain tower room
; 2nd go down, open tap, let water drain
; 3rd close tap
; 4th raise water again
; 5th click on chained key which will unlock chest
; 6th click on key in chest which will get picked up
; 7th open trapdoor. animation. lock and key fall to
; floor down below
; you can still pick up the key down there
; in game if you leave the lighthouse
; while you have the key, the key ends up on the floor
; down below
; charged battery turns on lights in cabin/tunnels
; charge runs down over time
; compass rose puzzle
; press wrong one and lights go out (all energy to zero)
; also siren plays
; blue light at end of corridor
; press right one, lights in the cabin go on
; also light outside the compass window
; lighthouse backgrounds
; water, no trunk, hatch closed
; water, no trunk, hatch open
; water, trunk, hatch closed
; water, trunk, hatch open
; prev two, trunk open/closed
; nowater, hatch closed
; nowater, hatch open
; idea: baseline with water trunk, water no trunk, nowater
; draw hatch as sprite
;==================================
; update tunnel lights
;==================================
; only on when BATTERY_CHARGE is non-zero
;
; darkening the rooms happens elsewhere
; here is where we change up backgrounds
; and turn the lighthouse on and off
;
; FIXME:
; + make the top stairwells dark
; + make inside top stairwells display outside still
; + do something about looking backwards from airlocks
update_tunnel_lights:
lda BATTERY_CHARGE
beq tunnel_lights_off
tunnel_lights_on:
jmp done_update_tunnel_lights
tunnel_lights_off:
jsr lighthouse_beacon_off
done_update_tunnel_lights:
rts
;==================================
; compass puzzle
;==================================
; want to click on 135 degrees
; turns on lights (sets COMPASS_STATE to 1), runs update_compas_state
; click on other pins
; turns off lights, shorts out power
; COMPASS_STATE to 0
; BATTERY_CHARGE to 0
; also puzzle only works if battery charge is > 0
; to keep you from pressing all in dark
compass_puzzle:
lda BATTERY_CHARGE
beq compass_oob
lda CURSOR_Y
cmp #7
bcc check_top ; blt
cmp #38
bcs check_bottom ; bge
check_middle:
lda CURSOR_X
cmp #6
bcc compass_oob
cmp #12
bcc wrong_knob
cmp #28
bcc compass_oob
cmp #35
bcs compass_oob
lda CURSOR_Y
cmp #32
bcs right_knob
bcc wrong_knob
check_top:
lda CURSOR_X
cmp #10
bcc compass_oob
cmp #30
bcs compass_oob
bcc wrong_knob
check_bottom:
lda CURSOR_X
cmp #13
bcc compass_oob
cmp #28
bcs compass_oob
bcc wrong_knob
right_knob:
jsr click_speaker
lda #1
sta COMPASS_STATE
jsr update_compass_state
jmp change_direction
wrong_knob:
lda #0
sta COMPASS_STATE
sta BATTERY_CHARGE
jsr long_beep
jsr update_tunnel_lights
jmp update_compass_state
compass_oob:
rts
;==================================
; draw compass light
;==================================
; underwater light comes on if compass successful
; if in room STONEY_COMPASS_ROOM_RIGHT (facing N) or
; STONEY_COMPASS_ROOM_LEFT (facing W)
; and COMPASS_STATE is not 0 then draw the sprite
compass_draw_light:
lda COMPASS_STATE
beq done_compass_draw_light
lda LOCATION
cmp #STONEY_COMPASS_ROOM_RIGHT
beq light_room_right
cmp #STONEY_COMPASS_ROOM_LEFT
beq light_room_left
rts
light_room_right:
lda DIRECTION
cmp #DIRECTION_N
beq actually_draw_light
rts
light_room_left:
lda DIRECTION
cmp #DIRECTION_W
bne done_compass_draw_light
actually_draw_light:
lda #17
sta XPOS
lda #14
sta YPOS
lda #<compass_light_sprite
sta INL
lda #>compass_light_sprite
sta INH
jsr put_sprite_crop
done_compass_draw_light:
rts
compass_light_sprite:
.byte 6,4
.byte $44,$94,$94,$94,$94,$44
.byte $44,$99,$ff,$ff,$99,$44
.byte $44,$99,$9f,$9f,$99,$44
.byte $24,$24,$24,$24,$24,$24
;==================================
; update compass state
;==================================
; if COMPASS_STATE is 0:
; disable access to linking book
; if COMPASS_STATE is 1:
; enable access to linking book
update_compass_state:
lda COMPASS_STATE
bne enable_book_access
disable_book_access:
; regular compass rose
ldy #LOCATION_WEST_BG
lda #<compass_rose_w_lzsa
sta location35,Y ; STONEY_COMPASS_ROSE_LEFT
sta location46,Y ; STONEY_COMPASS_ROSE_RIGHT
lda #>compass_rose_w_lzsa
sta location35+1,Y ; STONEY_COMPASS_ROSE_LEFT
sta location46+1,Y ; STONEY_COMPASS_ROSE_RIGHT
ldy #LOCATION_NORTH_EXIT
lda #$ff
sta location16,Y ; STONEY_BOOK_ROOM
rts
enable_book_access:
; lit compass rose
ldy #LOCATION_WEST_BG
lda #<compass_rose_lit_w_lzsa
sta location35,Y ; STONEY_COMPASS_ROSE_LEFT
sta location46,Y ; STONEY_COMPASS_ROSE_RIGHT
lda #>compass_rose_lit_w_lzsa
sta location35+1,Y ; STONEY_COMPASS_ROSE_LEFT
sta location46+1,Y ; STONEY_COMPASS_ROSE_RIGHT
ldy #LOCATION_NORTH_EXIT
lda #STONEY_BOOK_TABLE
sta location16,Y ; STONEY_BOOK_ROOM
rts
;===================================
; crawlways
;===================================
enter_crawlway_left:
lda #STONEY_CRAWLWAY_ENTRANCE_LEFT
sta LOCATION
lda #DIRECTION_W
sta DIRECTION
jmp change_location
enter_crawlway_right:
lda #STONEY_CRAWLWAY_ENTRANCE_RIGHT
sta LOCATION
lda #DIRECTION_E
sta DIRECTION
jmp change_location
;==========================
; handle compass room right
view_compass_right:
lda CURSOR_X
cmp #12
bcs goto_compass_right ; blt
goto_left_tunnel:
lda #DIRECTION_E
sta DIRECTION
lda #STONEY_COMPASS_ROOM_LEFT
sta LOCATION
jmp change_location
goto_compass_right:
lda #DIRECTION_W|DIRECTION_ONLY_POINT
sta DIRECTION
lda #STONEY_COMPASS_ROSE_RIGHT
sta LOCATION
jmp change_location
;==========================
; handle compass room left
view_compass_left:
lda CURSOR_X
cmp #28
bcc goto_compass_left ; blt
goto_right_tunnel:
lda #DIRECTION_S
sta DIRECTION
lda #STONEY_COMPASS_ROOM_RIGHT
sta LOCATION
jmp change_location
goto_compass_left:
lda #DIRECTION_W|DIRECTION_ONLY_POINT
sta DIRECTION
lda #STONEY_COMPASS_ROSE_LEFT
sta LOCATION
jmp change_location
;==============================
; handle umbrella pump buttons
;==============================
; if on and pressed, goes all off
; if off and pressed, clear all others and set
umbrella_buttons:
; first time you click on it switch to text and print pump message
lda #DIRECTION_W|DIRECTION_SPLIT
sta DIRECTION
jsr change_direction
lda #1
sta ANIMATE_FRAME
lda DRAW_PAGE
pha
lda #8
sta DRAW_PAGE
jsr clear_bottom
pla
sta DRAW_PAGE
lda CURSOR_X
cmp #15
bcc left_button_pressed
cmp #19
bcc center_button_pressed
right_button_pressed:
; drain lighthouse
lda PUMP_STATE
and #DRAINED_LIGHTHOUSE
bne clear_umbrella
lda #DRAINED_LIGHTHOUSE
bne done_umbrella ; bra
left_button_pressed:
; drain mist tunnel
lda PUMP_STATE
and #DRAINED_EXIT
bne clear_umbrella
lda #DRAINED_EXIT
bne done_umbrella ; bra
center_button_pressed:
; drain room tunnels
lda PUMP_STATE
and #DRAINED_TUNNELS
bne clear_umbrella
lda #DRAINED_TUNNELS
bne done_umbrella ; bra
done_umbrella:
sta PUMP_STATE
jmp update_pump_state
clear_umbrella:
lda #0
sta PUMP_STATE
jmp update_pump_state
pump_message:
.byte 13,21,"[PUMP NOISES]",0
;============================
; update pump state
;============================
update_pump_state:
; default is everything is flooded
; flood exit
; disable entering exit tunnel
ldy #LOCATION_SOUTH_EXIT
lda #$ff
sta location0,Y ; STONEY_ARRIVAL
; flood tunnel
ldy #LOCATION_NORTH_EXIT
lda #$ff
sta location9,Y ; STONEY_DOORWAY1
sta location20,Y ; STONEY_DOORWAY2
; flood lighthouse
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
ldy #LOCATION_NORTH_BG
; if TRUNK_WATER_DRAINED=1 and TRUNK_VALVE_OPEN=0 then show trunk
lda TRUNK_STATE
and #(TRUNK_WATER_DRAINED|TRUNK_VALVE_OPEN)
cmp #(TRUNK_WATER_DRAINED)
beq draw_trunk
draw_notrunk:
lda #<lighthouse_inside_notrunk_n_lzsa
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
lda #>lighthouse_inside_notrunk_n_lzsa
sta location5+1,Y ; STONEY_LIGHTHOUSE_INSIDE
bne done_draw_trunk ; bra
draw_trunk:
; see if lid is up
lda TRUNK_STATE
and #TRUNK_LID_OPEN
bne draw_trunk_open
draw_trunk_closed:
lda #<lighthouse_inside_n_lzsa
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
lda #>lighthouse_inside_n_lzsa
sta location5+1,Y ; STONEY_LIGHTHOUSE_INSIDE
jmp done_draw_trunk
draw_trunk_open:
lda #<lighthouse_inside_lidup_n_lzsa
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
lda #>lighthouse_inside_lidup_n_lzsa
sta location5+1,Y ; STONEY_LIGHTHOUSE_INSIDE
done_draw_trunk:
lda PUMP_STATE
beq done_update_pump_state
cmp #DRAINED_EXIT
beq drain_exit
cmp #DRAINED_TUNNELS
beq drain_tunnels
cmp #DRAINED_LIGHTHOUSE
beq drain_lighthouse
drain_exit:
ldy #LOCATION_SOUTH_EXIT
lda #STONEY_EXIT
sta location0,Y ; STONEY_ARRIVAL
jmp done_update_pump_state
drain_tunnels:
ldy #LOCATION_NORTH_EXIT
lda #STONEY_LEFT_TUNNEL1
sta location9,Y ; STONEY_DOORWAY1
lda #STONEY_RIGHT_TUNNEL1
sta location20,Y ; STONEY_DOORWAY2
jmp done_update_pump_state
drain_lighthouse:
ldy #LOCATION_NORTH_BG
lda #<lighthouse_inside_nowater_n_lzsa
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
lda #>lighthouse_inside_nowater_n_lzsa
sta location5+1,Y ; STONEY_LIGHTHOUSE_INSIDE
ldy #LOCATION_NORTH_EXIT
lda #STONEY_LIGHTHOUSE_SPIRAL
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
jmp done_update_pump_state
done_update_pump_state:
rts
;========================
; handle generator crank
handle_crank:
inc CRANK_ANGLE
lda CRANK_ANGLE
and #$3
sta CRANK_ANGLE
lda BATTERY_CHARGE
cmp #7
beq skip_charge
inc BATTERY_CHARGE
jsr update_tunnel_lights
skip_charge:
rts
;=========================================
; draw umbrella lights
;=========================================
do_draw_umbrella_light:
lda DIRECTION
and #$f
cmp #DIRECTION_W
bne done_draw_umbrella_notwest
lda ANIMATE_FRAME
beq skip_pump_text
lda #<pump_message
sta OUTL
lda #>pump_message
sta OUTH
jsr move_and_print
skip_pump_text:
lda PUMP_STATE
beq done_draw_umbrella
lda #5
clc
adc DRAW_PAGE
sta umbrella_smc+2
lda PUMP_STATE
lsr ; convert from 1,2,4 to 0,1,2
asl
asl ; *4
tay
lda #$d9 ; orange
; 15,20
; 19,20
; 23,20
umbrella_smc:
sta $528+15,Y
done_draw_umbrella:
rts
; clear printing pump noise if we rotate
done_draw_umbrella_notwest:
lda #0
sta ANIMATE_FRAME
rts
do_draw_crank_handle:
lda DIRECTION
cmp #DIRECTION_W
bne done_draw_it
lda CRANK_ANGLE
asl
tay
lda crank_sprites,Y
sta INL
lda crank_sprites+1,Y
sta INH
lda #17
sta XPOS
lda #32
bne draw_it
do_draw_battery_level:
lda BATTERY_CHARGE
and #7
asl
tay
lda battery_sprites,Y
sta INL
lda battery_sprites+1,Y
sta INH
lda #16
sta XPOS
lda #20
; bne draw_it
draw_it:
sta YPOS
jsr put_sprite_crop
done_draw_it:
rts
do_animate_magic_table:
; handle book rising from table
lda ANIMATE_FRAME
asl
tay
lda table_movie,Y
sta INL
lda table_movie+1,Y
sta INH
lda #18
sta XPOS
lda #14
sta YPOS
jsr put_sprite_crop
lda FRAMEL
and #$1f
bne done_animate_table
lda ANIMATE_FRAME
cmp #4
beq done_animate_table
inc ANIMATE_FRAME
done_animate_table:
rts
crank_sprites:
.word crank_sprite0,crank_sprite1,crank_sprite2,crank_sprite3
battery_sprites:
.word battery_sprite0,battery_sprite1,battery_sprite2,battery_sprite3
.word battery_sprite4,battery_sprite5,battery_sprite6,battery_sprite7
table_movie:
.word table_frame0,table_frame1,table_frame2,table_frame3
.word table_frame4
table_frame0:
.byte 5,5
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$dA,$dA,$dA,$dA
table_frame1:
.byte 5,5
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $dA,$Ad,$dA,$dA,$dA
.byte $dd,$Ad,$Ad,$Ad,$Ad
table_frame2:
.byte 5,5
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $Ad,$dd,$dd,$dd,$dd
.byte $da,$dd,$77,$7d,$da
.byte $dd,$dd,$77,$dd,$Ad
table_frame3:
.byte 5,5
.byte $AA,$dA,$dA,$da,$da
.byte $AA,$dd,$dd,$dd,$dd
.byte $AA,$dd,$dd,$dd,$dd
.byte $AA,$dd,$dd,$dd,$dd
.byte $AA,$dd,$dd,$dd,$dd
table_frame4:
.byte 5,5
.byte $AA,$07,$d7,$d7,$07
.byte $AA,$00,$dd,$dd,$dd
.byte $AA,$00,$d5,$d5,$dd
.byte $AA,$00,$dd,$dd,$dd
.byte $AA,$00,$dd,$dd,$0d
crank_sprite0:
.byte 5,5
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$dd,$AA,$AA
.byte $AA,$AA,$dd,$AA,$AA
.byte $AA,$11,$AA,$AA,$AA
crank_sprite1:
.byte 5,5
.byte $1A,$AA,$AA,$AA,$AA
.byte $A1,$dA,$dA,$AA,$AA
.byte $AA,$AA,$ad,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
crank_sprite2:
.byte 5,5
.byte $AA,$AA,$AA,$dA,$11
.byte $AA,$AA,$dA,$AA,$AA
.byte $AA,$AA,$Ad,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
crank_sprite3:
.byte 5,5
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$Ad,$AA,$AA
.byte $AA,$AA,$AA,$dA,$1d
.byte $AA,$AA,$AA,$A1,$AA
battery_sprite0:
.byte 1,7
.byte $51,$AA,$AA,$AA,$AA,$AA,$AA
battery_sprite1:
.byte 1,7
.byte $51,$AA,$AA,$AA,$AA,$AA,$FF
battery_sprite2:
.byte 1,7
.byte $51,$AA,$AA,$AA,$AA,$FF,$FF
battery_sprite3:
.byte 1,7
.byte $51,$AA,$AA,$AA,$FF,$FF,$FF
battery_sprite4:
.byte 1,7
.byte $51,$AA,$AA,$FF,$FF,$FF,$FF
battery_sprite5:
.byte 1,7
.byte $51,$AA,$FF,$FF,$FF,$FF,$FF
battery_sprite6:
.byte 1,7
.byte $51,$FF,$FF,$FF,$FF,$FF,$FF
battery_sprite7:
.byte 1,7
.byte $5c,$FF,$FF,$FF,$FF,$FF,$FF
;======================================
; telescope
;======================================
goto_telescope:
; reset to 0 each time
lda #71
sta telescope_angle
lda #STONEY_TELESCOPE_VIEW
sta LOCATION
lda #DIRECTION_E|DIRECTION_SPLIT
sta DIRECTION
jmp change_location
;===================================
; display telescope
;===================================
display_telescope:
; blink beacon (where applicable)
lda BATTERY_CHARGE
beq done_blink_beacon
lda FRAMEL
and #$40
beq beacon_off
jsr lighthouse_beacon_on
jmp done_blink_beacon
beacon_off:
jsr lighthouse_beacon_off
done_blink_beacon:
lda #16
sta XPOS
lda #18
sta YPOS
; left tile
lda telescope_angle
tay
lda telescope_tile_lookup,Y
asl
tay
lda telescope_sprites,Y
sta INL
lda telescope_sprites+1,Y
sta INH
jsr put_sprite_crop
; right tile
lda #20
sta XPOS
lda #18
sta YPOS
lda telescope_angle
tay
iny
lda telescope_tile_lookup,Y
asl
tay
lda telescope_sprites,Y
sta INL
lda telescope_sprites+1,Y
sta INH
jsr put_sprite_crop
; update angle text
; want normal text
lda #$09 ; ora
sta ps_smc1
lda #$80
sta ps_smc1+1
; smc the addresses
lda DRAW_PAGE
clc
adc #$7
sta dt_smc1+2
sta dt_smc2+2
sta dt_smc3+2
sta dt_smc4+2
sta dt_smc5+2
sta dt_smc6+2
sta dt_smc7+2
sta dt_smc8+2
sta dt_smc9+2
lda telescope_angle
ror
bcc even_angle
odd_angle:
lda #<telescope_string_odd
sta OUTL
lda #>telescope_string_odd
sta OUTH
jsr move_and_print
jsr move_and_print
; 0 should print 0 10
; 1 should print 10
; 2 should prrint 10 20
lda telescope_angle
tax
cpx #71
bne odd_not_zero
lda #' '|$80
dt_smc7:
sta $750+21
odd_not_zero:
inx
lda telescope_angle_strings,X
ora #$80
dt_smc1:
sta $750+19
lda telescope_angle_strings+1,X
ora #$80
dt_smc2:
sta $750+20
jmp done_display_telescope
even_angle:
lda #<telescope_string_even
sta OUTL
lda #>telescope_string_even
sta OUTH
jsr move_and_print
jsr move_and_print
; 0 should print 0 10
; 1 should print 10
; 2 should prrint 10 20
lda telescope_angle
and #$fe
tax
bne not_left_zero
lda #' '|$80
dt_smc8:
sta $750+17
not_left_zero:
cpx #70
bne not_right_zero
lda #' '|$80
dt_smc9:
sta $750+25
not_right_zero:
lda telescope_angle_strings,X
ora #$80
dt_smc3:
sta $750+15
lda telescope_angle_strings+1,X
ora #$80
dt_smc4:
sta $750+16
inx
inx
lda telescope_angle_strings,X
ora #$80
dt_smc5:
sta $750+23
lda telescope_angle_strings+1,X
ora #$80
dt_smc6:
sta $750+24
done_display_telescope:
; restore inverse text
lda #$29
sta ps_smc1
lda #$3f
sta ps_smc1+1
rts
; rotate the telescop
telescope_pan:
lda CURSOR_X
cmp #20
bcs telescope_right
telescope_left:
dec telescope_angle
bpl done_telescope
lda #71
bne store_telescope ; bra
telescope_right:
inc telescope_angle
lda telescope_angle
cmp #72
bne done_telescope
lda #0
store_telescope:
sta telescope_angle
done_telescope:
rts
telescope_string_odd:
.byte 16,21," : ",0
.byte 16,22," 0 ",0
telescope_string_even:
.byte 16,21,": :",0
.byte 16,22," 0 0",0
telescope_angle_strings:
.byte " 0"
.byte " 1"
.byte " 2"
.byte " 3"
.byte " 4"
.byte " 5"
.byte " 6"
.byte " 7"
.byte " 8"
.byte " 9"
.byte "10"
.byte "11"
.byte "12"
.byte "13"
.byte "14"
.byte "15"
.byte "16"
.byte "17"
.byte "18"
.byte "19"
.byte "20"
.byte "21"
.byte "22"
.byte "23"
.byte "24"
.byte "25"
.byte "26"
.byte "27"
.byte "28"
.byte "29"
.byte "30"
.byte "31"
.byte "32"
.byte "33"
.byte "34"
.byte "35"
.byte " 0"
.byte " 1"
telescope_angle:
.byte $00
telescope_tile_lookup:
.byte 2, 3, 4, 3, 0, 0 ; 0
.byte 0, 1, 0, 0, 5, 0 ; 30
.byte 6, 7, 0, 8, 9, 0 ; 60
.byte 3,10, 0, 0,11, 0 ; 90
.byte 0, 0,12,13, 0, 3 ; 120
.byte 10, 0, 0, 5, 1, 2 ; 150
.byte 11, 0,14, 0, 2,15 ; 180
.byte 9, 5, 0, 3,16, 0 ; 210
.byte 16, 1, 0, 2,16, 0 ; 240
.byte 4, 0, 0, 0, 0, 0 ; 270
.byte 3, 7, 0, 0, 0, 0 ; 300
.byte 0, 0, 2, 2, 0, 1 ; 330
.byte 2 ; 360
telescope_sprites:
.word telescope_bg0_sprite
.word telescope_bg1_sprite
.word telescope_bg2_sprite
.word telescope_bg3_sprite
.word telescope_bg4_sprite
.word telescope_bg5_sprite
.word telescope_bg6_sprite
.word telescope_bg7_sprite
.word telescope_bg8_sprite
.word telescope_bg9_sprite
.word telescope_bg10_sprite
.word telescope_bg11_sprite
.word telescope_bg12_sprite
.word telescope_bg13_sprite
.word telescope_bg14_sprite
.word telescope_bg15_sprite
.word telescope_bg16_sprite
telescope_bg0_sprite:
.byte 1,1
.byte $aa
telescope_bg1_sprite:
.byte 3,6
.byte $ff,$ff,$ff
.byte $ff,$55,$55
.byte $ff,$55,$55
.byte $57,$55,$55
.byte $55,$55,$55
.byte $55,$55,$55
telescope_bg2_sprite:
.byte 3,6
.byte $ff,$ff,$ff
.byte $ff,$ff,$ff
.byte $ff,$ff,$ff
.byte $67,$67,$67
.byte $66,$66,$55
.byte $66,$55,$55
telescope_bg3_sprite:
.byte 4,6
.byte $ff,$ff,$5f,$ff
.byte $ff,$ff,$55,$55
.byte $ff,$ff,$55,$55
.byte $67,$67,$55,$55
.byte $66,$66,$55,$55
.byte $66,$55,$55,$55
telescope_bg4_sprite:
.byte 3,6
.byte $ff,$5f,$ff
.byte $55,$55,$ff
.byte $55,$55,$ff
.byte $55,$55,$67
.byte $55,$55,$66
.byte $55,$55,$55
telescope_bg5_sprite:
.byte 3,7
.byte $ff,$55,$55
.byte $ff,$55,$55
.byte $ff,$55,$55
.byte $67,$55,$55
.byte $66,$55,$55
.byte $66,$55,$55
.byte $66,$55,$55
telescope_bg6_sprite:
.byte 4,7
.byte $ff,$ff,$ff,$55
.byte $ff,$ff,$ff,$55
.byte $ff,$ff,$55,$55
.byte $67,$67,$55,$55
.byte $66,$55,$55,$55
.byte $66,$55,$55,$55
.byte $56,$55,$55,$55
telescope_bg7_sprite:
.byte 1,7
.byte $55
.byte $55
.byte $55
.byte $55
.byte $55
.byte $55
.byte $55
telescope_bg8_sprite:
.byte 4,7
.byte $77,$77,$ff,$ff
.byte $77,$77,$ff,$ff
.byte $77,$77,$ff,$ff
.byte $77,$77,$67,$55
.byte $77,$77,$56,$55
.byte $77,$57,$55,$55
.byte $57,$55,$55,$55
telescope_bg9_sprite:
.byte 2,7
.byte $ff,$ff
.byte $ff,$ff
.byte $ff,$ff
.byte $55,$67
.byte $55,$66
.byte $55,$66
.byte $55,$55
telescope_bg10_sprite:
.byte 4,6
.byte $ff,$ff,$ff,$ff
.byte $5f,$ff,$ff,$ff
.byte $55,$ff,$7f,$ff
.byte $55,$67,$77,$67
.byte $55,$55,$77,$77
.byte $55,$55,$57,$77
telescope_bg11_sprite:
.byte 4,7
.byte $ff,$55,$ff,$5f
.byte $ff,$55,$00,$55
.byte $ff,$55,$00,$55
.byte $67,$55,$00,$55
.byte $66,$55,$00,$55
.byte $66,$55,$00,$55
.byte $66,$55,$00,$55
telescope_bg12_sprite:
.byte 4,7
.byte $ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$dd
.byte $67,$67,$ee,$ee
.byte $66,$ee,$ee,$ee
.byte $66,$ee,$ee,$ee
.byte $e6,$ee,$ee,$ee
telescope_bg13_sprite:
.byte 4,7
.byte $ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff
.byte $dd,$ff,$ff,$ff
.byte $ee,$ee,$67,$67
.byte $ee,$ee,$ee,$66
.byte $ee,$ee,$ee,$66
.byte $ee,$ee,$ee,$e6
telescope_bg14_sprite:
.byte 4,7
.byte $ff,$77,$7f,$77
.byte $ff,$77,$77,$77
.byte $ff,$77,$77,$77
.byte $55,$57,$55,$77
.byte $55,$55,$55,$77
.byte $55,$55,$55,$77
.byte $55,$55,$55,$77
telescope_bg15_sprite:
.byte 4,7
.byte $ff,$ff,$ff,$ff
.byte $ff,$ff,$ff,$ff
.byte $77,$ff,$ff,$55
.byte $77,$77,$67,$55
.byte $77,$77,$55,$55
.byte $77,$77,$55,$55
.byte $66,$66,$55,$55
telescope_bg16_sprite:
.byte 4,6
.byte $ff,$ff,$ff,$ff
.byte $55,$ff,$ff,$ff
.byte $55,$55,$55,$ff
.byte $55,$55,$55,$67
.byte $55,$55,$55,$55
.byte $55,$55,$55,$55
lighthouse_beacon_off:
lda #$dd
sta telescope_bg12_sprite+13
sta telescope_bg13_sprite+10
rts
lighthouse_beacon_on:
lda #$d1
sta telescope_bg12_sprite+13
sta telescope_bg13_sprite+10
rts
draw_exit_tunnel:
lda DIRECTION
cmp #DIRECTION_S
bne done_doorway
lda PUMP_STATE
cmp #DRAINED_EXIT
beq done_doorway
ldx #32
lda #<exit_water_list
sta INL
lda #>exit_water_list
sta INH
jmp hlin_list
draw_doorway1:
lda DIRECTION
cmp #DIRECTION_N
bne done_doorway
lda BATTERY_CHARGE
bne doorway1_draw_water
doorway1_draw_dark:
ldx #0
lda #<doorway1_dark_list
sta INL
lda #>doorway1_dark_list
sta INH
jsr hlin_list
doorway1_draw_water:
lda PUMP_STATE
cmp #DRAINED_TUNNELS
beq done_doorway
ldx #24
lda #<doorway1_water_list
sta INL
lda #>doorway1_water_list
sta INH
jmp hlin_list
draw_doorway2:
lda DIRECTION
cmp #DIRECTION_N
bne done_doorway
lda BATTERY_CHARGE
bne doorway2_draw_water
doorway2_draw_dark:
ldx #8
lda #<doorway2_dark_list
sta INL
lda #>doorway2_dark_list
sta INH
jsr hlin_list
doorway2_draw_water:
lda PUMP_STATE
cmp #DRAINED_TUNNELS
beq done_doorway
ldx #28
lda #<doorway2_water_list
sta INL
lda #>doorway2_water_list
sta INH
jmp hlin_list
done_doorway:
rts
draw_airlock_doorknob:
lda DIRECTION
cmp #DIRECTION_N
bne done_doorway
ldx #16
lda #<airlock_doorknob_list
sta INL
lda #>airlock_doorknob_list
sta INH
jmp hlin_list
draw_light_doorway:
lda DIRECTION
cmp #DIRECTION_S
bne done_doorway
lda BATTERY_CHARGE
bne done_doorway
ldx #12
lda #<doorway_light_list
sta INL
lda #>doorway_light_list
sta INH
jmp hlin_list
; at 0
doorway1_dark_list:
.byte $00,15,12
.byte $00,15,12
.byte $00,15,12
.byte $00,16,11
.byte $00,16,11
.byte $00,16,11
.byte $00,16,11
.byte $00,16,11
.byte $00,17,10
.byte $00,17,10
.byte $00,17,10
.byte $00,17,10
.byte $00,17,10
.byte $00,17,10
.byte $00,17,10
.byte $00,17,10
.byte $00,17,9
.byte $00,24,2
.byte $00,24,2
.byte $00,24,2
.byte $00,24,2
.byte $00,24,2
.byte $00,24,2
.byte $00,25,1
.byte $ff,$ff,$ff
; at 8
doorway2_dark_list:
.byte $00,16,10
.byte $00,17,9
.byte $00,17,9
.byte $00,18,8
.byte $00,19,7
.byte $00,20,5
.byte $00,21,4
.byte $00,22,3
.byte $00,23,2
.byte $00,23,2
.byte $55,21,2
.byte $55,20,3
.byte $55,16,7
.byte $55,16,7
.byte $55,16,8
.byte $55,16,8
.byte $ff,$ff,$ff
; at 12
doorway_light_list:
.byte $ff,19,2
.byte $ff,19,2
.byte $ff,19,2
.byte $ff,19,2
.byte $ff,19,2
.byte $ff,19,2
.byte $ff,$ff,$ff
; at 16
airlock_doorknob_list:
.byte $d0,19,2
.byte $ff,$ff,$ff
; at 32
exit_water_list:
.byte $26,19,2
.byte $26,18,4
.byte $26,18,4
.byte $26,17,6
.byte $ff,$ff,$ff
; at 24
doorway1_water_list:
.byte $62,17,1
.byte $62,17,2
.byte $62,17,3
.byte $62,17,4
.byte $62,17,5
.byte $ff,$ff,$ff
; at 28
doorway2_water_list:
.byte $62,21,2
.byte $62,18,5
.byte $62,17,6
.byte $ff,$ff,$ff
;======================================
; trunk
;======================================
; States: originally FULL OF WATER, PLUG CLOSED
; open plug: EMPTY OF WATER, PLUG OPEN
; water raises: FULL OF WATER, PLUG OPEN
; close plug: EMPTY OF WATER, PLUG CLOSED
;====================================
; goto the trunk close
; OR pickup floor key if applicable
;====================================
goto_trunk:
lda CURSOR_X
cmp #22
bcc goto_the_trunk ; blt
; pickup floor key?
lda TRUNK_STATE
and #TRUNK_KEY_ON_FLOOR
beq no_floor_key
pickup_floor_key:
lda TRUNK_STATE
and #<(~TRUNK_KEY_ON_FLOOR)
sta TRUNK_STATE
lda #HOLDING_KEY
sta HOLDING_ITEM
jsr update_inside_lighthouse_action
no_floor_key:
rts
goto_the_trunk:
lda #STONEY_TRUNK_CLOSE
sta LOCATION
jmp change_location
trunk_open_plug:
; TOGGLE TRUNK_VALVE_OPEN
; CLEAR FULL_OF_WATER
; if full of water, start animation
lda TRUNK_STATE
and #TRUNK_WATER_DRAINED
bne water_already_gone
lda #12
bne water_water_water ; bra
water_already_gone:
lda #0
water_water_water:
sta ANIMATE_FRAME
lda TRUNK_STATE
eor #TRUNK_VALVE_OPEN
ora #TRUNK_WATER_DRAINED
sta TRUNK_STATE
rts
;===============================
; draw the close-in-trunk puzzle
;===============================
draw_trunk_close:
lda TRUNK_STATE
and #TRUNK_VALVE_OPEN
bne draw_trunk_plug_open
draw_trunk_plug_closed:
lda #7
sta XPOS
lda #40
sta YPOS
lda #<trunk_plug_closed_sprite
sta INL
lda #>trunk_plug_closed_sprite
sta INH
jsr put_sprite_crop
jmp done_draw_trunk_plug
draw_trunk_plug_open:
lda #10
sta XPOS
lda #44
sta YPOS
lda #<trunk_plug_open_sprite
sta INL
lda #>trunk_plug_open_sprite
sta INH
jsr put_sprite_crop
done_draw_trunk_plug:
lda ANIMATE_FRAME
beq totally_done_draw_trunk_plug
; animate water coming out
ror ; get low bit into carry
bcc trunk_water_even
trunk_water_odd:
lda #<trunk_plug_water1_sprite
sta INL
lda #>trunk_plug_water1_sprite
sta INH
bne trunk_water_draw ; bra
trunk_water_even:
lda #<trunk_plug_water0_sprite
sta INL
lda #>trunk_plug_water0_sprite
sta INH
trunk_water_draw:
lda #7
sta XPOS
lda #44
sta YPOS
jsr put_sprite_crop
lda FRAMEL
and #$1f
bne totally_done_draw_trunk_plug
dec ANIMATE_FRAME
totally_done_draw_trunk_plug:
rts
; at 7,40
trunk_plug_closed_sprite:
.byte 2,2
.byte $79,$97
.byte $77,$79
; at 10,44
trunk_plug_open_sprite:
.byte 2,2
.byte $9d,$88
.byte $79,$98
; at 7,44
trunk_plug_water0_sprite:
.byte 2,2
.byte $67,$72
.byte $62,$77
trunk_plug_water1_sprite:
.byte 2,2
.byte $27,$76
.byte $26,$77
;=================================
; handle inside lighthouse
;=================================
; if to right, rotate to ladder
; if attached key, animate it
; if trunk up and open, pick up key
; if trunk up and closed, ignore
; if trunk down, go down
handle_inside_lighthouse:
lda CURSOR_X
cmp #27
bcs rotate_to_ladder ; bge
lda CURSOR_Y
cmp #37
bcc inside_other ; blt
lda CURSOR_X
cmp #19
bcc inside_other ; blt
start_key_animation:
lda #0
sta FRAMEL
lda #1
sta ANIMATE_FRAME
rts
inside_other:
; if water-up-not-open do nothing
; if water-down, go down steps
; if water-up-open - grab key
lda PUMP_STATE
cmp #DRAINED_LIGHTHOUSE
bne inside_water_up
inside_and_drained:
lda #STONEY_LIGHTHOUSE_SPIRAL
sta LOCATION
jmp change_location
inside_water_up:
lda TRUNK_STATE
and #TRUNK_LID_OPEN
beq inside_water_do_nothing
; take key
lda TRUNK_STATE
ora #TRUNK_KEY_TAKEN
sta TRUNK_STATE
; switch cursor to have key
lda #HOLDING_KEY
sta HOLDING_ITEM
; HACK
; swap out so we can open lock now
jsr update_inside_lighthouse_action
inside_water_do_nothing:
rts
rotate_to_ladder:
lda #DIRECTION_E
sta DIRECTION
jmp change_direction
;=============================
; draw inside of lighthouse
;=============================
draw_inside_lighthouse:
lda DIRECTION
and #$f
cmp #DIRECTION_N
bne done_draw_inside_lighthouse
looking_toward_trunk:
; if trunk is open and key not taken, draw it
lda TRUNK_STATE
and #(TRUNK_KEY_TAKEN|TRUNK_LID_OPEN)
cmp #TRUNK_LID_OPEN
bne dont_draw_key
lda #16
sta XPOS
lda #30
sta YPOS
lda #<trunk_key_sprite
sta INL
lda #>trunk_key_sprite
sta INH
jsr put_sprite_crop
dont_draw_key:
lda ANIMATE_FRAME
; since 0 is the static image, we can just treat
; as always being animated
asl
tay
lda animate_key_frames,Y
sta INL
lda animate_key_frames+1,Y
sta INH
lda #18
sta XPOS
lda #36
sta YPOS
jsr put_sprite_crop
; increment animation
lda ANIMATE_FRAME
beq done_draw_inside_lighthouse
lda FRAMEL
and #$1f
bne done_draw_inside_lighthouse
inc ANIMATE_FRAME
lda ANIMATE_FRAME
cmp #8
bne done_draw_inside_lighthouse
; done animating
lda #0
sta ANIMATE_FRAME
; open trunk but only if trunk is up
; so if TRUNK_STATE & TRUNK_WATER_DRAINED = 1
; and PUMP_STATE & DRAINED_LIGHTHOUSE = 0
lda PUMP_STATE
and #DRAINED_LIGHTHOUSE
bne dont_open_trunk
lda TRUNK_STATE
and #TRUNK_WATER_DRAINED
beq dont_open_trunk
lda TRUNK_STATE
ora #TRUNK_LID_OPEN
sta TRUNK_STATE
; actually change background
jsr update_pump_state
jsr change_direction
dont_open_trunk:
done_draw_inside_lighthouse:
rts
animate_key_frames:
.word key_frame0_sprite ; 0
.word key_frame0_sprite ; 1
.word key_frame1_sprite ; 2
.word key_frame2_sprite ; 3
.word key_frame3_sprite ; 4
.word key_frame4_sprite ; 5
.word key_frame5_sprite ; 6
.word key_frame4_sprite ; 7
.word key_frame5_sprite ; 8
; at 18, 36
key_frame0_sprite:
.byte 10,5
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$0A,$0A,$0A,$00,$0A,$AA
.byte $AA,$AA,$0A,$AA,$A0,$AA,$AA,$00,$A0,$0A
.byte $AA,$AA,$A0,$00,$0A,$0A,$0A,$0A,$0A,$A0
key_frame1_sprite:
.byte 9,5
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$AA,$AA,$AA,$AA,$0A,$AA,$AA
.byte $AA,$AA,$AA,$00,$A0,$A0,$00,$00,$AA
.byte $AA,$AA,$0A,$AA,$AA,$AA,$A0,$AA,$00
.byte $AA,$AA,$A0,$00,$0A,$0A,$0A,$0A,$A0
key_frame2_sprite:
.byte 8,5
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
.byte $AA,$AA,$0A,$0A,$0A,$00,$0A,$AA
.byte $AA,$AA,$A0,$AA,$AA,$00,$A0,$0A
.byte $AA,$AA,$0A,$AA,$AA,$AA,$AA,$00
.byte $AA,$AA,$A0,$00,$0A,$0A,$0A,$A0
key_frame3_sprite:
.byte 8,5
.byte $AA,$AA,$AA,$AA,$0A,$AA,$AA,$AA
.byte $AA,$00,$A0,$A0,$00,$00,$AA,$AA
.byte $AA,$AA,$AA,$AA,$A0,$AA,$A0,$0A
.byte $AA,$AA,$0A,$AA,$AA,$AA,$0A,$A0
.byte $AA,$AA,$A0,$00,$0A,$0A,$A0,$AA
key_frame4_sprite:
.byte 7,5
.byte $0A,$0A,$0A,$00,$0A,$AA,$AA
.byte $A0,$AA,$AA,$00,$A0,$0A,$AA
.byte $AA,$AA,$AA,$AA,$AA,$AA,$00
.byte $AA,$AA,$0A,$AA,$AA,$AA,$00
.byte $AA,$AA,$A0,$00,$0A,$0A,$A0
key_frame5_sprite:
.byte 7,5
.byte $0A,$0A,$0A,$00,$0A,$AA,$AA
.byte $AA,$AA,$AA,$A0,$AA,$00,$AA
.byte $AA,$AA,$AA,$AA,$AA,$AA,$00
.byte $AA,$AA,$0A,$AA,$AA,$AA,$00
.byte $AA,$AA,$A0,$00,$0A,$0A,$A0
; at 16,30
trunk_key_sprite:
.byte 5,2
.byte $AA,$AA,$AA,$0A,$0A
.byte $00,$A0,$A0,$00,$A0
;============================
; update hatch state
;============================
update_hatch_state:
; default is locked and can't go to top
lda TRUNK_STATE
and #TRUNK_HATCH_OPEN
beq close_hatch
open_hatch:
ldy #LOCATION_EAST_EXIT
lda #STONEY_LIGHTHOUSE_UPSTAIRS
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
ldy #LOCATION_EAST_BG
lda #<lighthouse_inside_e_lzsa
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
lda #>lighthouse_inside_e_lzsa
sta location5+1,Y ; STONEY_LIGHTHOUSE_INSIDE
rts
close_hatch:
ldy #LOCATION_EAST_EXIT
lda #$ff
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
ldy #LOCATION_EAST_BG
lda #<lighthouse_inside_locked_e_lzsa
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
lda #>lighthouse_inside_locked_e_lzsa
sta location5+1,Y ; STONEY_LIGHTHOUSE_INSIDE
rts
;========================
; update inside lighthouse action
;========================
; change action behavior if holding key
update_inside_lighthouse_action:
lda HOLDING_ITEM
cmp #HOLDING_KEY
bne normal_action
holding_action:
ldy #LOCATION_SPECIAL_EXIT
lda #DIRECTION_E
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
ldy #LOCATION_SPECIAL_X1
lda #12
sta location5,Y
lda #19
sta location5+1,Y
lda #8
sta location5+2,Y
lda #20
sta location5+3,Y
ldy #LOCATION_SPECIAL_FUNC
lda #<(unlock_hatch-1)
sta location5,Y
lda #>(unlock_hatch-1)
sta location5+1,Y
rts
normal_action:
ldy #LOCATION_SPECIAL_EXIT
lda #DIRECTION_N
sta location5,Y ; STONEY_LIGHTHOUSE_INSIDE
ldy #LOCATION_SPECIAL_X1
lda #10
sta location5,Y
lda #35
sta location5+1,Y
lda #20
sta location5+2,Y
lda #44
sta location5+3,Y
ldy #LOCATION_SPECIAL_FUNC
lda #<(handle_inside_lighthouse-1)
sta location5,Y
lda #>(handle_inside_lighthouse-1)
sta location5+1,Y
rts
;========================
; unlock the hatch
;========================
; FIXME: show animation?
; drop key?
; in actual game you still have to manually open hatch
; after the lock falls off
unlock_hatch:
; drop key
lda #0
sta HOLDING_ITEM
jsr update_inside_lighthouse_action
; unlock the hatch
lda TRUNK_STATE
ora #TRUNK_HATCH_OPEN
ora #TRUNK_KEY_ON_FLOOR ; drop key on floor
sta TRUNK_STATE
jsr update_hatch_state
jmp change_direction
;========================
; draw floor key
;========================
draw_floor_key:
lda TRUNK_STATE
and #TRUNK_KEY_ON_FLOOR
beq done_draw_floor_key
lda #23
sta XPOS
lda #34
sta YPOS
lda #<trunk_key_sprite
sta INL
lda #>trunk_key_sprite
sta INH
jsr put_sprite_crop
done_draw_floor_key:
rts