diff --git a/games/lemm/Makefile b/games/lemm/Makefile index 108ff264..039bac0c 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -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 diff --git a/games/lemm/init_level.s b/games/lemm/init_level.s index eeedffc6..7b3a4ea3 100644 --- a/games/lemm/init_level.s +++ b/games/lemm/init_level.s @@ -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 diff --git a/games/lemm/intro_level.s b/games/lemm/intro_level.s index cc3d2f27..3829844d 100644 --- a/games/lemm/intro_level.s +++ b/games/lemm/intro_level.s @@ -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 - jmp print_l1_common -print_l1_lose_message: - 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 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 + .align $100 diff --git a/games/lemm/lemm.s b/games/lemm/lemm.s index be413e5e..cea4d78a 100644 --- a/games/lemm/lemm.s +++ b/games/lemm/lemm.s @@ -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 diff --git a/games/lemm/level1.s b/games/lemm/level1.s index fb51eb17..eb1c2683 100644 --- a/games/lemm/level1.s +++ b/games/lemm/level1.s @@ -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 diff --git a/games/lemm/level2.s b/games/lemm/level2.s index ce31cbc9..1d3c2e57 100644 --- a/games/lemm/level2.s +++ b/games/lemm/level2.s @@ -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 diff --git a/games/lemm/level3.s b/games/lemm/level3.s index c1854be0..56aafd4a 100644 --- a/games/lemm/level3.s +++ b/games/lemm/level3.s @@ -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 diff --git a/games/lemm/level4.s b/games/lemm/level4.s index 1a885e7e..7915305f 100644 --- a/games/lemm/level4.s +++ b/games/lemm/level4.s @@ -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 diff --git a/games/lemm/level5.s b/games/lemm/level5.s index 344b559d..9353e5e7 100644 --- a/games/lemm/level5.s +++ b/games/lemm/level5.s @@ -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 diff --git a/games/lemm/text_print.s b/games/lemm/text_print.s index 199893be..34bae3db 100644 --- a/games/lemm/text_print.s +++ b/games/lemm/text_print.s @@ -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 diff --git a/games/lemm/zp.inc b/games/lemm/zp.inc index 85a8c49c..ceb5d008 100644 --- a/games/lemm/zp.inc +++ b/games/lemm/zp.inc @@ -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