mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-29 00:31:52 +00:00
b1238af49d
this will probably upset people
1332 lines
20 KiB
ArmAsm
1332 lines
20 KiB
ArmAsm
;================================
|
|
; draw snake
|
|
;================================
|
|
draw_snake:
|
|
lda DIRECTION
|
|
cmp #DIRECTION_E
|
|
bne done_draw_snake
|
|
|
|
lda ANIMATE_FRAME
|
|
beq done_draw_snake
|
|
|
|
asl
|
|
tax
|
|
|
|
lda snake_coords,X
|
|
sta XPOS
|
|
|
|
lda snake_coords+1,X
|
|
sta YPOS
|
|
|
|
lda snake_sprites,X
|
|
sta INL
|
|
|
|
lda snake_sprites+1,X
|
|
sta INH
|
|
|
|
jsr put_sprite_crop
|
|
|
|
lda FRAMEL
|
|
and #$1f
|
|
bne done_draw_snake
|
|
|
|
; advance frame
|
|
inc ANIMATE_FRAME
|
|
lda ANIMATE_FRAME
|
|
cmp #23
|
|
bne done_draw_snake
|
|
|
|
lda #0
|
|
sta ANIMATE_FRAME
|
|
|
|
done_draw_snake:
|
|
rts
|
|
|
|
snake_coords:
|
|
.byte 28,42 ; 0 (handle down)
|
|
.byte 28,42 ; 1 (handle straight)
|
|
.byte 28,40 ; 2 (handle up)
|
|
.byte 28,42 ; 3 (handle straight)
|
|
.byte 28,42 ; 4 (handle down)
|
|
.byte 28,42 ; 5 (handle straight)
|
|
.byte 28,40 ; 6 (handle up)
|
|
.byte 28,42 ; 7 (handle straight)
|
|
.byte 28,42 ; 8 (handle down)
|
|
|
|
.byte 22,34 ; 9 (lid up)
|
|
.byte 23,32 ; 10 (lid totally up)
|
|
.byte 23,28 ; 11 (snake up)
|
|
.byte 23,32 ; 12 (snake down)
|
|
.byte 23,28 ; 13 (snake up)
|
|
.byte 23,32 ; 14 (snake down)
|
|
|
|
.byte 23,30 ; 15 (snake lean)
|
|
.byte 21,32 ; 16 (snake strike)
|
|
.byte 21,32 ; 17 (snake over)
|
|
.byte 22,32 ; 18 (snake back)
|
|
.byte 23,28 ; 19 (snake up)
|
|
.byte 23,32 ; 20 (snake down)
|
|
|
|
.byte 23,32 ; 21 (lid totally up)
|
|
.byte 22,34 ; 22 (lid up)
|
|
|
|
|
|
|
|
snake_sprites:
|
|
.word snake_sprite0 ; 0 (handle down)
|
|
.word snake_sprite1 ; 1 (handle straight)
|
|
.word snake_sprite2 ; 2 (handle up)
|
|
.word snake_sprite1 ; 3 (handle straight)
|
|
.word snake_sprite0 ; 4 (handle down)
|
|
.word snake_sprite1 ; 5 (handle straight)
|
|
.word snake_sprite2 ; 6 (handle up)
|
|
.word snake_sprite1 ; 7 (handle straight)
|
|
.word snake_sprite0 ; 8 (handle down)
|
|
|
|
.word snake_sprite3 ; 9 (lid up)
|
|
.word snake_sprite4 ; 10 (lid totally up)
|
|
.word snake_sprite5 ; 11 (snake up)
|
|
.word snake_sprite6 ; 12 (snake down)
|
|
.word snake_sprite5 ; 13 (snake up)
|
|
.word snake_sprite6 ; 14 (snake down)
|
|
.word snake_sprite7 ; 15 (snake lean)
|
|
.word snake_sprite8 ; 16 (snake strike)
|
|
.word snake_sprite9 ; 17 (snake over)
|
|
.word snake_sprite10 ; 18 (snake back)
|
|
.word snake_sprite5 ; 19 (snake up)
|
|
.word snake_sprite6 ; 20 (snake down)
|
|
|
|
.word snake_sprite4 ; 21 (lid totally up)
|
|
.word snake_sprite3 ; 22 (lid up)
|
|
|
|
|
|
; 28,42
|
|
snake_sprite0:
|
|
.byte 1,1
|
|
.byte $AA
|
|
|
|
; 28,42
|
|
snake_sprite1:
|
|
.byte 2,1
|
|
.byte $90,$90
|
|
|
|
; 28,40
|
|
snake_sprite2:
|
|
.byte 2,2
|
|
.byte $92,$02
|
|
.byte $90,$99
|
|
|
|
; 22,34
|
|
snake_sprite3: ; lid up
|
|
.byte 5,3
|
|
.byte $25,$05,$05,$05,$58
|
|
.byte $52,$08,$00,$00,$05
|
|
.byte $5d,$d0,$d0,$d0,$58
|
|
|
|
; 23,32
|
|
snake_sprite4: ; lid totally up
|
|
.byte 5,4
|
|
.byte $82,$82,$80,$88,$82
|
|
.byte $88,$88,$88,$88,$88
|
|
.byte $58,$4c,$cc,$48,$d8
|
|
.byte $d4,$d4,$d4,$54,$dd
|
|
|
|
; 23,28
|
|
snake_sprite5: ; snake up
|
|
.byte 5,6
|
|
.byte $22,$22,$40,$c5,$22
|
|
.byte $22,$42,$c4,$4c,$22
|
|
.byte $82,$44,$44,$44,$82
|
|
.byte $88,$84,$44,$84,$88
|
|
.byte $58,$08,$44,$08,$d8
|
|
.byte $d0,$d0,$d4,$50,$dd
|
|
|
|
; 23,32
|
|
snake_sprite6: ; snake down
|
|
.byte 5,4
|
|
.byte $82,$82,$44,$c8,$82
|
|
.byte $88,$48,$c4,$4c,$88
|
|
.byte $58,$44,$44,$44,$d8
|
|
.byte $d0,$d0,$d4,$50,$dd
|
|
|
|
; 23,30
|
|
snake_sprite7: ; snake lean
|
|
.byte 5,5
|
|
.byte $22,$c2,$c4,$48,$22
|
|
.byte $82,$4c,$cc,$44,$82
|
|
.byte $88,$84,$44,$84,$88
|
|
.byte $58,$48,$44,$08,$d8
|
|
.byte $d0,$d4,$d4,$50,$dd
|
|
|
|
; 21,32
|
|
snake_sprite8: ; snake strike
|
|
.byte 7,4
|
|
.byte $20,$22,$82,$82,$80,$88,$82
|
|
.byte $44,$44,$44,$88,$88,$88,$88
|
|
.byte $22,$52,$54,$44,$48,$08,$d8
|
|
.byte $22,$5d,$d0,$d4,$d4,$50,$dd
|
|
|
|
; 21,32
|
|
snake_sprite9: ; snake over
|
|
.byte 7,8
|
|
.byte $20,$22,$82,$82,$80,$88,$82
|
|
.byte $22,$22,$88,$88,$88,$88,$88
|
|
.byte $22,$52,$58,$44,$44,$08,$d8
|
|
.byte $22,$5d,$44,$44,$d4,$50,$dd
|
|
.byte $02,$45,$44,$44,$88,$5d,$00
|
|
.byte $44,$44,$44,$44,$88,$85,$00
|
|
.byte $44,$44,$44,$44,$88,$55,$89
|
|
.byte $24,$44,$44,$24,$20,$22,$08
|
|
|
|
; 22,32
|
|
snake_sprite10: ; snake back
|
|
.byte 6,4
|
|
.byte $c2,$c4,$c4,$40,$88,$82
|
|
.byte $2c,$8c,$44,$44,$88,$88
|
|
.byte $52,$58,$44,$44,$08,$d8
|
|
.byte $5d,$d0,$d4,$d4,$50,$dd
|
|
|
|
;=====================
|
|
; touch the snake box
|
|
;=====================
|
|
|
|
touch_blue_box:
|
|
lda #1
|
|
sta ANIMATE_FRAME
|
|
sta FRAMEL
|
|
|
|
rts
|
|
|
|
;===============================
|
|
; draw hover crystals
|
|
;===============================
|
|
draw_crystals:
|
|
lda DIRECTION
|
|
cmp #DIRECTION_N
|
|
bne done_draw_crystals
|
|
|
|
lda CURSOR_Y
|
|
cmp #15
|
|
bcc done_draw_crystals ; blt
|
|
|
|
cmp #24
|
|
bcs done_draw_crystals ; bge
|
|
|
|
lda CURSOR_X
|
|
cmp #8
|
|
bcc done_draw_crystals
|
|
cmp #13
|
|
bcc draw_yellow_crystal
|
|
cmp #17
|
|
bcc done_draw_crystals
|
|
cmp #22
|
|
bcc draw_green_crystal
|
|
cmp #25
|
|
bcc done_draw_crystals
|
|
cmp #31
|
|
bcc draw_red_crystal
|
|
bcs done_draw_crystals
|
|
|
|
draw_yellow_crystal:
|
|
lda #10
|
|
sta XPOS
|
|
|
|
lda #<yellow_crystal_sprite
|
|
sta INL
|
|
lda #>yellow_crystal_sprite
|
|
|
|
jmp common_draw_crystal
|
|
draw_green_crystal:
|
|
lda #18
|
|
sta XPOS
|
|
|
|
lda #<green_crystal_sprite
|
|
sta INL
|
|
lda #>green_crystal_sprite
|
|
|
|
jmp common_draw_crystal
|
|
draw_red_crystal:
|
|
lda #27
|
|
sta XPOS
|
|
|
|
lda #<red_crystal_sprite
|
|
sta INL
|
|
lda #>red_crystal_sprite
|
|
|
|
common_draw_crystal:
|
|
sta INH
|
|
|
|
lda #16
|
|
sta YPOS
|
|
|
|
jsr put_sprite_crop
|
|
|
|
done_draw_crystals:
|
|
rts
|
|
|
|
yellow_crystal_sprite:
|
|
.byte 2,3
|
|
.byte $fd,$d5
|
|
.byte $dd,$dd
|
|
.byte $df,$0d
|
|
|
|
green_crystal_sprite:
|
|
|
|
.byte 3,3
|
|
.byte $c5,$cc,$cc
|
|
.byte $dc,$dc,$dc
|
|
.byte $cc,$cc,$cc
|
|
|
|
red_crystal_sprite:
|
|
.byte 3,3
|
|
.byte $88,$35,$dd
|
|
.byte $33,$bb,$33
|
|
.byte $08,$33,$d3
|
|
|
|
|
|
|
|
;===============================
|
|
; view telescope
|
|
;===============================
|
|
view_telescope:
|
|
|
|
lda MECHE_ROTATION
|
|
; it's a range
|
|
lsr
|
|
lsr
|
|
cmp #2
|
|
bne no_skeleton
|
|
|
|
yes_skeleton:
|
|
lda #MECHE_TELESCOPE_SKELETON
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
no_skeleton:
|
|
lda #MECHE_TELESCOPE_PLAIN
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
|
|
;===============================
|
|
; top floor up
|
|
;===============================
|
|
goto_top_floor_up:
|
|
lda #MECHE_TOP_FLOOR_UP
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
|
|
;==============================
|
|
; book page stuff
|
|
;==============================
|
|
|
|
grab_blue_page:
|
|
|
|
lda BLUE_PAGES_TAKEN
|
|
and #MECHE_PAGE
|
|
bne missing_page
|
|
|
|
lda #MECHE_PAGE
|
|
jmp take_blue_page
|
|
|
|
grab_red_page:
|
|
|
|
lda RED_PAGES_TAKEN
|
|
and #MECHE_PAGE
|
|
bne missing_page
|
|
|
|
lda #MECHE_PAGE
|
|
jmp take_red_page
|
|
|
|
missing_page:
|
|
rts
|
|
|
|
|
|
open_blue_secret:
|
|
lda #MECHE_BLUE_THRONE_OPEN
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
enter_blue_secret:
|
|
lda CURSOR_Y
|
|
cmp #24
|
|
bcc close_blue_secret ; blt
|
|
lda #MECHE_BLUE_SECRET_DOOR
|
|
bne done_blue_secret ; bra
|
|
close_blue_secret:
|
|
lda #MECHE_BLUE_THRONE
|
|
done_blue_secret:
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
enter_red_secret:
|
|
|
|
lda #MECHE_RED_SECRET_DOOR
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
|
|
;===============================
|
|
;===============================
|
|
; exit puzzle stuff
|
|
;===============================
|
|
;===============================
|
|
|
|
exit_puzzle_button_press:
|
|
|
|
jsr click_speaker ; click speaker
|
|
|
|
lda CURSOR_Y
|
|
cmp #40
|
|
bcs check_valid ; bge
|
|
|
|
; handle 4 chars
|
|
lda CURSOR_X
|
|
cmp #10
|
|
bcc handle_char1
|
|
cmp #20
|
|
bcc handle_char2
|
|
cmp #30
|
|
bcc handle_char3
|
|
bcs handle_char4
|
|
|
|
handle_char1:
|
|
inc MECHE_LOCK1
|
|
lda MECHE_LOCK1
|
|
cmp #10
|
|
bne wrap_lock1
|
|
lda #0
|
|
sta MECHE_LOCK1
|
|
wrap_lock1:
|
|
rts
|
|
|
|
handle_char2:
|
|
inc MECHE_LOCK2
|
|
lda MECHE_LOCK2
|
|
cmp #10
|
|
bne wrap_lock2
|
|
lda #0
|
|
sta MECHE_LOCK2
|
|
wrap_lock2:
|
|
rts
|
|
|
|
handle_char3:
|
|
inc MECHE_LOCK3
|
|
lda MECHE_LOCK3
|
|
cmp #10
|
|
bne wrap_lock3
|
|
lda #0
|
|
sta MECHE_LOCK3
|
|
wrap_lock3:
|
|
rts
|
|
|
|
handle_char4:
|
|
inc MECHE_LOCK4
|
|
lda MECHE_LOCK4
|
|
cmp #10
|
|
bne wrap_lock4
|
|
lda #0
|
|
sta MECHE_LOCK4
|
|
wrap_lock4:
|
|
rts
|
|
|
|
check_valid:
|
|
|
|
jsr check_puzzle_solved
|
|
bcs proper_code
|
|
bcc not_valid
|
|
|
|
proper_code:
|
|
|
|
; move to in front of open door
|
|
|
|
lda #MECHE_BOOK_STAIRS
|
|
sta LOCATION
|
|
jsr change_location
|
|
|
|
not_valid:
|
|
|
|
rts
|
|
|
|
|
|
;=======================
|
|
; check if puzzle solved
|
|
;=======================
|
|
check_puzzle_solved:
|
|
lda MECHE_LOCK1
|
|
cmp #2
|
|
bne keep_door_closed
|
|
lda MECHE_LOCK2
|
|
cmp #8
|
|
bne keep_door_closed
|
|
lda MECHE_LOCK3
|
|
cmp #5
|
|
bne keep_door_closed
|
|
lda MECHE_LOCK4
|
|
cmp #1
|
|
bne keep_door_closed
|
|
keep_door_open:
|
|
|
|
; change to open stairwell
|
|
ldy #LOCATION_NORTH_BG
|
|
lda #<entrance_open_n_lzsa
|
|
sta location4,Y
|
|
lda #>entrance_open_n_lzsa
|
|
sta location4+1,Y
|
|
|
|
; path to stairs handled elsewhere
|
|
|
|
; set carry to indicate open
|
|
|
|
sec
|
|
|
|
rts
|
|
keep_door_closed:
|
|
|
|
; change to closed stairwell
|
|
ldy #LOCATION_NORTH_BG
|
|
lda #<entrance_n_lzsa
|
|
sta location4,Y
|
|
lda #>entrance_n_lzsa
|
|
sta location4+1,Y
|
|
|
|
; path to stairs handled elsewhere
|
|
|
|
; clear carry to indicate closed
|
|
|
|
clc
|
|
|
|
rts
|
|
|
|
|
|
;========================
|
|
; draw sprites
|
|
|
|
draw_exit_puzzle_sprites:
|
|
|
|
lda MECHE_LOCK1
|
|
asl
|
|
tay
|
|
lda exit_puzzle_sprites,Y
|
|
sta INL
|
|
lda exit_puzzle_sprites+1,Y
|
|
sta INH
|
|
lda #5
|
|
sta XPOS
|
|
lda #8
|
|
sta YPOS
|
|
jsr put_sprite_crop
|
|
|
|
lda MECHE_LOCK2
|
|
asl
|
|
tay
|
|
lda exit_puzzle_sprites,Y
|
|
sta INL
|
|
lda exit_puzzle_sprites+1,Y
|
|
sta INH
|
|
lda #14
|
|
sta XPOS
|
|
lda #8
|
|
sta YPOS
|
|
jsr put_sprite_crop
|
|
|
|
lda MECHE_LOCK3
|
|
asl
|
|
tay
|
|
lda exit_puzzle_sprites,Y
|
|
sta INL
|
|
lda exit_puzzle_sprites+1,Y
|
|
sta INH
|
|
lda #23
|
|
sta XPOS
|
|
lda #8
|
|
sta YPOS
|
|
jsr put_sprite_crop
|
|
|
|
lda MECHE_LOCK4
|
|
asl
|
|
tay
|
|
lda exit_puzzle_sprites,Y
|
|
sta INL
|
|
lda exit_puzzle_sprites+1,Y
|
|
sta INH
|
|
lda #32
|
|
sta XPOS
|
|
lda #8
|
|
sta YPOS
|
|
jsr put_sprite_crop
|
|
|
|
|
|
rts
|
|
|
|
|
|
;=========================================
|
|
; exit puzzle first
|
|
;
|
|
; we have two exits to puzzle, one N and W, try to handle both
|
|
; not really opitmal
|
|
|
|
; also handle path to book
|
|
|
|
try_exit_puzzle:
|
|
|
|
lda DIRECTION
|
|
and #$f
|
|
cmp #DIRECTION_N
|
|
beq exit_facing_north
|
|
|
|
exit_facing_west:
|
|
lda CURSOR_X
|
|
cmp #29
|
|
bcs go_to_puzzle ; bge
|
|
|
|
; didn't click on the puzzle so instead go to MECHE_ARRIVAL
|
|
|
|
lda #MECHE_ARRIVAL
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
go_to_puzzle:
|
|
lda #DIRECTION_N
|
|
sta DIRECTION
|
|
jmp do_puzzle
|
|
|
|
|
|
exit_facing_north:
|
|
|
|
lda CURSOR_X
|
|
cmp #14
|
|
bcc do_puzzle ; if less than 14 go to puzzle
|
|
cmp #23 ; if greater than 22 go to MECHE_FORT_VIEW
|
|
bcs cant_go_there
|
|
|
|
exit_check_for_tunnel:
|
|
; not puzzle, instead go down steps if available
|
|
|
|
jsr check_puzzle_solved
|
|
bcc cant_go_there
|
|
|
|
lda #MECHE_BOOK_STAIRS
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
cant_go_there:
|
|
lda #MECHE_FORT_VIEW
|
|
sta LOCATION
|
|
jmp change_location
|
|
|
|
do_puzzle:
|
|
lda #MECHE_EXIT_PUZZLE
|
|
sta LOCATION
|
|
jsr change_location
|
|
rts
|
|
|
|
;=================================
|
|
;=================================
|
|
; rotation stuff
|
|
;=================================
|
|
;=================================
|
|
|
|
handle_rotation_controls:
|
|
|
|
lda CURSOR_Y
|
|
|
|
cmp #34
|
|
bcs rot_button_press
|
|
|
|
lda CURSOR_X
|
|
cmp #19
|
|
bcc handle_left ; blt
|
|
|
|
handle_right:
|
|
|
|
lda MECHE_LEVERS
|
|
eor #RIGHT_LEVER
|
|
sta MECHE_LEVERS
|
|
|
|
rts
|
|
|
|
handle_left:
|
|
lda MECHE_LEVERS
|
|
eor #LEFT_LEVER
|
|
sta MECHE_LEVERS
|
|
|
|
; if flip to 0, then update rotation
|
|
|
|
and #LEFT_LEVER
|
|
bne done_handle_left
|
|
|
|
jsr rotate_fortress
|
|
|
|
done_handle_left:
|
|
rts
|
|
|
|
|
|
rot_button_press:
|
|
|
|
; get outside and face elevator
|
|
lda #MECHE_TOP_FLOOR
|
|
sta LOCATION
|
|
lda #DIRECTION_W
|
|
sta DIRECTION
|
|
|
|
; change to plain elevator
|
|
ldy #LOCATION_WEST_BG
|
|
lda #<top_floor_ye_w_lzsa
|
|
sta location27,Y ; MECHE_TOP_FLOOR
|
|
lda #>top_floor_ye_w_lzsa
|
|
sta location27+1,Y ; MECHE_TOP_FLOOR
|
|
|
|
; change destination to controls
|
|
ldy #LOCATION_WEST_EXIT
|
|
lda #MECHE_IN_ELEVATOR
|
|
sta location27,Y ; MECHE_TOP_FLOOR
|
|
|
|
; restore ability to look up
|
|
ldy #LOCATION_SPECIAL_EXIT
|
|
lda #DIRECTION_W
|
|
sta location27,Y ; MECHE_TOP_FLOOR
|
|
|
|
jmp change_location ; tail call
|
|
|
|
|
|
|
|
|
|
;=================================
|
|
; draw rotation controls
|
|
;=================================
|
|
|
|
draw_rotation_controls:
|
|
|
|
;==========================
|
|
; rotate, where applicable
|
|
|
|
lda MECHE_LEVERS
|
|
and #LEFT_LEVER
|
|
beq draw_rotation
|
|
|
|
lda MECHE_LEVERS
|
|
and #RIGHT_LEVER
|
|
beq draw_rotation
|
|
|
|
lda FRAMEL
|
|
and #$f
|
|
bne draw_rotation
|
|
|
|
inc MECHE_ROTATION
|
|
lda MECHE_ROTATION
|
|
and #$f
|
|
sta MECHE_ROTATION
|
|
|
|
draw_rotation:
|
|
|
|
; draw rotation
|
|
lda MECHE_ROTATION
|
|
lsr
|
|
lsr
|
|
; 0 -> $C1 at 19,8
|
|
; 1 -> $10 at 21,4
|
|
; 2 -> $01 at 19,2
|
|
; 3 -> $10 at 17,4
|
|
|
|
beq rot0
|
|
cmp #1
|
|
beq rot1
|
|
cmp #2
|
|
beq rot2
|
|
bne rot3
|
|
|
|
rot0:
|
|
lda #$C1
|
|
sta $613
|
|
sta $A13
|
|
jmp draw_levers
|
|
rot1:
|
|
lda #$10
|
|
sta $515
|
|
sta $915
|
|
jmp draw_levers
|
|
rot2:
|
|
lda #$01
|
|
sta $493
|
|
sta $893
|
|
jmp draw_levers
|
|
rot3:
|
|
lda #$10
|
|
sta $511
|
|
sta $911
|
|
jmp draw_levers
|
|
|
|
draw_levers:
|
|
; draw left lever
|
|
lda #<lever_sprite
|
|
sta INL
|
|
lda #>lever_sprite
|
|
sta INH
|
|
|
|
lda #15
|
|
sta XPOS
|
|
|
|
lda MECHE_LEVERS
|
|
and #LEFT_LEVER
|
|
eor #LEFT_LEVER
|
|
asl
|
|
asl
|
|
asl
|
|
clc
|
|
adc #20
|
|
sta YPOS
|
|
|
|
jsr put_sprite_crop
|
|
|
|
; draw right lever
|
|
|
|
lda #<lever_sprite
|
|
sta INL
|
|
lda #>lever_sprite
|
|
sta INH
|
|
|
|
lda #21
|
|
sta XPOS
|
|
|
|
lda MECHE_LEVERS
|
|
and #RIGHT_LEVER
|
|
eor #RIGHT_LEVER
|
|
asl
|
|
asl
|
|
clc
|
|
adc #20
|
|
sta YPOS
|
|
|
|
jsr put_sprite_crop
|
|
|
|
rts
|
|
|
|
lever_sprite:
|
|
.byte 4,3
|
|
.byte $0A,$00,$00,$0A
|
|
.byte $00,$00,$05,$00
|
|
.byte $A0,$00,$00,$A0
|
|
|
|
|
|
|
|
|
|
|
|
;========================
|
|
; rotate fortress
|
|
|
|
rotate_fortress:
|
|
|
|
; 0 = S
|
|
; 4 = E
|
|
; 8 = N
|
|
; 12 = W
|
|
|
|
lda MECHE_ROTATION
|
|
lsr
|
|
lsr
|
|
beq fortress_south
|
|
cmp #1
|
|
beq fortress_east
|
|
cmp #2
|
|
beq fortress_north
|
|
bne fortress_west
|
|
|
|
fortress_south:
|
|
|
|
; point exit south (original entry point)
|
|
|
|
ldy #LOCATION_SOUTH_EXIT
|
|
lda #MECHE_BRIDGE2
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
ldy #LOCATION_SOUTH_EXIT_DIR
|
|
lda #DIRECTION_S
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
; set bg to orig entry background
|
|
|
|
ldy #LOCATION_SOUTH_BG
|
|
|
|
lda #<fort_entry_s_lzsa
|
|
sta location8,Y
|
|
lda #>fort_entry_s_lzsa
|
|
|
|
jmp rotate_fortress_done
|
|
|
|
fortress_west:
|
|
|
|
; point exit south (original entry point)
|
|
|
|
ldy #LOCATION_SOUTH_EXIT
|
|
lda #MECHE_WEST_PLATFORM
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
ldy #LOCATION_SOUTH_EXIT_DIR
|
|
lda #DIRECTION_W
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
; set bg to orig entry background
|
|
|
|
ldy #LOCATION_SOUTH_BG
|
|
|
|
lda #<fort_exit_w_lzsa
|
|
sta location8,Y
|
|
lda #>fort_exit_w_lzsa
|
|
|
|
jmp rotate_fortress_done
|
|
|
|
fortress_east:
|
|
|
|
; point exit south (original entry point)
|
|
|
|
ldy #LOCATION_SOUTH_EXIT
|
|
lda #MECHE_EAST_PLATFORM
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
ldy #LOCATION_SOUTH_EXIT_DIR
|
|
lda #DIRECTION_E
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
; set bg to orig entry background
|
|
|
|
ldy #LOCATION_SOUTH_BG
|
|
|
|
lda #<fort_exit_e_lzsa
|
|
sta location8,Y
|
|
lda #>fort_exit_e_lzsa
|
|
|
|
jmp rotate_fortress_done
|
|
|
|
fortress_north:
|
|
|
|
; point exit south (original entry point)
|
|
|
|
ldy #LOCATION_SOUTH_EXIT
|
|
lda #MECHE_NORTH_PLATFORM
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
ldy #LOCATION_SOUTH_EXIT_DIR
|
|
lda #DIRECTION_N
|
|
sta location8,Y ; MECH_FORT_ENTRY
|
|
|
|
; set bg to orig entry background
|
|
|
|
ldy #LOCATION_SOUTH_BG
|
|
|
|
lda #<fort_exit_n_lzsa
|
|
sta location8,Y
|
|
lda #>fort_exit_n_lzsa
|
|
|
|
jmp rotate_fortress_done
|
|
|
|
|
|
|
|
rotate_fortress_done:
|
|
|
|
sta location8+1,Y
|
|
|
|
rts
|
|
|
|
|
|
|
|
;==================================
|
|
; elevator stuff
|
|
;==================================
|
|
|
|
|
|
;==============================
|
|
; handle elevator button pushes
|
|
|
|
elevator_button:
|
|
lda CURSOR_Y
|
|
cmp #24
|
|
bcs elevator_goto_ground
|
|
cmp #20
|
|
bcs elevator_goto_half
|
|
|
|
elevator_goto_top:
|
|
|
|
; set exit to top floor
|
|
|
|
ldy #LOCATION_EAST_EXIT
|
|
lda #MECHE_TOP_FLOOR
|
|
sta location26,Y
|
|
|
|
; set bg to top-floor backround
|
|
|
|
ldy #LOCATION_EAST_BG
|
|
|
|
lda #<elevator_top_e_lzsa
|
|
sta location26,Y
|
|
lda #>elevator_top_e_lzsa
|
|
|
|
jmp elevator_button_done
|
|
|
|
|
|
elevator_goto_ground:
|
|
|
|
; set exit to top floor
|
|
|
|
ldy #LOCATION_EAST_EXIT
|
|
lda #MECHE_ELEVATOR_PATH
|
|
sta location26,Y
|
|
|
|
; set bg to top-floor backround
|
|
|
|
ldy #LOCATION_EAST_BG
|
|
|
|
lda #<elevator_ground_e_lzsa
|
|
sta location26,Y
|
|
lda #>elevator_ground_e_lzsa
|
|
|
|
jmp elevator_button_done
|
|
|
|
|
|
|
|
|
|
elevator_goto_half:
|
|
|
|
; if at top kick outside and lower
|
|
; TODO: animation?
|
|
|
|
ldy #LOCATION_EAST_EXIT
|
|
lda location26,Y
|
|
cmp #MECHE_TOP_FLOOR
|
|
bne regular_half
|
|
|
|
half_and_controls:
|
|
;=============================
|
|
; kick us out, lower controls
|
|
|
|
; get outside and face elevator
|
|
lda #MECHE_TOP_FLOOR
|
|
sta LOCATION
|
|
lda #DIRECTION_W
|
|
sta DIRECTION
|
|
|
|
; change to elevator roof
|
|
ldy #LOCATION_WEST_BG
|
|
lda #<top_floor_ne_w_lzsa
|
|
sta location27,Y ; MECHE_TOP_FLOOR
|
|
lda #>top_floor_ne_w_lzsa
|
|
sta location27+1,Y ; MECHE_TOP_FLOOR
|
|
|
|
; change destination to controls
|
|
ldy #LOCATION_WEST_EXIT
|
|
lda #MECHE_ROTATE_CONTROLS
|
|
sta location27,Y ; MECHE_TOP_FLOOR
|
|
|
|
; disable ability to look up
|
|
ldy #LOCATION_SPECIAL_EXIT
|
|
lda #$ff
|
|
sta location27,Y ; MECHE_TOP_FLOOR
|
|
|
|
jmp elevator_button_done_no_update
|
|
|
|
regular_half:
|
|
; set exit to top floor
|
|
|
|
ldy #LOCATION_EAST_EXIT
|
|
lda #$ff
|
|
sta location26,Y
|
|
|
|
; set bg to half-floor backround
|
|
|
|
ldy #LOCATION_EAST_BG
|
|
|
|
lda #<elevator_half_e_lzsa
|
|
sta location26,Y
|
|
lda #>elevator_half_e_lzsa
|
|
|
|
jmp elevator_button_done
|
|
|
|
|
|
|
|
elevator_goto_controls:
|
|
|
|
elevator_button_done:
|
|
|
|
sta location26+1,Y
|
|
|
|
elevator_button_done_no_update:
|
|
|
|
jsr change_location ; tail call?
|
|
|
|
rts
|
|
|
|
|
|
;=================
|
|
; elevator panel clicked
|
|
|
|
; behavior a bit different in real game (it slides around more)
|
|
; also in theory could animate handle
|
|
; Apple II doesn't let you know length of keypress
|
|
|
|
elevator_panel_clicked:
|
|
|
|
lda MECHE_ELEVATOR
|
|
clc
|
|
adc #1
|
|
and #$83
|
|
sta MECHE_ELEVATOR
|
|
|
|
jsr adjust_basement_door
|
|
|
|
rts
|
|
|
|
|
|
;=====================
|
|
; draw elevator panel
|
|
|
|
draw_elevator_panel:
|
|
|
|
lda MECHE_ELEVATOR
|
|
and #$f
|
|
asl
|
|
tay
|
|
|
|
lda elevator_rotation_sprites,Y
|
|
sta INL
|
|
lda elevator_rotation_sprites+1,Y
|
|
sta INH
|
|
|
|
lda #13
|
|
sta XPOS
|
|
lda #20
|
|
sta YPOS
|
|
|
|
jsr put_sprite_crop
|
|
|
|
rts
|
|
|
|
;==================================
|
|
; basement door button
|
|
;==================================
|
|
|
|
basement_button:
|
|
|
|
; flip switch
|
|
|
|
lda #$80
|
|
eor MECHE_ELEVATOR
|
|
sta MECHE_ELEVATOR
|
|
|
|
jsr adjust_basement_door
|
|
|
|
jsr change_location
|
|
|
|
rts
|
|
|
|
;==================================
|
|
; adjust basement door
|
|
;==================================
|
|
|
|
adjust_basement_door:
|
|
|
|
lda MECHE_ELEVATOR
|
|
bmi floor_open
|
|
|
|
floor_closed:
|
|
and #$f
|
|
cmp #2
|
|
beq floor_closed_elevator_on
|
|
bne floor_closed_elevator_off
|
|
|
|
floor_open:
|
|
|
|
; point exit to basement
|
|
|
|
ldy #LOCATION_WEST_EXIT
|
|
lda #MECHE_BASEMENT
|
|
sta location18,Y
|
|
|
|
lda MECHE_ELEVATOR
|
|
and #$f
|
|
cmp #2
|
|
beq floor_open_elevator_on
|
|
bne floor_open_elevator_off
|
|
|
|
floor_open_elevator_on:
|
|
|
|
; point background to open floor / open elevator
|
|
|
|
ldy #LOCATION_WEST_BG
|
|
lda #<red_button_of_oe_w_lzsa
|
|
sta location18,Y
|
|
lda #>red_button_of_oe_w_lzsa
|
|
jmp adjust_basement_door_done
|
|
|
|
floor_open_elevator_off:
|
|
|
|
; point background to open floor / closed elevator
|
|
|
|
ldy #LOCATION_WEST_BG
|
|
|
|
lda #<red_button_of_ce_w_lzsa
|
|
sta location18,Y
|
|
lda #>red_button_of_ce_w_lzsa
|
|
jmp adjust_basement_door_done
|
|
|
|
floor_closed_elevator_on:
|
|
|
|
; point hallway to elevator path
|
|
|
|
ldy #LOCATION_WEST_EXIT
|
|
lda #MECHE_ELEVATOR_PATH
|
|
sta location18,Y
|
|
|
|
ldy #LOCATION_WEST_BG
|
|
|
|
lda #<red_button_cf_oe_w_lzsa
|
|
sta location18,Y
|
|
lda #>red_button_cf_oe_w_lzsa
|
|
jmp adjust_basement_door_done
|
|
|
|
|
|
floor_closed_elevator_off:
|
|
|
|
; disabl exit
|
|
|
|
ldy #LOCATION_WEST_EXIT
|
|
lda #$ff
|
|
sta location18,Y
|
|
|
|
ldy #LOCATION_WEST_BG
|
|
|
|
lda #<red_button_cf_ce_w_lzsa
|
|
sta location18,Y
|
|
lda #>red_button_cf_ce_w_lzsa
|
|
jmp adjust_basement_door_done
|
|
|
|
|
|
adjust_basement_door_done:
|
|
sta location18+1,Y
|
|
rts
|
|
|
|
adjust_fortress_rotation:
|
|
|
|
rts
|
|
|
|
|
|
;==================================
|
|
; sprites
|
|
;==================================
|
|
|
|
elevator_rotation_sprites:
|
|
.word elevator0,elevator1,elevator2,elevator3
|
|
|
|
elevator0:
|
|
.byte 3,2
|
|
.byte $00,$ff,$00
|
|
.byte $f0,$0f,$f0
|
|
|
|
elevator1:
|
|
.byte 3,2
|
|
.byte $0f,$f0,$f0
|
|
.byte $f0,$0f,$0f
|
|
|
|
elevator2:
|
|
.byte 3,2
|
|
.byte $1f,$f1,$1f
|
|
.byte $11,$ff,$11
|
|
|
|
elevator3:
|
|
.byte 3,2
|
|
.byte $f0,$f0,$0f
|
|
.byte $0f,$0f,$f0
|
|
|
|
|
|
|
|
exit_puzzle_sprites:
|
|
.word exit_char0,exit_char1,exit_char2,exit_char3,exit_char4
|
|
.word exit_char5,exit_char6,exit_char7,exit_char8,exit_char9
|
|
|
|
exit_char0: ; +
|
|
.byte 4,5
|
|
.byte $ff,$4f,$4f,$ff
|
|
.byte $ff,$44,$44,$ff
|
|
.byte $44,$44,$44,$44
|
|
.byte $ff,$44,$44,$ff
|
|
.byte $ff,$f4,$f4,$ff
|
|
|
|
exit_char1: ; half circle
|
|
.byte 4,5
|
|
.byte $ff,$4f,$44,$ff
|
|
.byte $4f,$44,$44,$ff
|
|
.byte $44,$44,$44,$ff
|
|
.byte $ff,$44,$44,$ff
|
|
.byte $ff,$ff,$f4,$ff
|
|
|
|
exit_char2: ; Cyan Logo
|
|
.byte 4,5
|
|
.byte $4f,$f4,$f4,$4f
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $f4,$ff,$ff,$f4
|
|
|
|
exit_char3: ; Right Triangle
|
|
.byte 4,5
|
|
.byte $44,$44,$44,$44
|
|
.byte $44,$44,$44,$ff
|
|
.byte $44,$44,$f4,$ff
|
|
.byte $44,$f4,$ff,$ff
|
|
.byte $f4,$ff,$ff,$ff
|
|
|
|
exit_char4: ; split square
|
|
.byte 4,5
|
|
.byte $44,$f4,$ff,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $f4,$ff,$f4,$f4
|
|
|
|
exit_char5: ; spikes with ball
|
|
.byte 4,5
|
|
.byte $ff,$44,$44,$ff
|
|
.byte $ff,$f4,$f4,$ff
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $f4,$ff,$ff,$f4
|
|
|
|
exit_char6: ; ping pong
|
|
.byte 4,5
|
|
.byte $44,$ff,$44,$44
|
|
.byte $f4,$4f,$ff,$ff
|
|
.byte $ff,$f4,$4f,$ff
|
|
.byte $ff,$ff,$f4,$4f
|
|
.byte $ff,$ff,$ff,$f4
|
|
|
|
exit_char7: ; zig-zag
|
|
.byte 4,5
|
|
.byte $f4,$44,$4f,$ff
|
|
.byte $ff,$4f,$44,$f4
|
|
.byte $f4,$44,$4f,$ff
|
|
.byte $ff,$4f,$44,$f4
|
|
.byte $f4,$f4,$ff,$ff
|
|
|
|
exit_char8: ; triangles alternating
|
|
.byte 4,5
|
|
.byte $44,$44,$ff,$44
|
|
.byte $44,$44,$ff,$44
|
|
.byte $44,$ff,$4f,$44
|
|
.byte $44,$ff,$44,$44
|
|
.byte $f4,$ff,$f4,$f4
|
|
|
|
exit_char9: ; circle with square
|
|
.byte 4,5
|
|
.byte $4f,$f4,$f4,$4f
|
|
.byte $44,$4f,$4f,$44
|
|
.byte $44,$44,$44,$44
|
|
.byte $44,$ff,$ff,$44
|
|
.byte $ff,$f4,$f4,$ff
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|