lemm: centralize printing outtro info

also try to pick proper outtro from stats
This commit is contained in:
Vince Weaver 2022-03-22 17:13:38 -04:00
parent b918d7a14e
commit 671182cf46
11 changed files with 295 additions and 65 deletions

View File

@ -120,7 +120,7 @@ lemm.inc: generate_common LEMM
./generate_common -a 0x6000 -s erase_pointer lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s handle_keypress lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s disable_music lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s outro_level1 lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s outro_level lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s update_lemmings_out lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s level_preview_h_smc lemm.lst >> lemm.inc
./generate_common -a 0x6000 -s level_preview_l_smc lemm.lst >> lemm.inc

View File

@ -9,6 +9,8 @@ init_level:
sta LOAD_NEXT_CHUNK
sta LEMMINGS_OUT
sta NEXT_LEMMING_TO_RELEASE
sta PERCENT_RESCUED_L
sta PERCENT_RESCUED_H
jsr clear_lemmings_out

View File

@ -60,11 +60,13 @@ intro_not_iie:
rts
;========================
;========================
; print the outro message
;========================
;========================
outro_level1:
outro_level:
; clear text screen
@ -78,34 +80,189 @@ outro_level1:
jsr set_normal
; assume lose at first, may change later
lda #LEVEL_FAIL
sta LEVEL_OVER
lda LEVEL_OVER
cmp #LEVEL_WIN
bne print_l1_lose_message
;======================================
; update percentages in message
;======================================
; print messages
;=================
; needed
lda #<level1_win_text
ldx #' ' ; default is blank
lda PERCENT_NEEDED
bne upm_not_100 ; zero specical case means 100%
ldx #'1'
upm_not_100:
stx needed_smc+14
; needed tens
lsr
lsr
lsr
lsr
clc
adc #'0'
sta needed_smc+15
; needed ones
lda PERCENT_NEEDED
and #$f
clc
adc #'0'
sta needed_smc+16
;=================
; rescued
ldx #' ' ; default is blank
lda PERCENT_RESCUED_H
beq upr_not_100 ;
ldx #'1'
upr_not_100:
stx rescued_smc+14
cmp #1 ; if 100% then print 0
beq always_tens
; rescued tens
lda #' '
ldx PERCENT_RESCUED_L
cpx #$10
bcc upr_out_tens
always_tens:
txa
lsr
lsr
lsr
lsr
clc
adc #'0'
upr_out_tens:
sta rescued_smc+15
; needed ones
lda PERCENT_RESCUED_L
and #$f
clc
adc #'0'
sta rescued_smc+16
;======================
; print common message
lda #<level_common_text
sta OUTL
lda #>level1_win_text
jmp print_l1_common
print_l1_lose_message:
lda #<level1_lose_text
sta OUTL
lda #>level1_lose_text
print_l1_common:
lda #>level_common_text
sta OUTH
jsr move_and_print_list
; print the text
ldx #9
l1_outro_loop:
;======================
; figure out message
;======================
jsr move_and_print
ldx #0 ; first message
lda PERCENT_RESCUED_H
bne print_the_message ; 100%, was a win
blip:
inx ; (1) NEEDED+20% < T < 100%
lda PERCENT_NEEDED
clc
adc #$20 ; FIXME: only if < 80%
cmp PERCENT_RESCUED_L
bcs print_the_message
inx ; (2) NEEDED < T < NEEDED+20%
lda PERCENT_RESCUED_L
cmp PERCENT_NEEDED
bcc print_the_message
inx ; (3) NEEDED == T
cmp PERCENT_NEEDED
beq print_the_message
inx ; (4) T = NEEDED - 1
lda PERCENT_RESCUED_L
sec
sbc #1
cmp PERCENT_NEEDED
beq print_the_message
inx ; (5) NEEDED-5 < T < NEEDED - 1
lda PERCENT_RESCUED_L
sec
sbc #5
cmp PERCENT_NEEDED
bcs print_the_message
inx ; (6) NEEDED/2 < T < NEEDED-5
lda PERCENT_RESCUED_L
lsr
cmp PERCENT_NEEDED
bcs print_the_message
inx ; (7) T < NEEDED/2
print_the_message:
lda level_end_messages_l,X
sta OUTL
lda level_end_messages_h,X
sta OUTH
jsr move_and_print_list
cpx #4
bcc was_a_win
was_a_loss:
jmp done_print_message
;=================================
; print win message if applicable
;=================================
was_a_win:
lda #LEVEL_WIN
sta LEVEL_OVER
; update level in message
ldx WHICH_LEVEL
inx
txa
clc
adc #'0'
sta level_win_text+29
lda #<level_win_text
sta OUTL
lda #>level_win_text
sta OUTH
jsr move_and_print_list
done_print_message:
dex
bne l1_outro_loop
bit KEYRESET
@ -113,28 +270,80 @@ l1_outro_loop:
jmp wait_until_keypress
level1_win_text:
level_common_text:
.byte 6, 1,"ALL LEMMINGS ACCOUNTED FOR.",0
.byte 12, 3,"YOU RESCUED 100%",0
.byte 12, 4,"YOU NEEDED 10%",0
rescued_smc:
.byte 12, 3,"YOU RESCUED %",0
needed_smc:
.byte 12, 4,"YOU NEEDED %",0
.byte 6,20,"PRESS RETURN FOR NEXT LEVEL",0
.byte 9,21,"PRESS ESCAPE FOR MENU",0
.byte $FF
level_win_text:
.byte 6,15,"YOUR ACCESS CODE FOR LEVEL X",0
.byte 14,16,"IS B002ATARI",0
.byte $FF
; T = 100%
level_message0_text:
.byte 2, 6,"SUPERB! YOU RESCUED EVERY LEMMING ON",0
.byte 3, 7,"THAT LEVEL. CAN YOU DO IT AGAIN...",0
.byte 6,15,"YOUR ACCESS CODE FOR LEVEL 2",0
.byte 14,16,"IS B002ATARI",0
.byte 6,20,"PRESS RETURN FOR NEXT LEVEL",0
.byte 9,21,"PRESS ESCAPE FOR MENU",0
.byte $FF
level1_lose_text:
.byte 6, 1,"ALL LEMMINGS ACCOUNTED FOR.",0
.byte 12, 3,"YOU RESCUED 0%",0
.byte 12, 4,"YOU NEEDED 100%",0
; NEEDED+20% < T < 100%
level_message1_text:
.byte 2, 6,"YOU TOTALLY STORMED THAT LEVEL!",0
.byte 3, 7,"LET'S SEE IF YOU CAN STORM THE NEXT...",0
.byte $FF
; NEEDED < T < NEEDED+20%
level_message2_text:
.byte 2, 6,"THAT LEVEL SEEMED NO PROBLEM TO YOU ON",0
.byte 3, 7,"THAT ATTEMPT. ONTO THE NEXT...",0
.byte $FF
; NEEDED == T
level_message3_text:
.byte 2, 6,"RIGHT ON. YOU CAN'T GET MUCH CLOSER THAN",0
.byte 3, 7,"THAT. LET'S TRY THE NEXT...",0
.byte $FF
; T = NEEDED - 1
level_message4_text:
.byte 2, 6,"OH NO, SO NEAR AND YET SO FAR.",0
.byte 3, 7,"MAYBE THIS TIME...",0
.byte $FF
; NEEDED-5 < T < NEEDED - 1
level_message5_text:
.byte 2, 6,"YOU GOT PRETTY CLOSE THAT TIME.",0
.byte 3, 7,"NOW TRY AGAIN FOR THAT FEW % EXTRA.",0
.byte $FF
; NEEDED/2 < T < NEEDED-5
level_message6_text:
.byte 2, 6,"BETTER RETHINK YOUR STRATEGY BEFORE",0
.byte 3, 7,"YOU TRY THIS LEVEL AGAIN!.",0
.byte $FF
; T < NEEDED/2
level_message7_text:
.byte 3, 6,"ROCK BOTTOM! I HOPE FOR YOUR SAKE",0
.byte 8, 7,"THAT YOU NUKED THAT LEVEL.",0
.byte 6,20,"PRESS RETURN FOR NEXT LEVEL",0
.byte 9,21,"PRESS ESCAPE FOR MENU",0
.byte 10,10," ",0 ; lazy hack
.byte 10,10," ",0
.byte $FF
level_end_messages_l:
.byte <level_message0_text,<level_message1_text,<level_message2_text
.byte <level_message3_text,<level_message4_text,<level_message5_text
.byte <level_message6_text,<level_message7_text
level_end_messages_h:
.byte >level_message0_text,>level_message1_text,>level_message2_text
.byte >level_message3_text,>level_message4_text,>level_message5_text
.byte >level_message6_text,>level_message7_text
.align $100

View File

@ -270,11 +270,23 @@ play_level:
level_already_resident:
;==================
; start level
; play level
;==================
jsr start_level
;==================
; level over
;==================
; disable music
jsr disable_music
; print end message
jsr outro_level
lda LEVEL_OVER
cmp #LEVEL_WIN
beq level_won

View File

@ -46,6 +46,9 @@ do_level1:
lda #127
sta exit_y2_smc+1
lda #$10 ; BCD
sta PERCENT_NEEDED
;==============
; set up intro
@ -249,12 +252,6 @@ l1_timer_not_yet:
l1_level_over:
; bit SET_TEXT
jsr disable_music
jsr outro_level1
rts

View File

@ -46,6 +46,8 @@ do_level2:
lda #144
sta exit_y2_smc+1
lda #$10 ; BCD
sta PERCENT_NEEDED
;==============
; set up intro
@ -249,10 +251,6 @@ l2_timer_not_yet:
l2_level_over:
jsr disable_music
jsr outro_level1
rts

View File

@ -45,6 +45,8 @@ do_level3:
lda #144
sta exit_y2_smc+1
lda #$10 ; BCD
sta PERCENT_NEEDED
;==============
; set up intro
@ -176,7 +178,7 @@ do_level3:
; Main Loop
;===================
;===================
l4_main_loop:
l3_main_loop:
;=========================
; load next chunk of music
@ -191,11 +193,11 @@ l4_main_loop:
;=========================
lda DOOR_OPEN
bne l4_door_is_open
bne l3_door_is_open
jsr draw_door
l4_door_is_open:
l3_door_is_open:
;======================
; release lemmings
@ -211,13 +213,13 @@ l4_door_is_open:
lda TIMER_COUNT
cmp #$50
bcc l4_timer_not_yet
bcc l3_timer_not_yet
jsr update_time
lda #$0
sta TIMER_COUNT
l4_timer_not_yet:
l3_timer_not_yet:
; main drawing loop
@ -240,16 +242,12 @@ l4_timer_not_yet:
inc FRAMEL
lda LEVEL_OVER
bne l4_level_over
bne l3_level_over
jmp l4_main_loop
jmp l3_main_loop
l4_level_over:
jsr disable_music
jsr outro_level1
l3_level_over:
rts

View File

@ -60,6 +60,8 @@ do_level4:
lda #>level4_intro_text
sta intro_text_smc_h+1
lda #$00 ; BCD
sta PERCENT_NEEDED ; means 100%
;==============
; set up music
@ -248,10 +250,6 @@ l4_timer_not_yet:
l4_level_over:
jsr disable_music
jsr outro_level1
rts

View File

@ -29,6 +29,8 @@ do_level5:
; n/a
lda #$10 ; BCD
sta PERCENT_NEEDED
;==============
; set up intro
@ -233,7 +235,7 @@ l5_level_over:
jsr disable_music
jsr outro_level1
jsr outro_level
rts

View File

@ -80,3 +80,14 @@ set_inverse:
rts
;================================
; move and print a list of lines
;================================
; look for negative X meaning done
move_and_print_list:
jsr move_and_print
ldy #0
lda (OUTL),Y
bpl move_and_print_list
rts

View File

@ -75,6 +75,9 @@ WHICH_LEVEL = $88
LEMMINGS_TO_RELEASE = $89
CURRENT_LEMMING = $8A
APPLEII_MODEL = $8B
PERCENT_RESCUED_L = $8C
PERCENT_RESCUED_H = $8D
PERCENT_NEEDED = $8E
DOOR_X = $90 ; location of door
DOOR_Y = $91