From dfbc2ea12c17ede73f494ec0e5796d3812474392 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 14 Jul 2020 14:56:50 -0400 Subject: [PATCH] mist: can open safe also (bceause we're messing with special cursors) update the stoney code --- mist/Makefile | 2 +- mist/cabin_boiler_puzzle.s | 27 +++- mist/common_defines.inc | 1 + mist/default_save.s | 2 +- mist/leveldata_cabin.inc | 21 ++- mist/stoney.s | 266 +------------------------------- mist/stoney_puzzles.s | 302 +++++++++++++++++++++++++++++++++++++ mist/zp.inc | 2 +- 8 files changed, 356 insertions(+), 267 deletions(-) create mode 100644 mist/stoney_puzzles.s diff --git a/mist/Makefile b/mist/Makefile index 07816325..480b0a30 100644 --- a/mist/Makefile +++ b/mist/Makefile @@ -240,7 +240,7 @@ stoney.o: stoney.s zp.inc hardware.inc common_defines.inc \ link_book_stoney.s \ link_book_mist.s \ handle_pages.s \ - gr_copy.s audio.s text_print.s decompress_fast_v2.s + stoney_puzzles.s ca65 -o stoney.o stoney.s -l stoney.lst #### diff --git a/mist/cabin_boiler_puzzle.s b/mist/cabin_boiler_puzzle.s index 4a65b2c9..13aa4ace 100644 --- a/mist/cabin_boiler_puzzle.s +++ b/mist/cabin_boiler_puzzle.s @@ -1,6 +1,15 @@ ; this is a painful one ; mostly because the tree puzzle is sort of obscure in the original + ; in original you get a match, then light it + ; also the match will burn out eventually + + ;=================================== + ; update backgrounds based on state + ;=================================== +cabin_update_state: + + rts ;==================== @@ -31,7 +40,23 @@ touch_safe: pull_handle: - ; FIXME + + lda SAFE_HUNDREDS + cmp #7 + bne wrong_combination + lda SAFE_TENS + cmp #2 + bne wrong_combination + lda SAFE_ONES + cmp #4 + bne wrong_combination + + lda #CABIN_OPEN_SAFE + sta LOCATION + + jmp change_location + +wrong_combination: rts safe_buttons: diff --git a/mist/common_defines.inc b/mist/common_defines.inc index 8490433c..e1f5b5e5 100644 --- a/mist/common_defines.inc +++ b/mist/common_defines.inc @@ -372,6 +372,7 @@ CABIN_TREE_BASEMENT = 9 CABIN_TREE_BOOK = 10 CABIN_TREE_BOOK_CLOSED = 11 CABIN_TREE_BOOK_OPEN = 12 +CABIN_OPEN_SAFE = 13 ; Arbor, up in the trees ARBOR_INSIDE_ELEV1 = 0 diff --git a/mist/default_save.s b/mist/default_save.s index 7bcd6fa4..87494969 100644 --- a/mist/default_save.s +++ b/mist/default_save.s @@ -77,4 +77,4 @@ .byte $00 ; SAFE_HUNDREDS = $C3 .byte $00 ; SAFE_TENS = $C4 .byte $00 ; SAFE_ONES = $C5 -.byte $00 ; SAFE_OPEN = $C6 +.byte $00 ; TREE_LEVEL = $C6 diff --git a/mist/leveldata_cabin.inc b/mist/leveldata_cabin.inc index dcda0b2d..31446840 100644 --- a/mist/leveldata_cabin.inc +++ b/mist/leveldata_cabin.inc @@ -6,7 +6,7 @@ locations: .word location0, location1, location2, location3 .word location4, location5, location6, location7 .word location8, location9, location10,location11 - .word location12 + .word location12,location13 ; CABIN_OUTSIDE -- outside in clearing location0: @@ -253,3 +253,22 @@ location12: .byte 10,24 ; special y .word channel_link_book-1 +; CABIN_OPEN_SAFE -- looking at open safe +location13: + .byte $ff ; north exit + .byte $ff ; south exit + .byte $ff ; east exit + .byte CABIN_INSIDE ; west exit + .byte $ff ; north exit_dir + .byte $ff ; south exit_dir + .byte $ff ; east exit_dir + .byte DIRECTION_W ; west exit_dir + .word $0000 ; north bg + .word $0000 ; south bg + .word $000 ; east bg + .word safe_open_w_lzsa ; west bg + .byte BG_WEST + .byte DIRECTION_W ; special exit + .byte 3,31 ; special x + .byte 16,44 ; special y + .word touch_safe-1 diff --git a/mist/stoney.s b/mist/stoney.s index 0b6d3d44..067487b7 100644 --- a/mist/stoney.s +++ b/mist/stoney.s @@ -200,6 +200,9 @@ stoney_take_blue_page: ;============================= + ; handle pages + ;============================= + draw_red_page: lda RED_PAGES_TAKEN @@ -256,268 +259,6 @@ stoney_half_message: rts - ;====================== - ; handle umbrella pump buttons - -umbrella_buttons: - - lda CURSOR_X - cmp #15 - bcc left_button_pressed - cmp #19 - bcc center_button_pressed - -right_button_pressed: - ; drain lighthouse - - lda #2 - bne done_umbrella -left_button_pressed: - ; drain mist tunnel - lda #0 - beq done_umbrella - -center_button_pressed: - ; drain room tunnels - lda #1 - -done_umbrella: - sta 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 -skip_charge: - - rts - - -do_draw_umbrella_light: - lda DIRECTION - cmp #DIRECTION_W - bne done_draw_umbrella - - lda PUMP_STATE - asl - asl ; *4 - tay - - lda #$99 ; orange - - sta $528+15,Y ; page 0 - sta $928+15,Y ; page 1 - ; 15,20 - ; 19,20 - ; 23,20 -done_draw_umbrella: - 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 - ;========================== @@ -531,6 +272,7 @@ battery_sprite7: .include "link_book_mist.s" ; puzzles + .include "stoney_puzzles.s" .include "handle_pages.s" ; level data diff --git a/mist/stoney_puzzles.s b/mist/stoney_puzzles.s new file mode 100644 index 00000000..44a269f6 --- /dev/null +++ b/mist/stoney_puzzles.s @@ -0,0 +1,302 @@ +; The Stone Ship Puzzles + +; by deater (Vince Weaver) + + ; 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? + ; press right one, lights in the cabin go on + + + ;====================== + ; handle umbrella pump buttons + +umbrella_buttons: + + lda CURSOR_X + cmp #15 + bcc left_button_pressed + cmp #19 + bcc center_button_pressed + +right_button_pressed: + ; drain lighthouse + + lda #2 + bne done_umbrella +left_button_pressed: + ; drain mist tunnel + lda #0 + beq done_umbrella + +center_button_pressed: + ; drain room tunnels + lda #1 + +done_umbrella: + sta 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 +skip_charge: + + rts + + +do_draw_umbrella_light: + lda DIRECTION + cmp #DIRECTION_W + bne done_draw_umbrella + + lda PUMP_STATE + asl + asl ; *4 + tay + + lda #$99 ; orange + + sta $528+15,Y ; page 0 + sta $928+15,Y ; page 1 + ; 15,20 + ; 19,20 + ; 23,20 +done_draw_umbrella: + 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 + diff --git a/mist/zp.inc b/mist/zp.inc index 75cddd7c..22e40b28 100644 --- a/mist/zp.inc +++ b/mist/zp.inc @@ -193,7 +193,7 @@ SAFE_HUNDREDS = $C3 ; safe combination, hundreds SAFE_TENS = $C4 ; safe combination, tens SAFE_ONES = $C5 ; safe combination, ones -SAFE_OPEN = $C6 +TREE_LEVEL = $C6 ; how high is the tree hole END_OF_SAVE = $C7