diff --git a/games/mist_hgr/README.MEMMAP b/games/mist_hgr/README.MEMMAP index 4a872410..5dc353d2 100644 --- a/games/mist_hgr/README.MEMMAP +++ b/games/mist_hgr/README.MEMMAP @@ -5,8 +5,8 @@ $02 - disk lookup table $03 - disk lookup ($300-$369) $04-$07 - text page1 $08-$0B - (danger, text page2) initial boot sector $8 - - current background data, temp savegame workplace ($E) -$0C-$0D - QBOOT stage2 + - current background data, temp savegame workplace ($8/$9/$A) +$0C-$0D - QBOOT stage2 (disk routines) $0E-$1F - QLOAD, common routines $20-$3f - HIRES page1 $40-$?? - gameplay/data/code all loaded here diff --git a/games/mist_hgr/draw_pointer.s b/games/mist_hgr/draw_pointer.s index df4710e2..dfec2631 100644 --- a/games/mist_hgr/draw_pointer.s +++ b/games/mist_hgr/draw_pointer.s @@ -11,6 +11,11 @@ draw_pointer: really_draw_pointer: + lda #0 + sta IN_SPECIAL + sta IN_LEFT + sta IN_RIGHT + jsr save_bg_14x14 ; save old bg ; for now assume the only 14x14 sprites are the pointers diff --git a/games/mist_hgr/keyboard.s b/games/mist_hgr/keyboard.s index cc16f30f..ab3fd38f 100644 --- a/games/mist_hgr/keyboard.s +++ b/games/mist_hgr/keyboard.s @@ -315,11 +315,16 @@ done_split: iny lda (LOCATION_STRUCT_L),Y sta LZSA_SRC_HI - lda #$c ; load to page $c00 + lda #$8 ; load to page $c00 jsr decompress_lzsa2_fast ; draw background + lda #$0 + sta VGIL + lda #$8 + sta VGIH + jsr play_vgi rts @@ -332,8 +337,14 @@ change_location: ; reset graphics bit SET_GR - ; reset pointer to not visible, centered + ; clear IN_SPECIAL lda #0 + sta IN_SPECIAL + sta IN_RIGHT + sta IN_LEFT + + ; reset pointer to not visible, centered + sta ANIMATE_FRAME sta CURSOR_VISIBLE lda #20 diff --git a/games/mist_hgr/mist_island.s b/games/mist_hgr/mist_island.s new file mode 100644 index 00000000..84a4dd4b --- /dev/null +++ b/games/mist_hgr/mist_island.s @@ -0,0 +1,380 @@ +; Mist + +; a version of Myst? +; (yes there's a subtle German joke here) + +; by deater (Vince Weaver) + +; Zero Page + .include "zp.inc" + .include "hardware.inc" + .include "common_defines.inc" + .include "common_routines.inc" + +mist_start: + ;=================== + ; init screen + ;=================== + + jsr TEXT + jsr HOME + bit KEYRESET + + bit SET_GR + bit PAGE0 + bit LORES + bit FULLGR + + ;================= + ; set up location + ;================= + + lda #locations + sta LOCATIONS_H + + lda #0 + sta DRAW_PAGE + sta LEVEL_OVER + + ; init cursor + + lda #20 + sta CURSOR_X + sta CURSOR_Y + + ; init the clock bridge + jsr raise_bridge + + ; init the gear + jsr open_the_gear + + ; make the ship right + + jsr adjust_ship + + ; set up initial location + + jsr change_location + + lda #1 + sta CURSOR_VISIBLE ; visible at first + +game_loop: + ;================= + ; reset things + ;================= + + lda #0 + sta IN_RIGHT + sta IN_LEFT + + ;==================================== + ; copy background to current page + ;==================================== + + jsr gr_copy_to_current + + ;==================================== + ; handle special-case forground logic + ;==================================== + + ; handle marker switch drawing + jsr draw_marker_switch + + ; handle gear opening + + lda GEAR_OPEN + beq not_gear_related + + jsr check_gear_delete + +not_gear_related: + + lda LOCATION + + ; handle circuit breaker + cmp #MIST_TOWER2_TOP + bne check_if_pillars + + jsr draw_circuit_breaker + jmp nothing_special + + ; handle pillars +check_if_pillars: + cmp #MIST_PILLAR_EYE + bcc check_if_compartment_open ; hack, depends on order + cmp #MIST_SPACESHIP_PATH + bcs 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: + cmp #MIST_CLOCK_PUZZLE ; clock puzzle + beq location_clock + cmp #MIST_CLOCK + beq location_clock + + cmp #MIST_CLOCK_INSIDE + beq location_inside_clock + bne nothing_special + +location_clock: + jsr draw_clock_face + jmp nothing_special +location_inside_clock: + jsr draw_clock_inside + jmp nothing_special + +nothing_special: + + ;==================================== + ; draw pointer + ;==================================== + + jsr draw_pointer + + ;==================================== + ; page flip + ;==================================== + + jsr page_flip + + + ;================= + ; do this here (which is inefficient) because + ; it lets the switch turn green before the noise + + jsr check_change_ship + + + ;==================================== + ; handle keypress/joystick + ;==================================== + + jsr handle_keypress + + + ;==================================== + ; inc frame count + ;==================================== + + inc FRAMEL + bne room_frame_no_oflo + inc FRAMEH +room_frame_no_oflo: + + ;==================================== + ; check level over + ;==================================== + + lda LEVEL_OVER + bne really_exit + + jmp game_loop + +really_exit: + jmp end_level + +;================= +; special exits + +go_to_meche: + lda #LOAD_MECHE + sta WHICH_LOAD + + lda #MECHE_INSIDE_GEAR + sta LOCATION + + lda #DIRECTION_E + sta DIRECTION + + jmp set_level_over + +pad_special: + lda #MIST_TOWER2_PATH + sta LOCATION + jsr change_location + + rts + +leave_tower2: + lda #MIST_TOWER2_TOP + sta LOCATION + + lda #DIRECTION_W + sta DIRECTION + + jsr change_location + + rts + + +goto_dentist_steps: + + lda #MIST_STEPS_DENTIST + sta LOCATION + + lda #DIRECTION_N + sta DIRECTION + + jmp change_location + + +enter_octagon: + + lda #OCTAGON_TEMPLE_DOORWAY + sta LOCATION + + lda #LOAD_OCTAGON + sta WHICH_LOAD + + jmp set_level_over + +goto_dentist: + + lda #DENTIST_OUTSIDE + sta LOCATION + + lda #LOAD_DENTIST + sta WHICH_LOAD + + jmp set_level_over + + +enter_viewer: + + lda #VIEWER_ENTRANCE + sta LOCATION + + lda #LOAD_VIEWER + sta WHICH_LOAD + + jmp set_level_over + +enter_channel_main: + + lda #CABIN_OUTSIDE + sta LOCATION + + lda #LOAD_CABIN + sta WHICH_LOAD + + lda #DIRECTION_E + sta DIRECTION + + jmp set_level_over + +enter_channel_clock: + + lda #CABIN_CLOCK_PATH + sta LOCATION + + lda #LOAD_CABIN + sta WHICH_LOAD + + lda #DIRECTION_N + sta DIRECTION + + jmp set_level_over + +enter_stoneyship: + lda #SHIP_STERN + sta LOCATION + + lda #DIRECTION_N + sta DIRECTION + + lda #LOAD_SHIP + sta WHICH_LOAD + +set_level_over: + lda #$ff + sta LEVEL_OVER + + rts + + ;=========================== + ; read letter from catherine + +read_letter: + + lda #MIST_CAT_LETTER + sta LOCATION + + lda #DIRECTION_N + sta DIRECTION + + jsr change_location + + bit SET_TEXT + + rts + + ;=========================== + ; marker switch clicks +click_switch_gear: + lda #MARKER_GEARS + jmp click_marker_switch +click_switch_spaceship: + lda #MARKER_SPACESHIP + jmp click_marker_switch +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 + ;========================== + + ; graphics data + .include "graphics_mist/mist_graphics.inc" + + ; puzzles + .include "clock_bridge_puzzle.s" + .include "marker_switch.s" + .include "mist_puzzles.s" + + .include "handle_pages.s" + + .include "simple_sounds.s" + + ; level data + .include "leveldata_mist.inc" diff --git a/games/mist_hgr/mist_title.s b/games/mist_hgr/mist_title.s index b1d7a711..91937de9 100644 --- a/games/mist_hgr/mist_title.s +++ b/games/mist_hgr/mist_title.s @@ -463,6 +463,7 @@ done_intro: lda #20 sta CURSOR_X + lda #89 sta CURSOR_Y lda #0 @@ -495,10 +496,6 @@ game_loop: ; reset things ;================= - lda #0 - sta IN_SPECIAL - sta IN_RIGHT - sta IN_LEFT ;==================================== ; copy background to current page @@ -776,5 +773,3 @@ config_string: .byte 0,23,"APPLE II?, 48K RAM, MOCKINGBOARD: SLOT ?",0 ; MOCKINGBOARD: NONE - -;.include "vgi_common.s"