Compare commits

...

2 Commits

Author SHA1 Message Date
Vince Weaver 0652503fbc keen: more work on generic engine 2024-04-19 01:41:52 -04:00
Vince Weaver d246207c95 keen: work on generic engine 2024-04-19 01:30:17 -04:00
21 changed files with 1122 additions and 611 deletions

View File

@ -11,14 +11,17 @@ EMPTY_DISK = ../../empty_disk/empty.dsk
all: keen1_lores.dsk all: keen1_lores.dsk
keen1_lores.dsk: HELLO LOADER TITLE MARS LEVEL1 LEVEL2 keen1_lores.dsk: HELLO LOADER TITLE ENGINE MARS \
LEVEL1 LEVEL2 LEVEL3
cp $(EMPTY_DISK) keen1_lores.dsk cp $(EMPTY_DISK) keen1_lores.dsk
$(DOS33) -y keen1_lores.dsk SAVE A HELLO $(DOS33) -y keen1_lores.dsk SAVE A HELLO
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x1000 LOADER $(DOS33) -y keen1_lores.dsk BSAVE -a 0x1000 LOADER
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 TITLE $(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 TITLE
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 MARS $(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 ENGINE
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 LEVEL1 $(DOS33) -y keen1_lores.dsk BSAVE -a 0x4000 MARS
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x2000 LEVEL2 $(DOS33) -y keen1_lores.dsk BSAVE -a 0x6000 LEVEL1
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x6000 LEVEL2
$(DOS33) -y keen1_lores.dsk BSAVE -a 0x6000 LEVEL3
### ###
@ -47,7 +50,7 @@ title.o: title.s zp.inc hardware.inc \
#### ####
MARS: mars.o MARS: mars.o
ld65 -o MARS mars.o -C ../../linker_scripts/apple2_2000.inc ld65 -o MARS mars.o -C ../../linker_scripts/apple2_4000.inc
mars.o: mars.s zp.inc hardware.inc game_over.s \ mars.o: mars.s zp.inc hardware.inc game_over.s \
gr_fade.s \ gr_fade.s \
@ -60,34 +63,63 @@ mars.o: mars.s zp.inc hardware.inc game_over.s \
#### ####
LEVEL1: level1.o LEVEL1: level1.o
ld65 -o LEVEL1 level1.o -C ../../linker_scripts/apple2_2000.inc ld65 -o LEVEL1 level1.o -C ../../linker_scripts/apple2_6000.inc
level1.o: level1.s zp.inc hardware.inc \ level1.o: level1.s \
text_help.s gr_fast_clear.s text_quit_yn.s text_drawbox.s \ maps/level1_map.zx02
level1_enemies.s level1_items.s \
graphics/keen_graphics.inc sprites/keen_sprites.inc \
maps/level1_map.zx02 \
status_bar.s draw_keen.s move_keen.s gr_putsprite_crop.s \
draw_tilemap.s tilemap_lookup.s \
level1_sfx.s longer_sound.s level1_data.inc \
keyboard.s handle_laser.s
ca65 -o level1.o level1.s -l level1.lst ca65 -o level1.o level1.s -l level1.lst
#### ####
LEVEL2: level2.o LEVEL2: level2.o
ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_2000.inc ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_6000.inc
level2.o: level2.s zp.inc hardware.inc \ level2.o: level2.s \
maps/level2_map.zx02
ca65 -o level2.o level2.s -l level2.lst
####
LEVEL3: level3.o
ld65 -o LEVEL3 level3.o -C ../../linker_scripts/apple2_6000.inc
level3.o: level3.s \
maps/level3_map.zx02
ca65 -o level3.o level3.s -l level3.lst
####
ENGINE: engine.o
ld65 -o ENGINE engine.o -C ../../linker_scripts/apple2_4000.inc
engine.o: engine.s zp.inc hardware.inc \
text_help.s gr_fast_clear.s text_quit_yn.s text_drawbox.s \ text_help.s gr_fast_clear.s text_quit_yn.s text_drawbox.s \
level1_enemies.s level1_items.s \ level1_enemies.s level1_items.s \
graphics/keen_graphics.inc sprites/keen_sprites.inc \ graphics/keen_graphics.inc sprites/keen_sprites.inc \
maps/level2_map.zx02 \
status_bar.s draw_keen.s move_keen.s gr_putsprite_crop.s \ status_bar.s draw_keen.s move_keen.s gr_putsprite_crop.s \
draw_tilemap.s tilemap_lookup.s \ draw_tilemap.s tilemap_lookup.s \
level1_sfx.s longer_sound.s level2_data.inc \ level1_sfx.s longer_sound.s \
keyboard.s handle_laser.s keyboard.s handle_laser.s
ca65 -o level2.o level2.s -l level2.lst ca65 -o engine.o engine.s -l engine.lst
####
#LEVEL2: level2.o
# ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_2000.inc
#
#level2.o: level2.s zp.inc hardware.inc \
# text_help.s gr_fast_clear.s text_quit_yn.s text_drawbox.s \
# level1_enemies.s level1_items.s \
# graphics/keen_graphics.inc sprites/keen_sprites.inc \
# maps/level2_map.zx02 \
# status_bar.s draw_keen.s move_keen.s gr_putsprite_crop.s \
# draw_tilemap.s tilemap_lookup.s \
# level1_sfx.s longer_sound.s level2_data.inc \
# keyboard.s handle_laser.s
# ca65 -o level2.o level2.s -l level2.lst
#### ####
@ -106,7 +138,7 @@ maps/level1_map.lzsa:
#### ####
clean: clean:
rm -f *~ *.o *.lst HELLO LOADER TITLE MARS LEVEL1 LEVEL2 rm -f *~ *.o *.lst HELLO LOADER TITLE ENGINE MARS LEVEL1 LEVEL2
cd graphics && make clean cd graphics && make clean
cd maps && make clean cd maps && make clean
# cd title && make clean # cd title && make clean

View File

@ -10,9 +10,18 @@ Memory map:
$1000-$1fff = loader $1000-$1fff = loader
$2000-$3fff = code (8k? currently 5k) $2000-$3fff = code (8k? currently 5k)
$9000-$93ff = tiles (1k) ; MARS = 6k
$9400-????? = big_tilemap (10k) ; LEVEL1 = 6k
$BC00-????? = tilemap (1k) 10x16 ; TITLE = 4k
; LOAD engine at $4000
; $4000 - $5fff = 8k worst case
; LOAD level data at $6000
; $6000 - $7fff = 8k worst case
$9000-$93FF = tiles (1k)
$9400-$BBFF = big_tilemap (10k) 128x80
$BC00-$BCFF = small tilemap (256B) 20x12
tiles are 2x4, or 4 bytes each tiles are 2x4, or 4 bytes each
so in theory can have up to 256 of them so in theory can have up to 256 of them

View File

@ -207,7 +207,7 @@ done_tilemap_subset:
; activate yorps ; activate yorps
;========================== ;==========================
ldx #NUM_ENEMIES ldx NUM_ENEMIES
beq done_yorps beq done_yorps
clc clc

329
games/keen/engine.s Normal file
View File

@ -0,0 +1,329 @@
; Game Engine for Apple II Commander Keen
; by deater (Vince Weaver) <vince@deater.net>
; Zero Page
.include "zp.inc"
.include "hardware.inc"
.include "common_defines.inc"
; .include "level1_data.inc"
level_data = $6000
max_tile_x = level_data+0
max_tile_y = level_data+1
start_keen_tilex= level_data+2
start_keen_tiley= level_data+3
start_tilemap_x = level_data+4
start_tilemap_y = level_data+5
num_enemies = level_data+6
hardtop_tiles = level_data+7
allhard_tiles = level_data+8
;enemy_data = $6100
oracle_message = $6200
level_data_zx02 = $6300
level_start:
;===================
; init screen
bit KEYRESET
bit SET_GR
bit PAGE1
bit LORES
bit FULLGR
jsr clear_top ; avoid grey stripes at load
;=====================
; init vars
;=====================
lda max_tile_x
sta MAX_TILE_X
sec
sbc #20
sta max_tilex_minus_20_smc+1
lda MAX_TILE_X
sec
sbc #1
sta max_tilex_minus_1_smc+1
lda max_tile_y
sta MAX_TILE_Y
sec
sbc #6
sta max_tiley_minus_6_smc+1
; lda start_keen_tilex
; sta START_KEEN_TILEX
; lda start_keen_tiley
; sta START_KEEN_TILEY
; lda start_tilemap_x
; sta START_TILEMAP_X
; lda start_tilemap_y
; sta START_TILEMAP_Y
lda num_enemies
sta NUM_ENEMIES
lda hardtop_tiles
sta HARDTOP_TILES
lda allhard_tiles
sta ALLHARD_TILES
lda #0
sta ANIMATE_FRAME
sta FRAMEL
sta FRAMEH
sta KEEN_WALKING
sta KEEN_JUMPING
sta LEVEL_OVER
sta LASER_OUT
sta KEEN_XL
sta KEEN_FALLING
sta KEEN_SHOOTING
sta KEYCARDS
; debug
; lda #9
; sta RAYGUNS
lda #4
sta DRAW_PAGE
; set starting location
lda start_keen_tilex
sta KEEN_TILEX
lda start_keen_tiley
sta KEEN_TILEY
lda #0 ; offset from tile location
sta KEEN_X
sta KEEN_Y
lda #RIGHT ; direction
sta KEEN_DIRECTION
;====================================
; load level1 tilemap
;====================================
lda #<level_data_zx02
sta ZX0_src
lda #>level_data_zx02
sta ZX0_src+1
lda #$90 ; load to page $9000
jsr full_decomp
;====================================
; copy in tilemap subset
;====================================
; we copy in full screen, 40x48 = 20x12 tiles
; we start out assuming position is 0,5
lda start_tilemap_x
sta TILEMAP_X
lda start_tilemap_y
sta TILEMAP_Y
jsr copy_tilemap_subset
;====================================
;====================================
; Main loop
;====================================
;====================================
keen_loop:
; draw tilemap
jsr draw_tilemap
; draw enemies
jsr draw_enemies
; draw laser
jsr draw_laser
; draw keen
jsr draw_keen
jsr page_flip
jsr handle_keypress
jsr move_keen
jsr move_enemies
jsr move_laser
;========================
; increment frame count
;========================
inc FRAMEL
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
;===========================
; check end of level
;===========================
lda LEVEL_OVER
bne done_with_keen
;===========================
; delay
;===========================
; lda #200
; jsr WAIT
jmp keen_loop
done_with_keen:
bit KEYRESET ; clear keypress
; three reasons we could get here
; NEXT_LEVEL = finished level by exiting door
; GAME_OVER = hit ESC and said Y to QUIT
; TOUCHED_ENEMY = touched an enemy
lda LEVEL_OVER
cmp #NEXT_LEVEL
beq level1_levelover
cmp #GAME_OVER
beq level1_gameover
; got here, touched enemy
;============================
; end animation
;============================
lda #1
sta PLAY_END_SOUND
inc KEEN_TILEY ; move down
sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS
level_end_animation:
jsr draw_tilemap
ldx #<keen_sprite_squish
lda #>keen_sprite_squish
stx INL
sta INH
jsr put_sprite_crop
jsr page_flip
lda PLAY_END_SOUND
beq skip_end_sound
ldy #SFX_KEENDIESND
jsr play_sfx
dec PLAY_END_SOUND
skip_end_sound:
lda #50
jsr WAIT
dec YPOS
dec YPOS
bpl level_end_animation
dec KEENS
bpl level1_levelover
level1_gameover:
; mars plays the sound
lda #GAME_OVER
sta LEVEL_OVER
level1_levelover:
lda #LOAD_MARS
sta WHICH_LOAD
rts ; exit back
;==========================
; includes
;==========================
.include "text_print.s"
.include "gr_offsets.s"
.include "gr_fast_clear.s"
.include "gr_pageflip.s"
.include "gr_putsprite_crop.s"
.include "zx02_optim.s"
.include "status_bar.s"
.include "keyboard.s"
.include "joystick.s"
.include "text_drawbox.s"
.include "text_help.s"
.include "text_quit_yn.s"
.include "draw_keen.s"
.include "sprites/keen_sprites.inc"
.include "move_keen.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "level1_enemies.s"
.include "level1_items.s"
.include "level1_sfx.s"
.include "longer_sound.s"
.include "random16.s"
.include "tilemap_lookup.s"
;level1_data_zx02:
; .incbin "maps/level1_map.zx02"
;oracle_message:

View File

@ -39,7 +39,7 @@ laser_check_tiles:
ldy #0 ldy #0
lda (INL),Y lda (INL),Y
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcs destroy_laser bcs destroy_laser
@ -165,7 +165,7 @@ hit_something:
done_laser_enemy: done_laser_enemy:
iny iny
cpy #NUM_ENEMIES cpy NUM_ENEMIES
bne laser_enemies_loop bne laser_enemies_loop
exit_laser_enemy: exit_laser_enemy:

View File

@ -1,280 +1,37 @@
; Keen PoC Level 1 (Border Town) ; Level 1 (Border Town)
; by deater (Vince Weaver) <vince@deater.net> ; at $6000
; Zero Page level1_data:
.include "zp.inc" .byte 116 ;MAX_TILE_X = 116 ; 116 wide
.include "hardware.inc" .byte 16 ;MAX_TILE_Y = 16 ; 16 tall
.include "common_defines.inc"
.include "level1_data.inc" .byte 1 ;START_KEEN_TILEX = 1
.byte 13 ;START_KEEN_TILEY = 13
level1_start: .byte 0 ;START_TILEMAP_X = 0
;=================== .byte 5 ;START_TILEMAP_Y = 5
; init screen
bit KEYRESET .byte 8 ;NUM_ENEMIES = 8
bit SET_GR .byte 32 ;HARDTOP_TILES = 32 ; start at 32
bit PAGE1 .byte 40 ;ALLHARD_TILES = 40 ; start at 40
bit LORES
bit FULLGR
jsr clear_top ; avoid grey stripes at load
;===================== .align $100
; init vars
;=====================
lda #0 ; at $6100
sta ANIMATE_FRAME enemy_data:
sta FRAMEL .byte $0
sta FRAMEH
sta KEEN_WALKING
sta KEEN_JUMPING
sta LEVEL_OVER
sta LASER_OUT
sta KEEN_XL
sta KEEN_FALLING
sta KEEN_SHOOTING
sta KEYCARDS
; debug .align $100
; lda #9
; sta RAYGUNS
lda #4
sta DRAW_PAGE
; set starting location
lda #START_KEEN_TILEX
sta KEEN_TILEX
lda #START_KEEN_TILEY
sta KEEN_TILEY
lda #0 ; offset from tile location
sta KEEN_X
sta KEEN_Y
lda #RIGHT ; direction
sta KEEN_DIRECTION
;====================================
; load level1 tilemap
;====================================
lda #<level1_data_zx02
sta ZX0_src
lda #>level1_data_zx02
sta ZX0_src+1
lda #$90 ; load to page $9000
jsr full_decomp
;====================================
; copy in tilemap subset
;====================================
; we copy in full screen, 40x48 = 20x12 tiles
; we start out assuming position is 0,5
lda #START_TILEMAP_X
sta TILEMAP_X
lda #START_TILEMAP_Y
sta TILEMAP_Y
jsr copy_tilemap_subset
;====================================
;====================================
; Main loop
;====================================
;====================================
keen_loop:
; draw tilemap
jsr draw_tilemap
; draw enemies
jsr draw_enemies
; draw laser
jsr draw_laser
; draw keen
jsr draw_keen
jsr page_flip
jsr handle_keypress
jsr move_keen
jsr move_enemies
jsr move_laser
;========================
; increment frame count
;========================
inc FRAMEL
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
;===========================
; check end of level
;===========================
lda LEVEL_OVER
bne done_with_keen
;===========================
; delay
;===========================
; lda #200
; jsr WAIT
jmp keen_loop
done_with_keen:
bit KEYRESET ; clear keypress
; three reasons we could get here
; NEXT_LEVEL = finished level by exiting door
; GAME_OVER = hit ESC and said Y to QUIT
; TOUCHED_ENEMY = touched an enemy
lda LEVEL_OVER
cmp #NEXT_LEVEL
beq level1_levelover
cmp #GAME_OVER
beq level1_gameover
; got here, touched enemy
;============================
; end animation
;============================
lda #1
sta PLAY_END_SOUND
inc KEEN_TILEY ; move down
sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS
level_end_animation:
jsr draw_tilemap
ldx #<keen_sprite_squish
lda #>keen_sprite_squish
stx INL
sta INH
jsr put_sprite_crop
jsr page_flip
lda PLAY_END_SOUND
beq skip_end_sound
ldy #SFX_KEENDIESND
jsr play_sfx
dec PLAY_END_SOUND
skip_end_sound:
lda #50
jsr WAIT
dec YPOS
dec YPOS
bpl level_end_animation
dec KEENS
bpl level1_levelover
level1_gameover:
; mars plays the sound
lda #GAME_OVER
sta LEVEL_OVER
level1_levelover:
lda #LOAD_MARS
sta WHICH_LOAD
rts ; exit back
;==========================
; includes
;==========================
.include "text_print.s"
.include "gr_offsets.s"
.include "gr_fast_clear.s"
.include "gr_pageflip.s"
.include "gr_putsprite_crop.s"
.include "zx02_optim.s"
.include "status_bar.s"
.include "keyboard.s"
.include "joystick.s"
.include "text_drawbox.s"
.include "text_help.s"
.include "text_quit_yn.s"
.include "draw_keen.s"
.include "sprites/keen_sprites.inc"
.include "move_keen.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "level1_enemies.s"
.include "level1_items.s"
.include "level1_sfx.s"
.include "longer_sound.s"
.include "random16.s"
.include "tilemap_lookup.s"
level1_data_zx02:
.incbin "maps/level1_map.zx02"
; at $6200\
oracle_message: oracle_message:
.byte $0
.align $100
; at $6300
level1_data_zx02:
.incbin "maps/level1_map.zx02"

View File

@ -1,15 +0,0 @@
; Level 1 (Border Town)
MAX_TILE_X = 116 ; 116 wide
MAX_TILE_Y = 16 ; 16 tall
START_KEEN_TILEX = 1
START_KEEN_TILEY = 13
START_TILEMAP_X = 0
START_TILEMAP_Y = 5
NUM_ENEMIES = 8
HARDTOP_TILES = 32 ; start at 32
ALLHARD_TILES = 40 ; start at 40

View File

@ -45,7 +45,7 @@ enemy_is_out:
load_foot1_smc: load_foot1_smc:
lda small_tilemap,Y lda small_tilemap,Y
cmp #HARDTOP_TILES cmp HARDTOP_TILES
bcs no_enemy_fall ; if hardtop tile, don't fall bcs no_enemy_fall ; if hardtop tile, don't fall
inc enemy_data_tiley,X ; fall one tiles worth inc enemy_data_tiley,X ; fall one tiles worth
@ -144,7 +144,7 @@ enemy_facing_right:
iny ; to the right iny ; to the right
load_right_foot_smc: load_right_foot_smc:
lda small_tilemap,Y lda small_tilemap,Y
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcc no_right_barrier ; skip if no right barrier bcc no_right_barrier ; skip if no right barrier
; hit right barrier ; hit right barrier
@ -202,7 +202,7 @@ enemy_facing_left:
dey ; look to the left dey ; look to the left
load_left_foot_smc: load_left_foot_smc:
lda small_tilemap,Y lda small_tilemap,Y
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcc no_left_barrier ; skip if no right barrier bcc no_left_barrier ; skip if no right barrier
; hit left barrier ; hit left barrier
@ -242,7 +242,7 @@ move_left_noflo:
done_move_enemy: done_move_enemy:
inx inx
cpx #NUM_ENEMIES cpx NUM_ENEMIES
beq totally_done_move_enemies beq totally_done_move_enemies
jmp move_enemies_loop jmp move_enemies_loop
@ -365,7 +365,7 @@ draw_enemy:
done_draw_enemy: done_draw_enemy:
iny iny
cpy #NUM_ENEMIES cpy NUM_ENEMIES
beq exit_draw_enemy beq exit_draw_enemy
jmp draw_enemies_loop jmp draw_enemies_loop

View File

@ -306,7 +306,7 @@ yes_yorp_stomp:
no_yorp_stomp: no_yorp_stomp:
inx inx
cpx #NUM_ENEMIES cpx NUM_ENEMIES
bne check_yorp_loop bne check_yorp_loop
done_check_yorp: done_check_yorp:

280
games/keen/level1_orig.s Normal file
View File

@ -0,0 +1,280 @@
; Keen PoC Level 1 (Border Town)
; by deater (Vince Weaver) <vince@deater.net>
; Zero Page
.include "zp.inc"
.include "hardware.inc"
.include "common_defines.inc"
.include "level1_data.inc"
level1_start:
;===================
; init screen
bit KEYRESET
bit SET_GR
bit PAGE1
bit LORES
bit FULLGR
jsr clear_top ; avoid grey stripes at load
;=====================
; init vars
;=====================
lda #0
sta ANIMATE_FRAME
sta FRAMEL
sta FRAMEH
sta KEEN_WALKING
sta KEEN_JUMPING
sta LEVEL_OVER
sta LASER_OUT
sta KEEN_XL
sta KEEN_FALLING
sta KEEN_SHOOTING
sta KEYCARDS
; debug
; lda #9
; sta RAYGUNS
lda #4
sta DRAW_PAGE
; set starting location
lda #START_KEEN_TILEX
sta KEEN_TILEX
lda #START_KEEN_TILEY
sta KEEN_TILEY
lda #0 ; offset from tile location
sta KEEN_X
sta KEEN_Y
lda #RIGHT ; direction
sta KEEN_DIRECTION
;====================================
; load level1 tilemap
;====================================
lda #<level1_data_zx02
sta ZX0_src
lda #>level1_data_zx02
sta ZX0_src+1
lda #$90 ; load to page $9000
jsr full_decomp
;====================================
; copy in tilemap subset
;====================================
; we copy in full screen, 40x48 = 20x12 tiles
; we start out assuming position is 0,5
lda #START_TILEMAP_X
sta TILEMAP_X
lda #START_TILEMAP_Y
sta TILEMAP_Y
jsr copy_tilemap_subset
;====================================
;====================================
; Main loop
;====================================
;====================================
keen_loop:
; draw tilemap
jsr draw_tilemap
; draw enemies
jsr draw_enemies
; draw laser
jsr draw_laser
; draw keen
jsr draw_keen
jsr page_flip
jsr handle_keypress
jsr move_keen
jsr move_enemies
jsr move_laser
;========================
; increment frame count
;========================
inc FRAMEL
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
;===========================
; check end of level
;===========================
lda LEVEL_OVER
bne done_with_keen
;===========================
; delay
;===========================
; lda #200
; jsr WAIT
jmp keen_loop
done_with_keen:
bit KEYRESET ; clear keypress
; three reasons we could get here
; NEXT_LEVEL = finished level by exiting door
; GAME_OVER = hit ESC and said Y to QUIT
; TOUCHED_ENEMY = touched an enemy
lda LEVEL_OVER
cmp #NEXT_LEVEL
beq level1_levelover
cmp #GAME_OVER
beq level1_gameover
; got here, touched enemy
;============================
; end animation
;============================
lda #1
sta PLAY_END_SOUND
inc KEEN_TILEY ; move down
sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS
level_end_animation:
jsr draw_tilemap
ldx #<keen_sprite_squish
lda #>keen_sprite_squish
stx INL
sta INH
jsr put_sprite_crop
jsr page_flip
lda PLAY_END_SOUND
beq skip_end_sound
ldy #SFX_KEENDIESND
jsr play_sfx
dec PLAY_END_SOUND
skip_end_sound:
lda #50
jsr WAIT
dec YPOS
dec YPOS
bpl level_end_animation
dec KEENS
bpl level1_levelover
level1_gameover:
; mars plays the sound
lda #GAME_OVER
sta LEVEL_OVER
level1_levelover:
lda #LOAD_MARS
sta WHICH_LOAD
rts ; exit back
;==========================
; includes
;==========================
.include "text_print.s"
.include "gr_offsets.s"
.include "gr_fast_clear.s"
.include "gr_pageflip.s"
.include "gr_putsprite_crop.s"
.include "zx02_optim.s"
.include "status_bar.s"
.include "keyboard.s"
.include "joystick.s"
.include "text_drawbox.s"
.include "text_help.s"
.include "text_quit_yn.s"
.include "draw_keen.s"
.include "sprites/keen_sprites.inc"
.include "move_keen.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "level1_enemies.s"
.include "level1_items.s"
.include "level1_sfx.s"
.include "longer_sound.s"
.include "random16.s"
.include "tilemap_lookup.s"
level1_data_zx02:
.incbin "maps/level1_map.zx02"
oracle_message:

View File

@ -1,287 +1,40 @@
; Keen PoC Level 2 (First Shrine) ; Level 2 (First Shrine)
; by deater (Vince Weaver) <vince@deater.net> ; at $6000
; Zero Page level2_data:
.include "zp.inc" .byte 20 ;MAX_TILE_X = 116 ; 116 wide
.include "hardware.inc" .byte 26 ;MAX_TILE_Y = 16 ; 16 tall
.include "common_defines.inc"
.include "level2_data.inc" .byte 1 ;START_KEEN_TILEX = 1
.byte 13 ;START_KEEN_TILEY = 13
.byte 0 ;START_TILEMAP_X = 0
.byte 5 ;START_TILEMAP_Y = 5
level2_start: .byte 0 ;NUM_ENEMIES = 8
;===================
; init screen
bit KEYRESET .byte 32 ;HARDTOP_TILES = 32 ; start at 32
.byte 40 ;ALLHARD_TILES = 40 ; start at 40
bit SET_GR
bit PAGE1
bit LORES
bit FULLGR
jsr clear_top ; avoid grey stripes at load .align $100
;===================== ; at $6100
; init vars enemy_data:
;===================== .byte $0
lda #0
sta ANIMATE_FRAME
sta FRAMEL
sta FRAMEH
sta KEEN_WALKING
sta KEEN_JUMPING
sta LEVEL_OVER
sta LASER_OUT
sta KEEN_XL
sta KEEN_FALLING
sta KEEN_SHOOTING
sta KEYCARDS
sta ORACLE_SPOKEN
; debug
; lda #9
; sta RAYGUNS
lda #4
sta DRAW_PAGE
; set starting location
lda #START_KEEN_TILEX
sta KEEN_TILEX
lda #START_KEEN_TILEY
sta KEEN_TILEY
lda #0 ; offset from tile location
sta KEEN_X
sta KEEN_Y
lda #RIGHT ; direction
sta KEEN_DIRECTION
;====================================
; load level1 tilemap
;====================================
lda #<level1_data_zx02
sta ZX0_src
lda #>level1_data_zx02
sta ZX0_src+1
lda #$90 ; load to page $9000
jsr full_decomp
;====================================
; copy in tilemap subset
;====================================
; we copy in full screen, 40x48 = 20x12 tiles
; we start out assuming position is 0,5
lda #START_TILEMAP_X
sta TILEMAP_X
lda #START_TILEMAP_Y
sta TILEMAP_Y
jsr copy_tilemap_subset
;====================================
;====================================
; Main loop
;====================================
;====================================
keen_loop:
; draw tilemap
jsr draw_tilemap
; draw enemies
jsr draw_enemies
; draw laser
jsr draw_laser
; draw keen
jsr draw_keen
jsr page_flip
jsr handle_keypress
jsr move_keen
jsr move_enemies
jsr move_laser
;========================
; increment frame count
;========================
inc FRAMEL
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
;===========================
; check end of level
;===========================
lda LEVEL_OVER
bne done_with_keen
;===========================
; delay
;===========================
; lda #200
; jsr WAIT
jmp keen_loop
done_with_keen:
bit KEYRESET ; clear keypress
; three reasons we could get here
; NEXT_LEVEL = finished level by exiting door
; GAME_OVER = hit ESC and said Y to QUIT
; TOUCHED_ENEMY = touched an enemy
lda LEVEL_OVER
cmp #NEXT_LEVEL
beq level1_levelover
cmp #GAME_OVER
beq level1_gameover
; got here, touched enemy
;============================
; end animation
;============================
lda #1
sta PLAY_END_SOUND
inc KEEN_TILEY ; move down
sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS
level_end_animation:
jsr draw_tilemap
ldx #<keen_sprite_squish
lda #>keen_sprite_squish
stx INL
sta INH
jsr put_sprite_crop
jsr page_flip
lda PLAY_END_SOUND
beq skip_end_sound
ldy #SFX_KEENDIESND
jsr play_sfx
dec PLAY_END_SOUND
skip_end_sound:
lda #50
jsr WAIT
dec YPOS
dec YPOS
bpl level_end_animation
dec KEENS
bpl level1_levelover
level1_gameover:
; mars plays the sound
lda #GAME_OVER
sta LEVEL_OVER
level1_levelover:
lda #LOAD_MARS
sta WHICH_LOAD
rts ; exit back
;==========================
; includes
;==========================
.include "text_print.s"
.include "gr_offsets.s"
.include "gr_fast_clear.s"
.include "gr_pageflip.s"
.include "gr_putsprite_crop.s"
.include "zx02_optim.s"
.include "status_bar.s"
.include "keyboard.s"
.include "joystick.s"
.include "text_drawbox.s"
.include "text_help.s"
.include "text_quit_yn.s"
.include "draw_keen.s"
.include "sprites/keen_sprites.inc"
.include "move_keen.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "level1_enemies.s"
.include "level1_items.s"
.include "level1_sfx.s"
.include "longer_sound.s"
.include "random16.s"
.include "tilemap_lookup.s"
level1_data_zx02:
.incbin "maps/level2_map.zx02"
.align $100
; at $6200
oracle_message: oracle_message:
; 012345678901234567890123456789012345678 ; 012345678901234567890123456789012345678
.byte 2,21,"YOU HEAR IN YOUR MIND:",0 .byte 2,21,"YOU HEAR IN YOUR MIND:",0
.byte 2,22,"IT IS TOO BAD THAT YOU CANNOT READ",0 .byte 2,22,"IT IS TOO BAD THAT YOU CANNOT READ",0
.byte 2,23,"THE STANDARD GALACTIC ALPHABET, HUMAN",0 .byte 2,23,"THE STANDARD GALACTIC ALPHABET, HUMAN",0
.align $100
; at $6300
level2_data_zx02:
.incbin "maps/level2_map.zx02"

287
games/keen/level2_orig.s Normal file
View File

@ -0,0 +1,287 @@
; Keen PoC Level 2 (First Shrine)
; by deater (Vince Weaver) <vince@deater.net>
; Zero Page
.include "zp.inc"
.include "hardware.inc"
.include "common_defines.inc"
.include "level2_data.inc"
level2_start:
;===================
; init screen
bit KEYRESET
bit SET_GR
bit PAGE1
bit LORES
bit FULLGR
jsr clear_top ; avoid grey stripes at load
;=====================
; init vars
;=====================
lda #0
sta ANIMATE_FRAME
sta FRAMEL
sta FRAMEH
sta KEEN_WALKING
sta KEEN_JUMPING
sta LEVEL_OVER
sta LASER_OUT
sta KEEN_XL
sta KEEN_FALLING
sta KEEN_SHOOTING
sta KEYCARDS
sta ORACLE_SPOKEN
; debug
; lda #9
; sta RAYGUNS
lda #4
sta DRAW_PAGE
; set starting location
lda #START_KEEN_TILEX
sta KEEN_TILEX
lda #START_KEEN_TILEY
sta KEEN_TILEY
lda #0 ; offset from tile location
sta KEEN_X
sta KEEN_Y
lda #RIGHT ; direction
sta KEEN_DIRECTION
;====================================
; load level1 tilemap
;====================================
lda #<level1_data_zx02
sta ZX0_src
lda #>level1_data_zx02
sta ZX0_src+1
lda #$90 ; load to page $9000
jsr full_decomp
;====================================
; copy in tilemap subset
;====================================
; we copy in full screen, 40x48 = 20x12 tiles
; we start out assuming position is 0,5
lda #START_TILEMAP_X
sta TILEMAP_X
lda #START_TILEMAP_Y
sta TILEMAP_Y
jsr copy_tilemap_subset
;====================================
;====================================
; Main loop
;====================================
;====================================
keen_loop:
; draw tilemap
jsr draw_tilemap
; draw enemies
jsr draw_enemies
; draw laser
jsr draw_laser
; draw keen
jsr draw_keen
jsr page_flip
jsr handle_keypress
jsr move_keen
jsr move_enemies
jsr move_laser
;========================
; increment frame count
;========================
inc FRAMEL
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
;===========================
; check end of level
;===========================
lda LEVEL_OVER
bne done_with_keen
;===========================
; delay
;===========================
; lda #200
; jsr WAIT
jmp keen_loop
done_with_keen:
bit KEYRESET ; clear keypress
; three reasons we could get here
; NEXT_LEVEL = finished level by exiting door
; GAME_OVER = hit ESC and said Y to QUIT
; TOUCHED_ENEMY = touched an enemy
lda LEVEL_OVER
cmp #NEXT_LEVEL
beq level1_levelover
cmp #GAME_OVER
beq level1_gameover
; got here, touched enemy
;============================
; end animation
;============================
lda #1
sta PLAY_END_SOUND
inc KEEN_TILEY ; move down
sec
lda KEEN_TILEX
sbc TILEMAP_X
asl
clc
adc KEEN_X
sta XPOS
sec
lda KEEN_TILEY
sbc TILEMAP_Y
asl
asl
clc
adc KEEN_Y
sta YPOS
level_end_animation:
jsr draw_tilemap
ldx #<keen_sprite_squish
lda #>keen_sprite_squish
stx INL
sta INH
jsr put_sprite_crop
jsr page_flip
lda PLAY_END_SOUND
beq skip_end_sound
ldy #SFX_KEENDIESND
jsr play_sfx
dec PLAY_END_SOUND
skip_end_sound:
lda #50
jsr WAIT
dec YPOS
dec YPOS
bpl level_end_animation
dec KEENS
bpl level1_levelover
level1_gameover:
; mars plays the sound
lda #GAME_OVER
sta LEVEL_OVER
level1_levelover:
lda #LOAD_MARS
sta WHICH_LOAD
rts ; exit back
;==========================
; includes
;==========================
.include "text_print.s"
.include "gr_offsets.s"
.include "gr_fast_clear.s"
.include "gr_pageflip.s"
.include "gr_putsprite_crop.s"
.include "zx02_optim.s"
.include "status_bar.s"
.include "keyboard.s"
.include "joystick.s"
.include "text_drawbox.s"
.include "text_help.s"
.include "text_quit_yn.s"
.include "draw_keen.s"
.include "sprites/keen_sprites.inc"
.include "move_keen.s"
.include "handle_laser.s"
.include "draw_tilemap.s"
.include "level1_enemies.s"
.include "level1_items.s"
.include "level1_sfx.s"
.include "longer_sound.s"
.include "random16.s"
.include "tilemap_lookup.s"
level1_data_zx02:
.incbin "maps/level2_map.zx02"
oracle_message:
; 012345678901234567890123456789012345678
.byte 2,21,"YOU HEAR IN YOUR MIND:",0
.byte 2,22,"IT IS TOO BAD THAT YOU CANNOT READ",0
.byte 2,23,"THE STANDARD GALACTIC ALPHABET, HUMAN",0

37
games/keen/level3.s Normal file
View File

@ -0,0 +1,37 @@
; Level 3 (Treasury)
; at $6000
level3_data:
.byte 116 ;MAX_TILE_X = 116 ; 116 wide
.byte 16 ;MAX_TILE_Y = 16 ; 16 tall
.byte 1 ;START_KEEN_TILEX = 1
.byte 13 ;START_KEEN_TILEY = 13
.byte 0 ;START_TILEMAP_X = 0
.byte 5 ;START_TILEMAP_Y = 5
.byte 8 ;NUM_ENEMIES = 8
.byte 32 ;HARDTOP_TILES = 32 ; start at 32
.byte 40 ;ALLHARD_TILES = 40 ; start at 40
.align $100
; at $6100
enemy_data:
.byte $0
.align $100
; at $6200
oracle_message:
.byte $0
.align $100
; at $6300
level1_data_zx02:
.incbin "maps/level3_map.zx02"

View File

@ -93,14 +93,30 @@ print_model_done:
which_load_loop: which_load_loop:
; update the which-file error message ; update the which-file error message
; lda WHICH_LOAD ; lda WHICH_LOAD
; tay ; tay
; lda which_disk,Y ; lda which_disk,Y
; sta error_string+19 ; sta error_string+19
; 0 = TITLE
; 1 = MARS
; LEVEL = WHICH_LOAD-3
lda WHICH_LOAD
cmp #2
bcc skip_engine_load
engine_load:
lda #<engine_filename
sta OUTL
lda #>engine_filename
sta OUTH
jsr opendir_filename
skip_engine_load:
lda WHICH_LOAD lda WHICH_LOAD
asl asl
@ -110,21 +126,21 @@ which_load_loop:
lda filenames+1,Y lda filenames+1,Y
sta OUTH sta OUTH
lda WHICH_LOAD ; lda WHICH_LOAD
bne load_other ; bne load_other
load_intro: load_intro:
lda #<$4000 lda #<$4000
sta entry_smc+1 sta entry_smc+1
lda #>$4000 lda #>$4000
sta entry_smc+2 sta entry_smc+2
jmp actual_load ; jmp actual_load
load_other: ;load_other:
lda #<$2000 ; lda #<$2000
sta entry_smc+1 ; sta entry_smc+1
lda #>$2000 ; lda #>$2000
sta entry_smc+2 ; sta entry_smc+2
actual_load: actual_load:
@ -185,6 +201,8 @@ filenames:
.word keen1_filename .word keen1_filename
.word keen2_filename .word keen2_filename
engine_filename:
.byte "ENGINE",0
title_filename: title_filename:
.byte "TITLE",0 .byte "TITLE",0
mars_filename: mars_filename:
@ -193,6 +211,8 @@ keen1_filename:
.byte "LEVEL1",0 .byte "LEVEL1",0
keen2_filename: keen2_filename:
.byte "LEVEL2",0 .byte "LEVEL2",0
keen3_filename:
.byte "LEVEL3",0
;=================================================== ;===================================================

View File

@ -7,6 +7,7 @@ PNG2GR = ../../../utils/gr-utils/png2gr
all: png2map \ all: png2map \
level1_map.zx02 level2_map.zx02 \ level1_map.zx02 level2_map.zx02 \
level3_map.zx02 \
mars_map.zx02 mars_map.zx02
### ###
@ -25,6 +26,14 @@ level2_map.zx02: level2_map.inc
level2_map.inc: level2_map.png png2map level2_map.inc: level2_map.png png2map
./png2map level2_map.png level2_map.inc ./png2map level2_map.png level2_map.inc
###
level3_map.zx02: level3_map.inc
$(ZX02) level3_map.inc level3_map.zx02
level3_map.inc: level3_map.png png2map
./png2map level3_map.png level3_map.inc
### ###

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -9,7 +9,7 @@
; or are there? ; or are there?
NUM_ENEMIES = 0 ;NUM_ENEMIES = 0
TILE_COLS = 20 ; define this elsewhere? TILE_COLS = 20 ; define this elsewhere?
mars_start: mars_start:
@ -616,7 +616,7 @@ location_size:
location_actions_low: location_actions_low:
.byte <(enter_level-1),<(enter_level-1) ; level1, level2 .byte <(enter_level-1),<(enter_level-1) ; level1, level2
.byte <(dummy_action-1),<(dummy_action-1) .byte <(enter_level-1),<(dummy_action-1) ; level3, level4
.byte <(dummy_action-1),<(dummy_action-1) .byte <(dummy_action-1),<(dummy_action-1)
.byte <(dummy_action-1),<(dummy_action-1) .byte <(dummy_action-1),<(dummy_action-1)
.byte <(dummy_action-1),<(dummy_action-1) .byte <(dummy_action-1),<(dummy_action-1)
@ -628,7 +628,7 @@ location_actions_low:
location_actions_high: location_actions_high:
.byte >(enter_level-1),>(enter_level-1) ; level1, level2 .byte >(enter_level-1),>(enter_level-1) ; level1, level2
.byte >(dummy_action-1),>(dummy_action-1) .byte >(enter_level-1),>(dummy_action-1) ; level3, level4
.byte >(dummy_action-1),>(dummy_action-1) .byte >(dummy_action-1),>(dummy_action-1)
.byte >(dummy_action-1),>(dummy_action-1) .byte >(dummy_action-1),>(dummy_action-1)
.byte >(dummy_action-1),>(dummy_action-1) .byte >(dummy_action-1),>(dummy_action-1)

View File

@ -1,4 +1,4 @@
MAX_TILE_Y = 57 ; 69-12 MARS_MAX_TILE_Y = 57 ; 69-12
;============================== ;==============================
; Handle Keypress ; Handle Keypress
@ -354,7 +354,7 @@ down_pressed:
bcc move_keen_down bcc move_keen_down
lda TILEMAP_Y lda TILEMAP_Y
cmp #MAX_TILE_Y cmp #MARS_MAX_TILE_Y
bcs move_keen_down bcs move_keen_down
jmp scroll_keen_down jmp scroll_keen_down

View File

@ -41,7 +41,8 @@ move_keen_early_out:
; otherwise, scroll ; otherwise, scroll
move_right: move_right:
lda TILEMAP_X lda TILEMAP_X
cmp #(MAX_TILE_X-20) max_tilex_minus_20_smc:
cmp #$DD
bcs keen_walk_right bcs keen_walk_right
sec sec
@ -199,7 +200,7 @@ collide_head_l:
lda (INL),Y lda (INL),Y
; if tile# < ALLHARD_TILES then we are fine ; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcc collide_left_right ; blt bcc collide_left_right ; blt
; fallthrough to get other ; fallthrough to get other
@ -208,7 +209,7 @@ collide_head_r:
iny iny
lda (INL),Y lda (INL),Y
; if tile# < ALLHARD_TILES then we are fine ; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcc collide_left_right ; blt bcc collide_left_right ; blt
; o/~ I hit my head, I heard the phone ring o/~ ; o/~ I hit my head, I heard the phone ring o/~
@ -255,7 +256,8 @@ collide_left_right:
check_right_collide: check_right_collide:
lda KEEN_TILEY lda KEEN_TILEY
cmp #(MAX_TILE_X-1) ; stop at right edge of screen max_tilex_minus_1_smc:
cmp #$dd ; stop at right edge of screen
beq keen_stop beq keen_stop
@ -272,7 +274,7 @@ right_collide_noextra:
lda (INL),Y lda (INL),Y
; if tile# < ALLHARD_TILES then we are fine ; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcc done_keen_collide ; blt bcc done_keen_collide ; blt
bcs keen_stop bcs keen_stop
@ -291,7 +293,7 @@ check_left_collide:
; lda KEEN_WALK_TILE_L ; lda KEEN_WALK_TILE_L
; if tile# < ALLHARD_TILES then we are fine ; if tile# < ALLHARD_TILES then we are fine
cmp #ALLHARD_TILES cmp ALLHARD_TILES
bcc done_keen_collide ; blt bcc done_keen_collide ; blt
keen_stop: keen_stop:
@ -413,13 +415,13 @@ check_falling:
check_below: check_below:
lda (INL),Y lda (INL),Y
cmp #HARDTOP_TILES cmp HARDTOP_TILES
bcs feet_on_ground ; if hardtop tile, don't fall bcs feet_on_ground ; if hardtop tile, don't fall
check_below_plus1: check_below_plus1:
iny iny
lda (INL),Y lda (INL),Y
cmp #HARDTOP_TILES cmp HARDTOP_TILES
bcs feet_on_ground ; if hardtop tile, don't fall bcs feet_on_ground ; if hardtop tile, don't fall
@ -459,7 +461,8 @@ do_full_falling_check:
; if tilemap_y >= max_tile, keen_fall ; if tilemap_y >= max_tile, keen_fall
lda TILEMAP_Y lda TILEMAP_Y
cmp #(MAX_TILE_Y-6) max_tiley_minus_6_smc:
cmp #$DD
bcs keen_fall ; bge bcs keen_fall ; bge

View File

@ -146,6 +146,16 @@ APPLEII_MODEL = $A6
CURRENT_LEVEL = $A7 CURRENT_LEVEL = $A7
ORACLE_SPOKEN = $A8 ORACLE_SPOKEN = $A8
MAX_TILE_X = $A9
MAX_TILE_Y = $AA
;START_KEEN_TILEX = $AB
;START_KEEN_TILEY = $AC
;START_TILEMAP_X = $AD
;START_TILEMAP_Y = $AE
NUM_ENEMIES = $AF
HARDTOP_TILES = $B0
ALLHARD_TILES = $B1
WHICH_SLOT = $DA WHICH_SLOT = $DA
JS_BUTTON_STATE = $DB JS_BUTTON_STATE = $DB
CURRENT_DISK = $DC CURRENT_DISK = $DC