lemm: release up to 10 lemmings

This commit is contained in:
Vince Weaver 2022-03-21 23:00:30 -04:00
parent 0b8fdb163b
commit 6f6e057b1e
14 changed files with 119 additions and 106 deletions

View File

@ -87,9 +87,9 @@ lemm.o: lemm.s zp.inc hardware.inc qload.inc \
graphics/sprites.inc \
intro_level.s update_time.s hgr_sprite.s draw_flames.s \
draw_door.s move_lemming.s draw_lemming.s \
hgr_hlin.s hgr_vlin.s update_menu.s \
hgr_hlin.s hgr_vlin.s update_menu.s init_level.s \
interrupt_handler.s keyboard.s draw_pointer.s \
pointer_sprites.inc particle_hgr.s \
pointer_sprites.inc particle_hgr.s release_lemming.s \
title.s audio.s letsgo.s load_music.s
ca65 -o lemm.o lemm.s -l lemm.lst
@ -135,6 +135,8 @@ lemm.inc: generate_common LEMM
./generate_common -a 0x6000 -s load_music lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s intro_text_smc_l lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s intro_text_smc_h lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s release_lemming lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s init_level lemm.lst >> lemm.inc
####
@ -209,5 +211,7 @@ graphics/graphics_test.inc:
####
clean:
rm -f *~ *.o *.lst HELLO LEMM LEMM_TEST generate_common
rm -f *~ *.o *.lst HELLO LEMM LEMM_TEST generate_common \
LEVEL1 LEVEL2 LEVEL3 LEVEL4 LEVEL5 \
lemm.inc

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

19
games/lemm/init_level.s Normal file
View File

@ -0,0 +1,19 @@
;====================
; reset level vars
;====================
init_level:
lda #0
sta LEVEL_OVER
sta DOOR_OPEN
sta FRAMEL
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
sta NEXT_LEMMING_TO_RELEASE
jsr clear_lemmings_out
jsr update_lemmings_out ; update display
jsr update_time
rts

View File

@ -254,7 +254,12 @@ oof:
play_level:
;=======================
; load level from disk
;=======================
; skip if already resident
lda WHICH_LEVEL ; see if level is same as current
cmp $9000
beq level_already_resident
@ -263,6 +268,11 @@ play_level:
jsr load_file
level_already_resident:
;==================
; start level
;==================
jsr start_level
lda LEVEL_OVER
@ -331,7 +341,8 @@ level_continue:
.include "load_music.s"
.include "simple_sounds.s"
.include "release_lemming.s"
.include "init_level.s"
; moved to qload.s
; .include "wait.s"

View File

@ -1,3 +1,5 @@
MAX_LEMMINGS = 10
LEMMING_RIGHT = $01
LEMMING_LEFT = $FF

View File

@ -147,24 +147,12 @@ do_level1:
lda #100
sta CURSOR_Y
;=======================
; init vars
;=======================
lda #0
sta LEVEL_OVER
sta DOOR_OPEN
sta FRAMEL
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
jsr update_lemmings_out ; update display
lda #1
lda #10
sta LEMMINGS_TO_RELEASE
jsr clear_lemmings_out
; set up time
@ -173,7 +161,9 @@ do_level1:
lda #$00
sta TIME_SECONDS
sta TIMER_COUNT
sta TIMER_COUNT ; ??
jsr init_level
;=======================
; Play "Let's Go"
@ -213,20 +203,8 @@ l1_door_is_open:
; release lemmings
;======================
lda LEMMINGS_TO_RELEASE
beq l1_done_release_lemmings
lda DOOR_OPEN
beq l1_done_release_lemmings
lda FRAMEL
and #$f
bne l1_done_release_lemmings
jsr release_lemming
l1_done_release_lemmings:
;=====================
; animate flames
;=====================
@ -280,12 +258,6 @@ l1_level_over:
rts
.include "release_lemming.s"
.include "graphics/graphics_level1.inc"

View File

@ -152,18 +152,8 @@ do_level2:
; init vars
;=======================
lda #0
sta LEVEL_OVER
sta DOOR_OPEN
sta FRAMEL
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
jsr update_lemmings_out ; update display
lda #1
sta LEMMINGS_TO_RELEASE
jsr clear_lemmings_out
; set up time
@ -171,9 +161,9 @@ do_level2:
sta TIME_MINUTES
lda #$00
sta TIME_SECONDS
sta TIMER_COUNT ; 1/50
sta TIMER_COUNT
jsr init_level
;=======================
; Play "Let's Go"
@ -282,10 +272,6 @@ l2_level_over:
.include "release_lemming.s"
.include "graphics/graphics_level2.inc"

View File

@ -151,18 +151,8 @@ do_level3:
; init vars
;=======================
lda #0
sta LEVEL_OVER
sta DOOR_OPEN
sta FRAMEL
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
jsr update_lemmings_out ; update display
lda #1
sta LEMMINGS_TO_RELEASE
jsr clear_lemmings_out
; set up time
@ -170,8 +160,9 @@ do_level3:
sta TIME_MINUTES
lda #$00
sta TIME_SECONDS
sta TIMER_COUNT ; 1/50
sta TIMER_COUNT
jsr init_level
;=======================
; Play "Let's Go"
@ -275,8 +266,6 @@ l4_level_over:
rts
.include "release_lemming.s"
.include "graphics/graphics_level3.inc"

View File

@ -152,18 +152,8 @@ do_level4:
; init vars
;=======================
lda #0
sta LEVEL_OVER
sta DOOR_OPEN
sta FRAMEL
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
jsr update_lemmings_out
lda #1
sta LEMMINGS_TO_RELEASE
jsr clear_lemmings_out
; set up time
@ -171,8 +161,9 @@ do_level4:
sta TIME_MINUTES
lda #$00
sta TIME_SECONDS
sta TIMER_COUNT ; 1/50
sta TIMER_COUNT
jsr init_level
;=======================
; Play "Let's Go"
@ -276,9 +267,6 @@ l4_level_over:
rts
.include "release_lemming.s"
.include "graphics/graphics_level4.inc"

View File

@ -134,18 +134,8 @@ do_level5:
; init vars
;=======================
lda #0
sta LEVEL_OVER
sta DOOR_OPEN
sta FRAMEL
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
jsr update_lemmings_out
lda #1
sta LEMMINGS_TO_RELEASE
jsr clear_lemmings_out
; set up time
@ -153,9 +143,9 @@ do_level5:
sta TIME_MINUTES
lda #$00
sta TIME_SECONDS
sta TIMER_COUNT ; 1/50
sta TIMER_COUNT
jsr init_level
;=======================
; Play "Let's Go"
@ -260,8 +250,6 @@ l5_level_over:
rts
.include "release_lemming.s"
.include "graphics/graphics_level5.inc"

View File

@ -1,4 +1,6 @@
; TODO: auto-size this based on MAX_LEMMINGS
lemming_x:
.byte 0,0,0,0,0,0,0,0,0,0
lemming_y:

View File

@ -1,6 +1,4 @@
;=======================
; Clear Lemmings Out
;=======================
@ -11,16 +9,31 @@ clear_lemmings_out:
clear_lemmings_loop:
sta lemming_out,Y
iny
cpy LEMMINGS_TO_RELEASE
cpy #MAX_LEMMINGS
bne clear_lemmings_loop
rts
;=======================
; Init Lemmings
; Release Lemmings
;=======================
; TODO: adjust speed based on release speed
release_lemming:
ldy #0
; don't release if we've released them all
lda LEMMINGS_TO_RELEASE
beq done_release_lemmings
; don't release if door is still opening
lda DOOR_OPEN
beq done_release_lemmings
; only release every X frames
lda FRAMEL
and #$f
bne done_release_lemmings
ldy NEXT_LEMMING_TO_RELEASE
lda #1
sta lemming_out,Y
@ -35,11 +48,20 @@ release_lemming:
lda #LEMMING_FALLING
sta lemming_status,Y
inc LEMMINGS_OUT
sed
lda LEMMINGS_OUT ; BCD
clc
adc #1
sta LEMMINGS_OUT
cld
jsr update_lemmings_out
inc NEXT_LEMMING_TO_RELEASE
dec LEMMINGS_TO_RELEASE
done_release_lemmings:
rts

View File

@ -111,21 +111,50 @@ draw_time:
rts
;===========================
;===========================
; update lemmings out number
;===========================
;===========================
; TODO: combine with time drawing code?
update_lemmings_out:
; draw minute
ldy LEMMINGS_OUT
; draw tens
lda LEMMINGS_OUT
lsr
lsr
lsr
lsr
beq lemmings_out_ones
lemmings_out_tens:
tay
lda bignums_l,Y
sta INL
lda bignums_h,Y
sta INH
ldx #15 ; 105
stx XPOS
lda #152
sta YPOS
jsr hgr_draw_sprite_autoshift
lemmings_out_ones:
lda LEMMINGS_OUT
and #$f
tay
lda bignums_l,Y
sta INL
lda bignums_h,Y
sta INH
; 246, 152
ldx #15 ; 105
ldx #16 ; 112
stx XPOS
lda #152
sta YPOS

View File

@ -66,12 +66,13 @@ LOAD_NEXT_CHUNK = $7F
OVER_LEMMING = $80
TIMER_COUNT = $81
UPDATE_POINTER = $82
LEMMINGS_TO_RELEASE = $83
NEXT_LEMMING_TO_RELEASE = $83
SAVED_Y1 = $84
SAVED_Y2 = $85
LEMMINGS_OUT = $86
BUTTON_LOCATION = $87
WHICH_LEVEL = $88
LEMMINGS_TO_RELEASE = $89
APPLEII_MODEL = $8B