diff --git a/mist/Makefile b/mist/Makefile index 270564ae..c3406e3f 100644 --- a/mist/Makefile +++ b/mist/Makefile @@ -117,7 +117,7 @@ mist.o: mist.s zp.inc hardware.inc common_defines.inc common_routines.inc \ draw_pointer.s \ end_level.s \ mist_puzzles.s \ - gr_copy.s audio.s text_print.s decompress_fast_v2.s + handle_pages.s ca65 -o mist.o mist.s -l mist.lst #### diff --git a/mist/default_save.s b/mist/default_save.s index 2b519482..3b6c090c 100644 --- a/mist/default_save.s +++ b/mist/default_save.s @@ -71,3 +71,4 @@ .byte $00 ; PILLAR_ON = $BE .byte $00 ; GREEN_BOOK_PROGRESS = $BF .byte $00 ; DNI_PROGRESS = $C0 +.byte $00 ; COMPARTMENT_OPEN = $C1 diff --git a/mist/handle_pages.s b/mist/handle_pages.s index c299de8c..2f001ae0 100644 --- a/mist/handle_pages.s +++ b/mist/handle_pages.s @@ -1,8 +1,3 @@ -; FIXME -; handle dropping pages -; handle white page - - ;============================== ; Take Blue Page ;============================== @@ -22,6 +17,12 @@ take_blue_page: sta HOLDING_PAGE rts + + ;============================== + ; Take Red Page + ;============================== + ; A should be page to take (i.e. MECHE_PAGE or similar) + take_red_page: pha jsr drop_current_page @@ -36,6 +37,10 @@ take_red_page: sta HOLDING_PAGE rts + ;============================== + ; Take White Page + ;============================== + take_white_page: pha jsr drop_current_page @@ -50,7 +55,9 @@ take_white_page: sta HOLDING_PAGE rts - + ;============================== + ; Drop current page + ;============================== ; clicked on a page while holding another drop_current_page: lda HOLDING_PAGE diff --git a/mist/init_state.s b/mist/init_state.s index 00c9daed..edf74209 100644 --- a/mist/init_state.s +++ b/mist/init_state.s @@ -11,6 +11,13 @@ init_state_loop: iny cpy #END_OF_SAVE bne init_state_loop + + + ; FIXME: testing + + lda #$ff + sta MARKER_SWITCHES + rts .else diff --git a/mist/leveldata_mist.inc b/mist/leveldata_mist.inc index b85431e4..351c311e 100644 --- a/mist/leveldata_mist.inc +++ b/mist/leveldata_mist.inc @@ -53,7 +53,7 @@ location1: .byte BG_NORTH|BG_SOUTH .byte DIRECTION_N ; special exit .byte 23,30 ; special x - .byte 25,32 ; special y + .byte 25,44 ; special y .word click_switch_dock-1 ; special function ; MIST_DOCK_STEPS -- dock steps diff --git a/mist/leveldata_octagon.inc b/mist/leveldata_octagon.inc index ad25e6f3..765ac19e 100644 --- a/mist/leveldata_octagon.inc +++ b/mist/leveldata_octagon.inc @@ -18,7 +18,6 @@ locations: ; OCTAGON_TEMPLE_DOORWAY -- temple doorway location0: .byte OCTAGON_TEMPLE_CENTER ; north exit -; .byte 9 ; south exit .byte $ff ; south exit .byte $ff ; east exit .byte $ff ; west exit diff --git a/mist/marker_switch.s b/mist/marker_switch.s index 301ec857..ee710df7 100644 --- a/mist/marker_switch.s +++ b/mist/marker_switch.s @@ -40,6 +40,19 @@ click_marker_switch: eor MARKER_SWITCHES ; toggle switch sta MARKER_SWITCHES + cmp #$FE ; all but dock + bne dont_open_secret + + lda #1 + bne done_handle_secret + +dont_open_secret: + lda #0 + +done_handle_secret: + sta COMPARTMENT_OPEN + + rts marker_sprite_off: @@ -212,3 +225,5 @@ actually_draw_marker: done_draw_marker: rts + + diff --git a/mist/mist.s b/mist/mist.s index c8f045b3..b63343e9 100644 --- a/mist/mist.s +++ b/mist/mist.s @@ -85,6 +85,7 @@ game_loop: ; handle marker switch drawing jsr draw_marker_switch + ; handle gear opening lda GEAR_OPEN @@ -92,16 +93,26 @@ game_loop: jsr check_gear_delete not_gear_related: - ; handl pillars + ; handle pillars lda LOCATION cmp #MIST_PILLAR_EYE - bcc check_if_clock + bcc check_if_compartment_open jsr draw_pillar + jmp nothing_special + + ; handle white page +check_if_compartment_open: + cmp #MIST_DOCK_SWITCH + bne check_if_clock + + jsr draw_white_page + + jmp nothing_special + ; handle clock puzzles check_if_clock: - lda LOCATION cmp #MIST_CLOCK_PUZZLE ; clock puzzle beq location_clock cmp #MIST_CLOCK_INSIDE @@ -302,9 +313,6 @@ read_letter: ;=========================== ; marker switch clicks -click_switch_dock: - lda #MARKER_DOCK - jmp click_marker_switch click_switch_gear: lda #MARKER_GEARS jmp click_marker_switch @@ -315,6 +323,30 @@ click_switch_clock: lda #MARKER_CLOCK jmp click_marker_switch + ; also handle white page +click_switch_dock: + + lda CURSOR_Y + cmp #33 + bcc flip_dock_switch + + ; pick up white page + + lda COMPARTMENT_OPEN + bne grab_it + + rts + +grab_it: + + jmp grab_white_page + + +flip_dock_switch: + lda #MARKER_DOCK + jmp click_marker_switch + + ;========================== ; includes ;========================== @@ -327,5 +359,7 @@ click_switch_clock: .include "marker_switch.s" .include "mist_puzzles.s" + .include "handle_pages.s" + ; level data .include "leveldata_mist.inc" diff --git a/mist/mist_puzzles.s b/mist/mist_puzzles.s index 52f53c2a..5e60fa08 100644 --- a/mist/mist_puzzles.s +++ b/mist/mist_puzzles.s @@ -635,3 +635,47 @@ into_generator: sta LEVEL_OVER rts + + + + ;================================= + ; marker switch compartment stuff + ;================================= + +draw_white_page: + + lda DIRECTION + cmp #DIRECTION_N + bne no_white_page + + lda COMPARTMENT_OPEN + beq no_white_page + + lda WHITE_PAGE_TAKEN + bne no_white_page + + lda #white_page_sprite + sta INH + + lda #25 + sta XPOS + lda #34 + sta YPOS + + jsr put_sprite_crop + +no_white_page: + rts + + +grab_white_page: + lda WHITE_PAGE_TAKEN + bne missing_page + + jmp take_white_page + +missing_page: + rts + diff --git a/mist/zp.inc b/mist/zp.inc index 3c0b57fd..7d3f62f9 100644 --- a/mist/zp.inc +++ b/mist/zp.inc @@ -48,8 +48,8 @@ BTC_H = $6D ; We have to save/restore the following values ; when loading/storing from disk -WHICH_LOAD = $80 -DIRECTION = $81 +WHICH_LOAD = $80 ; which file to load +DIRECTION = $81 ; direction we are pointing DIRECTION_N = $1 DIRECTION_S = $2 DIRECTION_E = $4 @@ -57,19 +57,20 @@ DIRECTION = $81 DIRECTION_ANY=$f DIRECTION_ONLY_POINT = $40 ; do not change pointer to grab DIRECTION_SPLIT = $80 ; split text/graphics -LOCATION = $82 -RED_PAGES_TAKEN = $83 +LOCATION = $82 ; location on the map + +RED_PAGES_TAKEN = $83 ; red pages that have been picked up OCTAGON_PAGE = 1 MECHE_PAGE = 2 SELENA_PAGE = 4 STONEY_PAGE = 8 CHANNEL_PAGE = 16 FINAL_PAGE = 32 -BLUE_PAGES_TAKEN= $84 -CLOCK_BRIDGE = $85 -GEAR_OPEN = $86 -MARKER_SWITCHES = $87 +BLUE_PAGES_TAKEN= $84 ; blue pages that have been picked up +CLOCK_BRIDGE = $85 ; is the clock island bridge raised +GEAR_OPEN = $86 ; is the big gear open +MARKER_SWITCHES = $87 ; state of the marker switches MARKER_DOCK = $01 MARKER_GEARS = $02 MARKER_SPACESHIP = $04 @@ -79,63 +80,72 @@ MARKER_SWITCHES = $87 MARKER_POOL = $40 MARKER_DENTIST = $80 -CLOCK_HOUR = $88 -CLOCK_MINUTE = $89 -TREE_FURNACE_ON = $8A -FIREPLACE_GRID0 = $8B +CLOCK_HOUR = $88 ; hour on the mist clock +CLOCK_MINUTE = $89 ; minute on the mist clock +TREE_FURNACE_ON = $8A ; furnace in the cabin on +FIREPLACE_GRID0 = $8B ; fireplace grid puzzle state FIREPLACE_GRID1 = $8C FIREPLACE_GRID2 = $8D FIREPLACE_GRID3 = $8E FIREPLACE_GRID4 = $8F FIREPLACE_GRID5 = $90 -CLOCK_COUNT = $91 -CLOCK_TOP = $92 -CLOCK_MIDDLE = $93 -CLOCK_BOTTOM = $94 -CLOCK_LAST = $95 -BREAKER_TRIPPED = $96 -GENERATOR_VOLTS = $97 -ROCKET_VOLTS = $98 -SWITCH_TOP_ROW = $99 -SWITCH_BOTTOM_ROW = $9A -GENERATOR_VOLTS_DISP = $9B -ROCKET_VOLTS_DISP = $9C -ROCKET_HANDLE_STEP = $9D -ROCKET_NOTE1 = $9E -ROCKET_NOTE2 = $9F -ROCKET_NOTE3 = $A0 -ROCKET_NOTE4 = $A1 -MECHE_ELEVATOR = $A2 -MECHE_ROTATION = $A3 -MECHE_LEVERS = $A4 +CLOCK_COUNT = $91 ; clock puzzle (turns taken) +CLOCK_TOP = $92 ; clock puzzle (top dial) +CLOCK_MIDDLE = $93 ; clock puzzle (middle dial) +CLOCK_BOTTOM = $94 ; clock puzzle (bottom dial) +CLOCK_LAST = $95 ; clock puzzle (last dial turned) + +BREAKER_TRIPPED = $96 ; generator (circuit breakers status) +GENERATOR_VOLTS = $97 ; generator (total volts) +ROCKET_VOLTS = $98 ; generator (rocket volts) +SWITCH_TOP_ROW = $99 ; generator (switch top row) +SWITCH_BOTTOM_ROW = $9A ; generator (switch bottom row) +GENERATOR_VOLTS_DISP = $9B ; generator (total volts on display) +ROCKET_VOLTS_DISP = $9C ; generator (rocket volts on display) + +ROCKET_HANDLE_STEP = $9D ; organ (which knob is lit) [why zp?] +ROCKET_NOTE1 = $9E ; organ (note slider 1) +ROCKET_NOTE2 = $9F ; organ (note slider 2) +ROCKET_NOTE3 = $A0 ; organ (note slider 3) +ROCKET_NOTE4 = $A1 ; organ (note slider 4) + +MECHE_ELEVATOR = $A2 ; fortress elevator state +MECHE_ROTATION = $A3 ; fortress rotation state +MECHE_LEVERS = $A4 ; fortress rotation levers LEFT_LEVER = 1 RIGHT_LEVER = 2 -MECHE_LOCK1 = $A5 -MECHE_LOCK2 = $A6 -MECHE_LOCK3 = $A7 -MECHE_LOCK4 = $A8 -HOLDING_PAGE = $A9 +MECHE_LOCK1 = $A5 ; meche lock symbol1 +MECHE_LOCK2 = $A6 ; meche lock symbol2 +MECHE_LOCK3 = $A7 ; meche lock symbol3 +MECHE_LOCK4 = $A8 ; meche lock symbol4 + +HOLDING_PAGE = $A9 ; which page in hand HOLDING_RED_PAGE = $80 HOLDING_BLUE_PAGE = $40 HOLDING_WHITE_PAGE = $C0 -RED_PAGE_COUNT = $AA -BLUE_PAGE_COUNT = $AB -VIEWER_CHANNEL = $AC -VIEWER_LATCHED = $AD -TOWER_ROTATION = $AE +RED_PAGE_COUNT = $AA ; # of red pages in book +BLUE_PAGE_COUNT = $AB ; # of blue pages in book + +VIEWER_CHANNEL = $AC ; viewer: current channel +VIEWER_LATCHED = $AD ; viewer: latched channel + +TOWER_ROTATION = $AE ; tower rotation: which ROTATION_GEARS = 2 ROTATION_DOCK = 3 ROTATION_TREE = 4 ROTATION_SPACESHIP = 8 -SHIP_RAISED = $AF -; stoneship -PUMP_STATE = $B0 -BATTERY_CHARGE = $B1 -COMPASS_ANGLE = $B2 -CRANK_ANGLE = $B3 -WHITE_PAGE_TAKEN= $B4 -CHANNEL_SWITCHES= $B5 + +SHIP_RAISED = $AF ; ship raised or not + +PUMP_STATE = $B0 ; stoneship pump state +BATTERY_CHARGE = $B1 ; stoneship battery charge +COMPASS_ANGLE = $B2 ; stoneship compass angle +CRANK_ANGLE = $B3 ; stoneship crank angle + +WHITE_PAGE_TAKEN= $B4 ; white page taken + +CHANNEL_SWITCHES= $B5 ; channelwood switches CHANNEL_BRIDGE_UP = $01 CHANNEL_PIPE_EXTENDED = $02 CHANNEL_BOOK_ELEVATOR_UP= $04 @@ -144,21 +154,24 @@ CHANNEL_SWITCHES= $B5 CHANNEL_SW_GATE_BOTTOM = $20 CHANNEL_SW_WINDMILL = $40 CHANNEL_SW_FAUCET = $80 -CHANNEL_VALVES = $B6 + +CHANNEL_VALVES = $B6 ; channelwood valves CHANNEL_VALVE1 = $01 CHANNEL_VALVE2 = $02 CHANNEL_VALVE3 = $04 CHANNEL_VALVE4 = $08 CHANNEL_VALVE5 = $10 CHANNEL_VALVE6 = $20 -DENTIST_LIGHT = $B7 -DENTIST_MONTH = $B8 -DENTIST_DAY = $B9 -DENTIST_CENTURY = $BA -DENTIST_YEAR = $BB -DENTIST_HOURS = $BC -DENTIST_MINUTES = $BD -PILLAR_ON = $BE + +DENTIST_LIGHT = $B7 ; dentist lightswitch +DENTIST_MONTH = $B8 ; dentist panel: month +DENTIST_DAY = $B9 ; dentist panel: day +DENTIST_CENTURY = $BA ; dentist panel: century +DENTIST_YEAR = $BB ; dentist panel: year +DENTIST_HOURS = $BC ; dentist panel: hours +DENTIST_MINUTES = $BD ; dentist panel: minutes + +PILLAR_ON = $BE ; pillars: which on/off PILLAR_EYE = $01 PILLAR_SNAKE = $02 PILLAR_BUG = $04 @@ -167,10 +180,14 @@ PILLAR_ON = $BE PILLAR_LEAF = $20 PILLAR_CROSS = $40 PILLAR_EMU = $80 -GREEN_BOOK_PROGRESS = $BF -DNI_PROGRESS = $C0 -END_OF_SAVE = $C1 +GREEN_BOOK_PROGRESS = $BF ; green book: what's ben seen + +DNI_PROGRESS = $C0 ; dni: atrus status + +COMPARTMENT_OPEN = $C1 ; dock marker switch compartment + +END_OF_SAVE = $C2 ; done game puzzle state