; Mist

; a version of Myst?
; (yes there's a subtle German joke here)

; by deater (Vince Weaver) <vince@deater.net>

; 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_L
	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_SPECIAL
	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"
