mist: selena: hook up sound/door puzzle

This commit is contained in:
Vince Weaver 2020-07-31 00:56:40 -04:00
parent bd0d1b418a
commit 30f33cac95
5 changed files with 336 additions and 10 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 968 B

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -138,7 +138,7 @@ location6:
.byte $ff ; west exit
.byte DIRECTION_N ; north exit_dir
.byte DIRECTION_S ; south exit_dir
.byte DIRECTION_E ; east exit_dir
.byte DIRECTION_E|DIRECTION_SPLIT ; east exit_dir
.byte $ff ; west exit_dir
.word bunker_n_lzsa ; north bg
.word bunker_s_lzsa ; south bg
@ -782,9 +782,9 @@ location41:
.word $0000 ; west bg
.byte BG_EAST
.byte DIRECTION_E ; special exit
.byte 12,28 ; special x
.byte 10,32 ; special y
.word keypad_press-1 ; special function
.byte 10,30 ; special x
.byte 8,32 ; special y
.word door_controls_pressed-1 ; special function
; SELENA_WALKWAY2 -- walkway2
location42:

View File

@ -101,6 +101,9 @@ game_loop:
cmp #SELENA_CONTROLS
beq controls_animation
cmp #SELENA_BUNKER_KEYPAD
beq fg_draw_door_controls
cmp #SELENA_WATER
beq fg_draw_blue_page ; and water note
@ -122,6 +125,10 @@ game_loop:
jmp nothing_special
fg_draw_door_controls:
jsr door_draw_buttons
jmp nothing_special
controls_animation:
ldy #LOCATION_SPECIAL_EXIT
@ -413,10 +420,10 @@ antenna_mid_down:
;==============================
; keypad actions
keypad_press:
lda #SELENA_BUNKER_OPEN
sta LOCATION
jmp change_location
;keypad_press:
; lda #SELENA_BUNKER_OPEN
; sta LOCATION
; jmp change_location
;==========================
; includes

View File

@ -969,11 +969,329 @@ tunnel_bg_sprite:
;
; solution = 5 - 9 - 0 - 6 - 7
LOCK_SOLUTION_1 = 5 ; flute
LOCK_SOLUTION_2 = 9 ; water
LOCK_SOLUTION_3 = 0 ; wind
LOCK_SOLUTION_4 = 6 ; flame
LOCK_SOLUTION_5 = 7 ; clocks
; if it's right and press button, plays each sound in turn
; while lights up button, then opens door and puts
; you in front of it.
; if it's wrong ---> ?
door_sound_table:
.word sound5_tunnel ; [RUSHING WIND] door0
.word door1_whistle ; [SLIDE WHISTLE] door1
.word door2_train ; [TRAIN WHISTLE] door2
.word door3_missile ; [MISSILE LAUNCH] door3
.word door4_sparks ; [ELECTRIC SPARKS] door4
.word sound4_crystals ; [FLUTE-LIKE WHISTLE] door5
.word sound2_flame ; [ROARING FIRE] door6
.word sound3_clocks ; [CLOCK TICKING] door7
.word door8_metal ; [CLANKING METAL] door8
.word sound1_water ; [RUNNING WATER] door9
door1_whistle:
.byte 12,21,"[SLIDE WHISTLE]",0
door2_train:
.byte 12,21,"[TRAIN WHISTLE]",0
door3_missile:
.byte 12,21,"[MISSILE LAUNCH]",0
door4_sparks:
.byte 11,21,"[ELECTRIC SPARKS]",0
door8_metal:
.byte 12,21,"[CLANKING METAL]",0
;===============================
; draw the buttons on door panel
;===============================
door_draw_buttons:
; print last sound pressed
lda ANIMATE_FRAME ; depend on this being 0 at entry
bne no_need_to_init
lda #0
sta LAST_PLAYED
inc ANIMATE_FRAME
no_need_to_init:
lda LAST_PLAYED
beq no_need_to_print
asl
tay
dey
dey
lda door_sound_table,Y
sta OUTL
lda door_sound_table+1,Y
sta OUTH
jsr move_and_print
no_need_to_print:
ldx #0
draw_door_buttons_outer_loop:
ldy #10 ; 13,10
draw_door_buttons_loop:
; set the output address for current Y
lda gr_offsets,Y
clc
adc #13 ; 13,10
sta door_buttons_smc+1
iny
lda gr_offsets,Y
clc
adc DRAW_PAGE
sta door_buttons_smc+2
iny
; if Y==(RN*2) + 10+2 (pre incremented)
txa
lsr
tax ; X is *2, convert down to load lock value
lda SELENA_LOCK1,X
asl
clc
adc #12
sta TEMP
txa ; convert X back to *2
asl
tax
; see if draw or not
cpy TEMP
bne door_button_none
; we are drawing
lda ROCKET_HANDLE_STEP
beq door_button_plain
sta TEMP
dec TEMP
cpx TEMP
beq door_button_green
door_button_plain:
lda #$48
bne draw_door_button ; bra
door_button_green:
lda #$c8
bne draw_door_button
door_button_none:
lda #$00
draw_door_button:
door_buttons_smc:
sta $400,X
cpy #30
bne draw_door_buttons_loop
inx
inx
cpx #10
bne draw_door_buttons_outer_loop
rts
door_controls_pressed:
lda CURSOR_X
cmp #23
bcs door_button_pressed ; bge
door_sliders_pressed:
sec
sbc #10 ; get X to be which slider
lsr
tax
; if (CURSOR_Y-10)/2 > selena_lock, increment
; if (CURSOR_Y-10)/2 < selena_lock, decrement
; cursor_y is 10 .. 28
; subtract 10, is 0 to 18
lda CURSOR_Y
sec
sbc #10
lsr
cmp SELENA_LOCK1,X
beq door_slider_play_tone ; cliked on it, play tone
bpl door_slider_increment ; clicked above, increment
door_slider_decrement:
lda SELENA_LOCK1,X
beq door_slider_play_tone ; don't make smaller than 0
dec SELENA_LOCK1,X
jmp door_slider_play_tone
door_slider_increment:
lda SELENA_LOCK1,X
cmp #9
bcs door_slider_play_tone ; don't make larger than 9
inc SELENA_LOCK1,X
door_slider_play_tone:
lda SELENA_LOCK1,X
clc
adc #1 ; 0 means no display, so offset by 1
sta LAST_PLAYED
rts
door_button_pressed:
;==================================
; turn buttons green one at a time
lda #1
sta ROCKET_HANDLE_STEP
door_button_draw_buttons:
ldx #0
door_buttons_outer_loop:
lda SELENA_LOCK1,X
sta LAST_PLAYED
inc LAST_PLAYED ; value we want is 1+value
txa
pha
jsr gr_copy_to_current
lda #25
sta XPOS
lda #24
sta YPOS
lda #<red_button_sprite
sta INL
lda #>red_button_sprite
sta INH
jsr put_sprite_crop
; lda DRAW_PAGE ; draw to visible screen
; eor #$4
; sta DRAW_PAGE
; ldx #0
jsr door_draw_buttons
; pla
; tax
; pha
jsr page_flip
; play sound
; we delay instead
ldx #10
long_fake_sound:
lda #200
jsr WAIT
dex
bne long_fake_sound
pla
tax
inc ROCKET_HANDLE_STEP
inc ROCKET_HANDLE_STEP
check_end:
inx
cpx #5
bne door_buttons_outer_loop
; lda DRAW_PAGE ; flip back to way it was
; eor #$4
; sta DRAW_PAGE
lda #0
sta ROCKET_HANDLE_STEP
sta LAST_PLAYED
; check to see if right code
lda SELENA_LOCK1
cmp #LOCK_SOLUTION_1
bne done_checking_door_code
lda SELENA_LOCK2
cmp #LOCK_SOLUTION_2
bne done_checking_door_code
lda SELENA_LOCK3
cmp #LOCK_SOLUTION_3
bne done_checking_door_code
lda SELENA_LOCK4
cmp #LOCK_SOLUTION_4
bne done_checking_door_code
lda SELENA_LOCK5
cmp #LOCK_SOLUTION_5
bne done_checking_door_code
door_correct_code:
; open door
lda #SELENA_BUNKER_OPEN
sta LOCATION
lda #DIRECTION_E
sta DIRECTION
jsr change_location
done_checking_door_code:
rts
red_button_sprite:
.byte 3,2
.byte $19,$11,$19
.byte $91,$11,$91

View File

@ -283,8 +283,9 @@ LOCATIONS_L = $E2
LOCATIONS_H = $E3
; temp var per-world define
LONG_FRAME = $E4
CURRENT_DISPLAY = $E4
LONG_FRAME = $E4 ; nibel
CURRENT_DISPLAY = $E4 ; selena
LAST_PLAYED = $E4 ; selena
DISP_PAGE = $ED ; ALL
DRAW_PAGE = $EE ; ALL