diff --git a/games/lemm/Makefile b/games/lemm/Makefile index 8d7865c9..aa0b3cc6 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -19,7 +19,7 @@ all: lemm.dsk lemm.dsk: QBOOT QLOAD LEMM \ - LEVEL1 LEVEL5 + LEVEL1 LEVEL2 LEVEL5 cp $(EMPTY_DISK) lemm.dsk $(DOS33_RAW) lemm.dsk 0 0 QBOOT 0 1 $(DOS33_RAW) lemm.dsk 0 2 QBOOT 1 1 @@ -27,6 +27,7 @@ lemm.dsk: QBOOT QLOAD LEMM \ $(DOS33_RAW) lemm.dsk 1 0 QLOAD 0 0 $(DOS33_RAW) lemm.dsk 3 0 LEMM 0 0 $(DOS33_RAW) lemm.dsk 10 0 LEVEL1 0 0 + $(DOS33_RAW) lemm.dsk 12 0 LEVEL2 0 0 $(DOS33_RAW) lemm.dsk 18 0 LEVEL5 0 0 @@ -121,8 +122,14 @@ lemm.inc: generate_common LEMM ./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 - - + ./generate_common -a 0x6000 -s r_flame_x_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s r_flame_y_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s l_flame_x_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s l_flame_y_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s exit_x1_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s exit_x2_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s exit_y1_smc lemm.lst >> lemm.inc + ./generate_common -a 0x6000 -s exit_y2_smc lemm.lst >> lemm.inc #### @@ -135,6 +142,16 @@ level1.o: level1.s zp.inc hardware.inc qload.inc lemm.inc \ #### +LEVEL2: level2.o + ld65 -o LEVEL2 level2.o -C ../../linker_scripts/apple2_a000.inc + +level2.o: level2.s zp.inc hardware.inc qload.inc lemm.inc \ + graphics/graphics_level2.inc + ca65 -o level2.o level2.s -l level2.lst + + +#### + LEVEL5: level5.o ld65 -o LEVEL5 level5.o -C ../../linker_scripts/apple2_a000.inc diff --git a/games/lemm/draw_door.s b/games/lemm/draw_door.s index d32f8e43..79d3d379 100644 --- a/games/lemm/draw_door.s +++ b/games/lemm/draw_door.s @@ -14,26 +14,34 @@ draw_door: lda door_h,Y sta INH - ldx #9 ; 63 + ldx DOOR_X ; 63 stx XPOS - lda #36 + lda DOOR_Y sta YPOS jsr hgr_draw_sprite jsr hgr_sprite_page_toggle - ldx #9 ; 63 + lda FRAMEL + lsr + and #$3 + tay + + lda door_l,Y + sta INL + lda door_h,Y + sta INH + + ldx DOOR_X ; 63 stx XPOS - lda #36 + lda DOOR_Y sta YPOS jsr hgr_draw_sprite jsr hgr_sprite_page_toggle - - lda FRAMEL cmp #7 bne not_door_done @@ -74,9 +82,9 @@ draw_door_5: lda bdoor_h,Y sta INH - ldx #9 ; 63 + ldx DOOR_X ; 63 stx XPOS - lda #24 + lda DOOR_Y sta YPOS jsr hgr_draw_sprite diff --git a/games/lemm/draw_flames.s b/games/lemm/draw_flames.s index 5f99e0ba..aae97527 100644 --- a/games/lemm/draw_flames.s +++ b/games/lemm/draw_flames.s @@ -1,4 +1,6 @@ - + ;======================= + ; draw exit flames + ;======================= draw_flames: @@ -12,8 +14,10 @@ draw_flames: lda lflame_h,Y sta INH +l_flame_x_smc: ldx #31 ; 217 stx XPOS +l_flame_y_smc: lda #108 sta YPOS @@ -30,8 +34,10 @@ draw_flames: lda rflame_h,Y sta INH +r_flame_x_smc: ldx #35 ; 245 stx XPOS +r_flame_y_smc: lda #108 sta YPOS diff --git a/games/lemm/graphics/Makefile b/games/lemm/graphics/Makefile index b54f4078..4dbb4b6c 100644 --- a/games/lemm/graphics/Makefile +++ b/games/lemm/graphics/Makefile @@ -28,10 +28,10 @@ graphics_level1.inc: \ echo "level1_preview_lzsa: .incbin \"level1_preview.lzsa\"" >> graphics_level1.inc graphics_level2.inc: \ - level2.lzsa -# level1_preview.lzsa + level2.lzsa \ + level2_preview.lzsa echo "level2_lzsa: .incbin \"level2.lzsa\"" > graphics_level2.inc -# echo "level1_preview_lzsa: .incbin \"level1_preview.lzsa\"" >> graphics_level1.inc + echo "level2_preview_lzsa: .incbin \"level2_preview.lzsa\"" >> graphics_level2.inc graphics_level5.inc: \ @@ -159,6 +159,14 @@ level2.hgr: level2.png ### +level2_preview.lzsa: level2_preview.hgr + $(LZSA) -r -f2 level2_preview.hgr level2_preview.lzsa + +level2_preview.hgr: level2_preview.png + $(PNG2HGR) level2_preview.png > level2_preview.hgr + +### + level5.lzsa: level5.hgr $(LZSA) -r -f2 level5.hgr level5.lzsa diff --git a/games/lemm/graphics/level2.png b/games/lemm/graphics/level2.png index b7d07603..18c88dad 100644 Binary files a/games/lemm/graphics/level2.png and b/games/lemm/graphics/level2.png differ diff --git a/games/lemm/lemm.s b/games/lemm/lemm.s index 330f22d0..beef7946 100644 --- a/games/lemm/lemm.s +++ b/games/lemm/lemm.s @@ -227,7 +227,15 @@ zurg: lda #25 jsr wait_a_bit + ; see if we pressed a number + cmp #'2'+$80 + bne oof + + lda #2 + sta WHICH_LEVEL + +oof: ;======================= ; do level @@ -249,7 +257,11 @@ play_level: bne level_lost level_won: -; inc WHICH_LEVEL + inc WHICH_LEVEL + + lda WHICH_LEVEL + cmp #3 + bcc level_lost lda #5 sta WHICH_LEVEL @@ -365,9 +377,6 @@ config_string: letsgo: .incbin "sounds/letsgo.btc.lz4" -; .include "level1.s" -; .include "level5.s" - start_level = $a000 diff --git a/games/lemm/level1.s b/games/lemm/level1.s index 28a4acf2..c4d10a5c 100644 --- a/games/lemm/level1.s +++ b/games/lemm/level1.s @@ -7,6 +7,48 @@ do_level1: + ;============== + ; set up stuff + ;============== + + lda #9 + sta DOOR_X + lda #36 + sta DOOR_Y + + lda #12 + sta INIT_X + lda #45 + sta INIT_Y + + ; flame locations + + lda #31 ; 217 + sta l_flame_x_smc+1 + lda #108 + sta l_flame_y_smc+1 + sta r_flame_y_smc+1 + + lda #35 ; 245 + sta r_flame_x_smc+1 + + ; door exit location + + lda #31 ; + sta exit_x1_smc+1 + lda #35 + sta exit_x2_smc+1 + + lda #116 + sta exit_y1_smc+1 + lda #127 + sta exit_y2_smc+1 + + + + + + ;============== ; set up intro ;============== diff --git a/games/lemm/level2.s b/games/lemm/level2.s new file mode 100644 index 00000000..3059399b --- /dev/null +++ b/games/lemm/level2.s @@ -0,0 +1,327 @@ + +.include "zp.inc" +.include "hardware.inc" +.include "qload.inc" +.include "lemm.inc" +.include "lemming_status.inc" + +do_level2: + + + ;====================== + ; set up initial stuff + ;====================== + lda #3 + sta DOOR_X + lda #5 + sta DOOR_Y + + lda #7 + sta INIT_X + lda #15 + sta INIT_Y + + lda #29 ; 196 + sta l_flame_x_smc+1 + lda #122 + sta l_flame_y_smc+1 + sta r_flame_y_smc+1 + + lda #33 ; 245 + sta r_flame_x_smc+1 + + ; exit location (1c 8b) + + lda #29 ; + sta exit_x1_smc+1 + lda #33 + sta exit_x2_smc+1 + + lda #121 + sta exit_y1_smc+1 + lda #144 + sta exit_y2_smc+1 + + + ;============== + ; set up intro + ;============== + + lda #level2_preview_lzsa + sta level_preview_h_smc+1 + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + ; set up first song + + lda #music8_parts_l + sta chunk_l_smc+2 + + lda #music8_parts_h + sta chunk_h_smc+2 + + + 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 + ;======================= + + jsr intro_level + + ;======================= + ; Load Graphics + ;======================= + + lda #$20 + sta HGR_PAGE + jsr hgr_make_tables + + bit SET_GR + bit PAGE0 + bit HIRES + bit FULLGR + + lda #level2_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #level2_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 + sta lemming_exploding + lda INIT_X + sta lemming_x + lda INIT_Y + sta lemming_y + lda #1 + sta lemming_direction + lda #LEMMING_FALLING + sta lemming_status + + ;======================= + ; Play "Let's Go" + ;======================= + + jsr play_letsgo + + + ;======================= + ; 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 + ;=================== + ;=================== +l2_main_loop: + + lda LOAD_NEXT_CHUNK ; see if we need to load next chunk + beq l2_no_load_chunk ; outside IRQ to avoid glitch in music + + jsr load_song_chunk + + lda #0 ; reset + sta LOAD_NEXT_CHUNK + + +l2_no_load_chunk: + + + lda DOOR_OPEN + bne l2_door_is_open + + jsr draw_door + +l2_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + lda LEMMINGS_TO_RELEASE + beq l2_done_release_lemmings + + lda DOOR_OPEN + beq l2_done_release_lemmings + + lda FRAMEL + and #$f + bne l2_done_release_lemmings + + inc LEMMINGS_OUT + jsr update_lemmings_out + + lda #1 + sta lemming_out + + dec LEMMINGS_TO_RELEASE + +l2_done_release_lemmings: + + + jsr draw_flames + + lda TIMER_COUNT + cmp #$50 + bcc l2_timer_not_yet + + jsr update_time + + lda #$0 + sta TIMER_COUNT +l2_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 l2_level_over + + jmp l2_main_loop + + +l2_level_over: + +; bit SET_TEXT + + jsr disable_music + + jsr outro_level1 + + rts + + + + +.include "graphics/graphics_level2.inc" + + +music8_parts_h: + .byte >lemm8_part1_lzsa,>lemm8_part2_lzsa,>lemm8_part3_lzsa + .byte >lemm8_part4_lzsa,>lemm8_part5_lzsa,>lemm8_part6_lzsa + .byte $00 + +music8_parts_l: + .byte lemm5.raw @@ -19,6 +21,15 @@ lemm5.raw: lemm5.ym lemm6.raw: lemm6.ym $(YM5_TO_RAW) ./lemm6.ym > lemm6.raw +lemm8.raw: lemm8.ym + $(YM5_TO_RAW) ./lemm8.ym > lemm8.raw + +lemm9.raw: lemm9.ym + $(YM5_TO_RAW) ./lemm9.ym > lemm9.raw + +lemm10.raw: lemm10.ym + $(YM5_TO_RAW) ./lemm10.ym > lemm10.raw + #### lemm5.part1: lemm5.raw @@ -74,6 +85,35 @@ lemm6.part9.lzsa: lemm6.part9 lemm6.part10.lzsa: lemm6.part10 $(LZSA) -r -f2 lemm6.part10 lemm6.part10.lzsa +#### + +lemm8.part1: lemm8.raw + $(RAW_INTERLEAVE) -m 11 -c 512 ./lemm8 + +lemm8.part1.lzsa: lemm8.part1 + $(LZSA) -r -f2 lemm8.part1 lemm8.part1.lzsa + +lemm8.part2.lzsa: lemm8.part2 + $(LZSA) -r -f2 lemm8.part2 lemm8.part2.lzsa + +lemm8.part3.lzsa: lemm8.part3 + $(LZSA) -r -f2 lemm8.part3 lemm8.part3.lzsa + +lemm8.part4.lzsa: lemm8.part4 + $(LZSA) -r -f2 lemm8.part4 lemm8.part4.lzsa + +lemm8.part5.lzsa: lemm8.part5 + $(LZSA) -r -f2 lemm8.part5 lemm8.part5.lzsa + +lemm8.part6.lzsa: lemm8.part6 + $(LZSA) -r -f2 lemm8.part6 lemm8.part6.lzsa + +lemm8.part7.lzsa: lemm8.part7 + $(LZSA) -r -f2 lemm8.part7 lemm8.part7.lzsa + + +#### + clean: rm -f *.lzsa *.part1 *.part2 *.part3 *.part4 *.part5 *.part6 *.part7 *.part8 *.part9 *.part10 diff --git a/games/lemm/zp.inc b/games/lemm/zp.inc index e1debd3d..f14bc5a1 100644 --- a/games/lemm/zp.inc +++ b/games/lemm/zp.inc @@ -75,6 +75,12 @@ WHICH_LEVEL = $88 APPLEII_MODEL = $8B +DOOR_X = $90 ; location of door +DOOR_Y = $91 +INIT_X = $92 ; initial lemming position +INIT_Y = $93 + + ; done game puzzle state