;========================== ; o/` Standing in my yard ; where they tore down the garage ; to make room for the torn down garage o/` ; first time changes from book to fly animation ; second time switches us to selenetic, plays sound ; disables organ and display ; FIXME: cannot save game in ship on selena ; as selena.s resets puzzle back to myst on entry dome_pressed: lda ANIMATE_FRAME cmp #13 bcs dome_press_second ; bge dome_press_first: ; open book and look at flyover lda #13 sta ANIMATE_FRAME rts dome_press_second: ; link through! lda #0 sta ANIMATE_FRAME ; disable the organ and controls ldy #LOCATION_SPECIAL_EXIT lda #$ff sta location1,Y ; disable controls sta location2,Y ; disable organ sta location0,Y ; disable mist exit ; re-route door to selena ldy #LOCATION_NORTH_EXIT lda #SELENA_WALKWAY1 sta location0,Y ldy #LOCATION_NORTH_EXIT_DIR lda #DIRECTION_N sta location0,Y ldy #LOCATION_NORTH_BG lda #spaceship_inside_selena_n_lzsa sta location0+1,Y ; clear screen lda #0 sta clear_all_color+1 jsr clear_all jsr page_flip jsr clear_all jsr page_flip ;==================================== ; play link noise jsr play_link_noise ; be sure rocket settings are same if we come back jsr save_rocket_state ; hack, why is this needed? screen at $c00 corrupted? ; oh... maybe the load from disk over-writes $c00 jsr change_location rts organ_pressed: ldy #0 lda CURSOR_Y cmp #27 bcs organ_regular ; bge organ_sharps: ; urgh nonsymmetric, this is way cheating ; FIXME: if actually on a white key, then jump and check regular? lda CURSOR_X cmp #11-1 bcc done_organ_sharps iny cmp #13-1 bcc done_organ_sharps iny cmp #18-1 bcc done_organ_sharps iny cmp #20-1 bcc done_organ_sharps iny cmp #22-1 bcc done_organ_sharps iny cmp #27-1 bcc done_organ_sharps iny done_organ_sharps: lda sharp_notes,Y jmp done_organ_freq organ_regular: ; urgh nonsymmetric, this is way cheating lda CURSOR_X cmp #10-1 bcc done_organ_regular iny cmp #12-1 bcc done_organ_regular iny cmp #14-1 bcc done_organ_regular iny cmp #17-1 bcc done_organ_regular iny cmp #20-1 bcc done_organ_regular iny cmp #22-1 bcc done_organ_regular iny cmp #24-1 bcc done_organ_regular iny cmp #27-1 bcc done_organ_regular iny cmp #30-1 bcc done_organ_regular iny done_organ_regular: lda regular_notes,Y done_organ_freq: sta speaker_frequency organ_tone: lda #25 sta speaker_duration jsr speaker_tone rts regular_notes: .byte NOTE_C4,NOTE_D4,NOTE_E4,NOTE_F4,NOTE_G4,NOTE_A4,NOTE_B4 .byte NOTE_C5,NOTE_D5,NOTE_E5 sharp_notes: .byte NOTE_CSHARP4,NOTE_DSHARP4,NOTE_FSHARP4,NOTE_GSHARP4,NOTE_ASHARP4 .byte NOTE_CSHARP5,NOTE_DSHARP5 all_notes: .byte NOTE_C4,NOTE_CSHARP4,NOTE_D4,NOTE_DSHARP4,NOTE_E4,NOTE_F4 .byte NOTE_FSHARP4,NOTE_G4,NOTE_GSHARP4,NOTE_A4,NOTE_ASHARP4,NOTE_B4 .byte NOTE_C5,NOTE_CSHARP5,NOTE_D5,NOTE_DSHARP5,NOTE_E5 ;========================= ; draw the buttons ;========================= spaceship_draw_buttons: ldx #0 draw_ss_buttons_outer_loop: ldy #28 ; 13,28 draw_ss_buttons_loop: lda gr_offsets,Y clc adc #13 ; 13,28 sta ss_buttons_smc+1 iny lda gr_offsets,Y clc adc DRAW_PAGE sta ss_buttons_smc+2 iny ; calculate slider status ; i.e. color ; if Y matches slide ; Y=26 and ROCKET_NOTE1=0 $50 ; Y=26 and ROCKET_NOTE1=1 $05 ; Y=24 and ROCKET_NOTE1=2 $50 ; Y=24 and ROCKET_NOTE1=3 $05 ; Y=22 and ROCKET_NOTE1=4 $50 ; Y=22 and ROCKET_NOTE1=5 $05 ; if Y==44-(RN&0xfe) (44 because pre-incremented) lda rocket_notes,X and #$fe sta TEMP lda #44 sec sbc TEMP sta TEMP ; see if draw or not cpy TEMP bne ss_button_none ; we are drawing cpx ROCKET_HANDLE_STEP bcc ss_button_green ss_button_grey: lda rocket_notes,X and #$1 beq ss_button_grey_bottom ss_button_grey_top: lda #$05 bne ss_buttons_smc ss_button_grey_bottom: lda #$50 bne ss_buttons_smc ss_button_green: lda rocket_notes,X and #$1 beq ss_button_green_bottom ss_button_green_top: lda #$0C bne ss_buttons_smc ss_button_green_bottom: lda #$C0 bne ss_buttons_smc ss_button_none: lda #$00 ss_buttons_smc: sta $400,X cpy #44 bne draw_ss_buttons_loop inx inx cpx #8 bne draw_ss_buttons_outer_loop rts ROCKET_SOLUTION_0 = 0 ; NOTE_C4 ROCKET_SOLUTION_1 = 12 ; NOTE_C5 ROCKET_SOLUTION_2 = 15 ; NOTE_DSHARP5 ROCKET_SOLUTION_3 = 5 ; NOTE_F4 ; twice as many as necessary as X increments by two rocket_notes: ; .byte ROCKET_SOLUTION_0,$00,ROCKET_SOLUTION_1,$00 ; .byte ROCKET_SOLUTION_2,$00,ROCKET_SOLUTION_3,$00 .byte $00,$00,$00,$00 .byte $00,$00,$00,$00 controls_pressed: lda CURSOR_X cmp #21 bcs handle_pulled ; bge sliders_pressed: sec sbc #12 tax ; if CURSOR_Y-28 > rocket_notes, increment ; if CURSOR_Y-28 < rocket_notes, decrement ; 0..14 ; rocket ypos ypos-28 15-(ypos-28) ; 0 = 42 14 0 ; 1 = 42 14 0 ; 2 = 40 12 2 ; 3 = 40 12 2 ; 4 = 38 10 4 ; 5 = 38 10 4 ; ... ; 13 = 28 0 14 ; 14 = 28 0 14 lda CURSOR_Y sec sbc #28 sta TEMP lda #15 sec sbc TEMP cmp rocket_notes,X beq slider_play_note bpl slider_decrement slider_increment: lda rocket_notes,X beq slider_play_note ; don't make smaller than 0 dec rocket_notes,X jmp slider_play_note slider_decrement: lda rocket_notes,X cmp #15 bcs slider_play_note ; done make larger than 14 inc rocket_notes,X slider_play_note: lda rocket_notes,X tax lda all_notes,X sta speaker_frequency lda #25 sta speaker_duration jsr speaker_tone rts ; 22,30 handle_pull_sprite: .byte 3,6 .byte $dd,$0d,$dd .byte $dd,$00,$dd .byte $99,$00,$dd .byte $99,$00,$dd .byte $d9,$00,$dd .byte $26,$26,$26 handle_pulled: ;================================== ; turn buttons green one at a time lda #1 sta ROCKET_HANDLE_STEP handle_pull_draw_buttons: jsr gr_copy_to_current lda #handle_pull_sprite sta INH lda #22 sta XPOS lda #30 sta YPOS jsr put_sprite_crop jsr page_flip lda DRAW_PAGE ; draw to visible screen eor #$4 sta DRAW_PAGE ldx #0 draw_handle_buttons_outer_loop: ; tya ; pha txa pha jsr spaceship_draw_buttons pla tax pha lda rocket_notes,X tax lda all_notes,X sta speaker_frequency lda #100 sta speaker_duration jsr speaker_tone pla tax ; pla ; tay inc ROCKET_HANDLE_STEP inc ROCKET_HANDLE_STEP inx inx cpx #8 bne draw_handle_buttons_outer_loop lda DRAW_PAGE ; flip back to way it was eor #$4 sta DRAW_PAGE lda #0 sta ROCKET_HANDLE_STEP ; check to see if right code lda rocket_notes cmp #ROCKET_SOLUTION_0 bne done_checking_code lda rocket_notes+2 cmp #ROCKET_SOLUTION_1 bne done_checking_code lda rocket_notes+4 cmp #ROCKET_SOLUTION_2 bne done_checking_code lda rocket_notes+6 cmp #ROCKET_SOLUTION_3 bne done_checking_code correct_code: ; start animation lda #1 sta ANIMATE_FRAME ; move action to dome ldy #LOCATION_SPECIAL_X1 lda #15 sta location1+0,Y lda #24 sta location1+1,Y lda #2 sta location1+2,Y lda #18 sta location1+3,Y ; also switch to not point ldy #LOCATION_EAST_EXIT_DIR lda #DIRECTION_E sta location0,Y sta DIRECTION ; change action ldy #LOCATION_SPECIAL_FUNC lda #<(dome_pressed-1) sta location1,Y lda #>(dome_pressed-1) sta location1+1,Y ; yes, I think in real life you can mess with sliders after ; you activate book, but not sure it's worth trouble of doing ; that in our version done_checking_code: rts selena_movie: ; static .word static1_sprite,static1_sprite,static2_sprite,static3_sprite .word static2_sprite,static3_sprite,static2_sprite,static3_sprite .word static1_sprite ; book .word book1_sprite,book2_sprite,book3_sprite,book4_sprite ; flyover .word static3_sprite .word flyover1_sprite,flyover2_sprite,flyover3_sprite .word flyover4_sprite,flyover5_sprite,flyover6_sprite .word flyover7_sprite,flyover8_sprite,flyover9_sprite .word flyover10_sprite static1_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$60,$26,$62,$20,$00 .byte $20,$67,$26,$62,$20,$60 .byte $26,$62,$20,$72,$26,$62 .byte $20,$72,$26,$62,$26,$67 .byte $26,$62,$26,$67,$06,$62 .byte $00,$67,$06,$67,$06,$00 .byte $80,$00,$06,$02,$00,$88 static2_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$70,$72,$72,$70,$00 .byte $60,$26,$66,$66,$62,$60 .byte $72,$02,$72,$72,$02,$72 .byte $20,$20,$20,$00,$20,$20 .byte $62,$60,$62,$62,$62,$62 .byte $00,$72,$76,$72,$06,$00 .byte $80,$00,$02,$02,$00,$88 static3_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$20,$72,$26,$70,$00 .byte $20,$70,$20,$70,$20,$70 .byte $72,$26,$72,$26,$72,$26 .byte $20,$70,$20,$70,$20,$70 .byte $76,$22,$76,$22,$76,$22 .byte $00,$20,$70,$20,$00,$00 .byte $80,$00,$02,$06,$00,$88 book1_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$50,$55,$55,$50,$00 .byte $60,$05,$15,$15,$05,$50 .byte $66,$00,$11,$11,$11,$55 .byte $66,$00,$11,$11,$11,$75 .byte $66,$00,$11,$11,$01,$77 .byte $00,$66,$67,$77,$07,$00 .byte $80,$00,$06,$07,$00,$88 book2_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$50,$55,$55,$10,$00 .byte $60,$05,$11,$11,$11,$50 .byte $66,$00,$11,$11,$11,$15 .byte $66,$60,$01,$11,$11,$f0 .byte $66,$66,$00,$f1,$7f,$77 .byte $00,$66,$60,$77,$07,$00 .byte $80,$00,$06,$07,$00,$88 book3_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$50,$55,$55,$50,$00 .byte $60,$05,$15,$05,$f5,$50 .byte $66,$00,$11,$11,$ff,$55 .byte $66,$00,$11,$11,$ff,$55 .byte $66,$00,$11,$01,$ff,$77 .byte $00,$66,$67,$77,$07,$00 .byte $80,$00,$06,$07,$00,$88 book4_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$50,$55,$55,$50,$00 .byte $60,$65,$05,$15,$15,$50 .byte $66,$66,$00,$11,$11,$ff .byte $66,$00,$11,$11,$f1,$7f .byte $66,$00,$11,$11,$ff,$77 .byte $00,$66,$61,$70,$0f,$00 .byte $80,$00,$06,$07,$00,$88 flyover1_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$EE,$EE,$E0,$00 .byte $50,$55,$5E,$EE,$EE,$E0 .byte $55,$55,$55,$EE,$EE,$EE .byte $85,$85,$85,$85,$6e,$6e .byte $88,$88,$88,$88,$88,$66 .byte $00,$68,$66,$66,$08,$00 .byte $80,$00,$06,$06,$00,$88 flyover2_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$EE,$EE,$E0,$00 .byte $50,$ee,$ee,$EE,$EE,$E0 .byte $55,$5e,$55,$EE,$EE,$EE .byte $85,$65,$65,$6e,$6e,$6e .byte $88,$86,$66,$66,$66,$66 .byte $00,$68,$66,$66,$06,$00 .byte $80,$00,$06,$06,$00,$88 flyover3_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$EE,$EE,$E0,$00 .byte $e0,$ee,$ee,$EE,$EE,$E0 .byte $55,$5e,$ee,$EE,$EE,$EE .byte $85,$65,$6e,$6e,$6e,$6e .byte $68,$66,$66,$66,$66,$66 .byte $00,$66,$66,$66,$06,$00 .byte $80,$00,$06,$06,$00,$88 flyover4_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$EE,$EE,$E0,$00 .byte $e0,$ee,$ee,$EE,$88,$E0 .byte $ee,$ee,$ee,$EE,$88,$EE .byte $85,$6e,$6e,$6e,$68,$6e .byte $66,$66,$66,$66,$66,$66 .byte $00,$66,$66,$66,$06,$00 .byte $80,$00,$06,$06,$00,$88 flyover5_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$EE,$EE,$E0,$00 .byte $e0,$ee,$8e,$EE,$55,$E0 .byte $ee,$8e,$88,$5e,$55,$88 .byte $6e,$68,$68,$6e,$65,$68 .byte $66,$66,$66,$66,$66,$66 .byte $00,$66,$66,$66,$06,$00 .byte $80,$00,$06,$06,$00,$88 flyover6_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$8E,$EE,$E0,$00 .byte $e0,$ee,$88,$55,$88,$E0 .byte $ee,$88,$88,$55,$88,$05 .byte $66,$88,$66,$65,$68,$66 .byte $66,$66,$66,$66,$66,$66 .byte $00,$66,$66,$66,$06,$00 .byte $80,$00,$06,$06,$00,$88 flyover7_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$E0,$eE,$98,$E0,$00 .byte $90,$ee,$ee,$89,$ee,$E0 .byte $98,$88,$ee,$99,$ee,$8e .byte $98,$88,$65,$99,$8e,$88 .byte $66,$68,$66,$99,$66,$68 .byte $00,$66,$66,$89,$06,$00 .byte $80,$00,$06,$06,$00,$88 flyover8_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$80,$8E,$8e,$90,$00 .byte $e0,$e8,$88,$99,$99,$E0 .byte $88,$ee,$99,$99,$9e,$ee .byte $88,$55,$89,$99,$99,$8e .byte $88,$55,$88,$89,$99,$88 .byte $00,$55,$88,$88,$09,$00 .byte $80,$00,$08,$08,$00,$88 flyover9_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$e0,$ee,$ee,$e0,$00 .byte $e0,$ee,$ee,$ee,$8e,$E0 .byte $ee,$ee,$ee,$ee,$88,$ee .byte $ee,$ee,$ee,$ee,$88,$ee .byte $55,$5e,$88,$55,$88,$88 .byte $00,$55,$55,$66,$06,$00 .byte $80,$00,$05,$05,$00,$88 flyover10_sprite: .byte 6,8 .byte $08,$00,$00,$00,$08,$88 .byte $00,$e0,$ee,$ee,$e0,$00 .byte $e0,$ee,$ee,$ee,$ee,$E0 .byte $ee,$ee,$ee,$ee,$ee,$ee .byte $ee,$ee,$ee,$ee,$ee,$ee .byte $66,$6e,$6e,$ee,$8e,$ee .byte $00,$11,$11,$66,$08,$00 .byte $80,$00,$06,$06,$00,$88