diff --git a/games/lemm/Makefile b/games/lemm/Makefile index 98a46ffa..a432a178 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -44,7 +44,7 @@ lemm.o: lemm.s zp.inc hardware.inc \ hgr_hlin.s hgr_vlin.s update_menu.s \ interrupt_handler.s keyboard.s draw_pointer.s \ pointer_sprites.inc \ - level1.s + level1.s level5.s ca65 -o lemm.o lemm.s -l lemm.lst diff --git a/games/lemm/graphics/Makefile b/games/lemm/graphics/Makefile index a164f3c3..aa814c2a 100644 --- a/games/lemm/graphics/Makefile +++ b/games/lemm/graphics/Makefile @@ -5,17 +5,17 @@ LZSA = ~/research/lzsa/lzsa/lzsa B2D = ../../../utils/bmp2dhr/b2d HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite -all: graphics_test.inc graphics_level1.inc sprites.inc +all: graphics_test.inc graphics_level1.inc graphics_level5.inc sprites.inc ### graphics_test.inc: \ level1.lzsa \ - level2.lzsa \ - level2_fine.lzsa + level5.lzsa \ + level5_fine.lzsa echo "level1_lzsa: .incbin \"level1.lzsa\"" > graphics_test.inc - echo "level2_lzsa: .incbin \"level2.lzsa\"" >> graphics_test.inc - echo "level2_fine_lzsa: .incbin \"level2_fine.lzsa\"" >> graphics_test.inc + echo "level5_lzsa: .incbin \"level5.lzsa\"" >> graphics_test.inc + echo "level5_fine_lzsa: .incbin \"level5_fine.lzsa\"" >> graphics_test.inc graphics_level1.inc: \ @@ -24,6 +24,12 @@ graphics_level1.inc: \ echo "level1_lzsa: .incbin \"level1.lzsa\"" > graphics_level1.inc echo "level1_preview_lzsa: .incbin \"level1_preview.lzsa\"" >> graphics_level1.inc +graphics_level5.inc: \ + level5.lzsa \ + level5_preview.lzsa + echo "level5_lzsa: .incbin \"level5.lzsa\"" > graphics_level5.inc + echo "level5_preview_lzsa: .incbin \"level5_preview.lzsa\"" >> graphics_level5.inc + ### sprites.inc: sprites.png @@ -135,19 +141,28 @@ level1_preview.hgr: level1_preview.png ### -level2.lzsa: level2.hgr - $(LZSA) -r -f2 level2.hgr level2.lzsa +level5.lzsa: level5.hgr + $(LZSA) -r -f2 level5.hgr level5.lzsa -level2.hgr: level2.png - $(PNG2HGR) level2.png > level2.hgr +level5.hgr: level5.png + $(PNG2HGR) level5.png > level5.hgr ### -level2_fine.lzsa: level2_fine.hgr - $(LZSA) -r -f2 level2_fine.hgr level2_fine.lzsa -level2_fine.hgr: level2_fine.png - $(PNG2HGR) level2_fine.png > level2_fine.hgr +level5_preview.lzsa: level5_preview.hgr + $(LZSA) -r -f2 level5_preview.hgr level5_preview.lzsa + +level5_preview.hgr: level5_preview.png + $(PNG2HGR) level5_preview.png > level5_preview.hgr + +### + +level5_fine.lzsa: level5_fine.hgr + $(LZSA) -r -f2 level5_fine.hgr level5_fine.lzsa + +level5_fine.hgr: level5_fine.png + $(PNG2HGR) level5_fine.png > level5_fine.hgr #### diff --git a/games/lemm/graphics/level2.png b/games/lemm/graphics/level5.png similarity index 100% rename from games/lemm/graphics/level2.png rename to games/lemm/graphics/level5.png diff --git a/games/lemm/graphics/level2_fine.png b/games/lemm/graphics/level5_fine.png similarity index 100% rename from games/lemm/graphics/level2_fine.png rename to games/lemm/graphics/level5_fine.png diff --git a/games/lemm/intro_level1.s b/games/lemm/intro_level1.s index bc079b51..b1be535a 100644 --- a/games/lemm/intro_level1.s +++ b/games/lemm/intro_level1.s @@ -3,11 +3,24 @@ ; print the intro message for level1 ;===================================== -intro_level1: +intro_level: + lda WHICH_LEVEL + cmp #1 + bne its_level_5_preview + +its_level_1_preview: lda #level1_preview_lzsa + jmp done_load_preview + +its_level_5_preview: + lda #level5_preview_lzsa +done_load_preview: + sta getsrc_smc+2 ; LZSA_SRC_HI lda #$20 @@ -25,9 +38,22 @@ intro_level1: ; print messages + lda WHICH_LEVEL + cmp #1 + bne its_level_5_text + +its_level_1_text: lda #level1_intro_text + jmp its_level_1_text_done + +its_level_5_text: + lda #level5_intro_text + +its_level_1_text_done: sta OUTH ; print the text @@ -150,7 +176,6 @@ level5_intro_text: .byte 8,23,"PRESS RETURN TO CONINUE",0 - .align $100 ; split screen? diff --git a/games/lemm/lemm.s b/games/lemm/lemm.s index d3f7669e..99193e59 100644 --- a/games/lemm/lemm.s +++ b/games/lemm/lemm.s @@ -202,7 +202,23 @@ zurg: play_level1: jsr do_level1 - jmp play_level1 + lda LEVEL_OVER + cmp #LEVEL_WIN + beq play_level5 + bne play_level1 + + + ;======================= + ; do level5 + ;======================= + +play_level5: + jsr do_level5 + + lda LEVEL_OVER + cmp #LEVEL_WIN + beq play_level1 + bne play_level5 @@ -241,9 +257,6 @@ load_song_chunk_good: ; includes ;========================== -; .include "gr_pageflip.s" -; .include "gr_copy.s" -; .include "wait_a_bit.s" .include "gr_offsets.s" .include "decompress_fast_v2.s" @@ -253,6 +266,7 @@ load_song_chunk_good: .include "joystick.s" .include "level1.s" + .include "level5.s" .include "gr_fast_clear.s" @@ -297,6 +311,7 @@ config_string: .include "graphics/graphics_level1.inc" +.include "graphics/graphics_level5.inc" .include "graphics/sprites.inc" music_parts_h: diff --git a/games/lemm/lemm_test.s b/games/lemm/lemm_test.s index 7ef2fbda..b9a1eb12 100644 --- a/games/lemm/lemm_test.s +++ b/games/lemm/lemm_test.s @@ -241,9 +241,9 @@ load_graphics_loop: jsr wait_until_keypress - lda #level2_lzsa + lda #>level5_lzsa sta getsrc_smc+2 ; LZSA_SRC_HI lda #$20 @@ -252,9 +252,9 @@ load_graphics_loop: jsr wait_until_keypress - lda #level2_fine_lzsa + lda #>level5_fine_lzsa sta getsrc_smc+2 ; LZSA_SRC_HI lda #$20 diff --git a/games/lemm/level1.s b/games/lemm/level1.s index b6098991..0655461a 100644 --- a/games/lemm/level1.s +++ b/games/lemm/level1.s @@ -27,7 +27,9 @@ do_level1: ; show title screen ;======================= - jsr intro_level1 + lda #1 + sta WHICH_LEVEL + jsr intro_level ;======================= ; Load Graphics @@ -131,10 +133,10 @@ do_level1: ; Main Loop ;=================== ;=================== -main_loop: +l1_main_loop: lda LOAD_NEXT_CHUNK ; see if we need to load next chunk - beq no_load_chunk ; outside IRQ to avoid glitch in music + beq l1_no_load_chunk ; outside IRQ to avoid glitch in music jsr load_song_chunk @@ -142,29 +144,29 @@ main_loop: sta LOAD_NEXT_CHUNK -no_load_chunk: +l1_no_load_chunk: lda DOOR_OPEN - bne door_is_open + bne l1_door_is_open jsr draw_door -door_is_open: +l1_door_is_open: ;====================== ; release lemmings ;====================== lda LEMMINGS_TO_RELEASE - beq done_release_lemmings + beq l1_done_release_lemmings lda DOOR_OPEN - beq done_release_lemmings + beq l1_done_release_lemmings lda FRAMEL and #$f - bne done_release_lemmings + bne l1_done_release_lemmings inc LEMMINGS_OUT jsr update_lemmings_out @@ -174,20 +176,20 @@ door_is_open: dec LEMMINGS_TO_RELEASE -done_release_lemmings: +l1_done_release_lemmings: jsr draw_flames lda TIMER_COUNT cmp #$50 - bcc timer_not_yet + bcc l1_timer_not_yet jsr update_time lda #$0 sta TIMER_COUNT -timer_not_yet: +l1_timer_not_yet: ; main drawing loop @@ -210,12 +212,12 @@ timer_not_yet: inc FRAMEL lda LEVEL_OVER - bne level_over + bne l1_level_over - jmp main_loop + jmp l1_main_loop -level_over: +l1_level_over: bit SET_TEXT diff --git a/games/lemm/level5.s b/games/lemm/level5.s new file mode 100644 index 00000000..5b388b9f --- /dev/null +++ b/games/lemm/level5.s @@ -0,0 +1,230 @@ + +do_level5: + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + lda #$D0 + sta CHUNK_NEXT_LOAD ; Load at $D0 + jsr load_song_chunk + + lda #$D0 ; music starts at $d000 + sta CHUNK_NEXT_PLAY + sta BASE_FRAME_H + + lda #1 + sta LOOP + sta CURRENT_CHUNK + + ;======================= + ; show title screen + ;======================= + + lda #5 + sta WHICH_LEVEL + jsr intro_level + + ;======================= + ; Load Graphics + ;======================= + + lda #$20 + sta HGR_PAGE + jsr hgr_make_tables + + bit SET_GR + bit PAGE0 + bit HIRES + bit FULLGR + + lda #level5_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #level5_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$40 + + jsr decompress_lzsa2_fast + + + ;======================= + ; Setup cursor + ;======================= + + lda #0 + sta OVER_LEMMING + lda #10 + sta CURSOR_X + lda #100 + sta CURSOR_Y + + ;======================= + ; Init Lemmings + ;======================= + + lda #0 + sta lemming_out + lda #12 + sta lemming_x + lda #45 + sta lemming_y + lda #1 + sta lemming_direction + lda #LEMMING_FALLING + sta lemming_status + + ;======================= + ; Play "Let's Go" + ;======================= + + + ;======================= + ; start music + ;======================= + +; cli + + ;======================= + ; init vars + ;======================= + + lda #0 + sta LEVEL_OVER + sta DOOR_OPEN + sta FRAMEL + sta LOAD_NEXT_CHUNK + sta JOYSTICK_ENABLED + sta LEMMINGS_OUT + + jsr update_lemmings_out + + lda #1 + sta LEMMINGS_TO_RELEASE + +; jsr save_bg_14x14 ; save initial bg + + ; set up time + + lda #$5 + sta TIME_MINUTES + lda #$00 + sta TIME_SECONDS + + sta TIMER_COUNT + + ;=================== + ;=================== + ; Main Loop + ;=================== + ;=================== +l5_main_loop: + + lda LOAD_NEXT_CHUNK ; see if we need to load next chunk + beq l5_no_load_chunk ; outside IRQ to avoid glitch in music + + jsr load_song_chunk + + lda #0 ; reset + sta LOAD_NEXT_CHUNK + + +l5_no_load_chunk: + + + lda DOOR_OPEN + bne l5_door_is_open + + jsr draw_door + +l5_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + lda LEMMINGS_TO_RELEASE + beq l5_done_release_lemmings + + lda DOOR_OPEN + beq l5_done_release_lemmings + + lda FRAMEL + and #$f + bne l5_done_release_lemmings + + inc LEMMINGS_OUT + jsr update_lemmings_out + + lda #1 + sta lemming_out + + dec LEMMINGS_TO_RELEASE + +l5_done_release_lemmings: + + + jsr draw_flames + + lda TIMER_COUNT + cmp #$50 + bcc l5_timer_not_yet + + jsr update_time + + lda #$0 + sta TIMER_COUNT +l5_timer_not_yet: + + + ; main drawing loop + + jsr erase_lemming + + jsr erase_pointer + + jsr move_lemmings + + jsr draw_lemming + + jsr handle_keypress + + jsr draw_pointer + + lda #$ff + jsr wait + + inc FRAMEL + + lda LEVEL_OVER + bne l5_level_over + + jmp l5_main_loop + + +l5_level_over: + + bit SET_TEXT + + jsr disable_music + + jsr outro_level1 + + rts + + diff --git a/games/lemm/zp.inc b/games/lemm/zp.inc index 1e695398..a7e2c5b7 100644 --- a/games/lemm/zp.inc +++ b/games/lemm/zp.inc @@ -70,6 +70,7 @@ SAVED_Y1 = $84 SAVED_Y2 = $85 LEMMINGS_OUT = $86 BUTTON_LOCATION = $87 +WHICH_LEVEL = $88 APPLEII_MODEL = $8B