diff --git a/games/lemm/Makefile b/games/lemm/Makefile index aa0b3cc6..f7bddc85 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -19,7 +19,7 @@ all: lemm.dsk lemm.dsk: QBOOT QLOAD LEMM \ - LEVEL1 LEVEL2 LEVEL5 + LEVEL1 LEVEL2 LEVEL4 LEVEL5 cp $(EMPTY_DISK) lemm.dsk $(DOS33_RAW) lemm.dsk 0 0 QBOOT 0 1 $(DOS33_RAW) lemm.dsk 0 2 QBOOT 1 1 @@ -28,6 +28,7 @@ lemm.dsk: QBOOT QLOAD LEMM \ $(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 16 0 LEVEL4 0 0 $(DOS33_RAW) lemm.dsk 18 0 LEVEL5 0 0 @@ -149,6 +150,16 @@ 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 +#### + +LEVEL4: level4.o + ld65 -o LEVEL4 level4.o -C ../../linker_scripts/apple2_a000.inc + +level4.o: level4.s zp.inc hardware.inc qload.inc lemm.inc \ + graphics/graphics_level4.inc + ca65 -o level4.o level4.s -l level4.lst + + #### diff --git a/games/lemm/TODO b/games/lemm/TODO index 5f1dd461..02ce6fae 100644 --- a/games/lemm/TODO +++ b/games/lemm/TODO @@ -9,4 +9,5 @@ + Falling too far and you go splat + See if the jerky animation is due to starting at an odd x vs even x, maybe we should start animation 4 frames in if that's - the case + the case. Or maybe it's the shift for odd frames, make + the shift the other way if walking left/right diff --git a/games/lemm/graphics/Makefile b/games/lemm/graphics/Makefile index 4dbb4b6c..e2a25e06 100644 --- a/games/lemm/graphics/Makefile +++ b/games/lemm/graphics/Makefile @@ -8,7 +8,9 @@ HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite all: graphics_test.inc \ graphics_level1.inc \ graphics_level2.inc \ - graphics_level5.inc sprites.inc + graphics_level4.inc \ + graphics_level5.inc \ + sprites.inc ### @@ -34,6 +36,12 @@ graphics_level2.inc: \ echo "level2_preview_lzsa: .incbin \"level2_preview.lzsa\"" >> graphics_level2.inc +graphics_level4.inc: \ + level4.lzsa \ + level4_preview.lzsa + echo "level4_lzsa: .incbin \"level4.lzsa\"" > graphics_level4.inc + echo "level4_preview_lzsa: .incbin \"level4_preview.lzsa\"" >> graphics_level4.inc + graphics_level5.inc: \ level5.lzsa \ level5_preview.lzsa @@ -167,6 +175,24 @@ level2_preview.hgr: level2_preview.png ### +level4.lzsa: level4.hgr + $(LZSA) -r -f2 level4.hgr level4.lzsa + +level4.hgr: level4.png + $(PNG2HGR) level4.png > level4.hgr + +### + + +level4_preview.lzsa: level4_preview.hgr + $(LZSA) -r -f2 level4_preview.hgr level4_preview.lzsa + +level4_preview.hgr: level4_preview.png + $(PNG2HGR) level4_preview.png > level4_preview.hgr + + +### + level5.lzsa: level5.hgr $(LZSA) -r -f2 level5.hgr level5.lzsa diff --git a/games/lemm/graphics/level4.png b/games/lemm/graphics/level4.png new file mode 100644 index 00000000..7b2f06a5 Binary files /dev/null and b/games/lemm/graphics/level4.png differ diff --git a/games/lemm/graphics/level4_preview.png b/games/lemm/graphics/level4_preview.png new file mode 100644 index 00000000..5f9663bb Binary files /dev/null and b/games/lemm/graphics/level4_preview.png differ diff --git a/games/lemm/lemm.s b/games/lemm/lemm.s index beef7946..3b5d39f2 100644 --- a/games/lemm/lemm.s +++ b/games/lemm/lemm.s @@ -229,10 +229,14 @@ zurg: ; see if we pressed a number - cmp #'2'+$80 - bne oof + cmp #'1'+$80 + bcc oof + cmp #'6'+$80 + bcs oof - lda #2 + and #$7f + sec + sbc #'0' sta WHICH_LEVEL oof: @@ -378,5 +382,4 @@ letsgo: .incbin "sounds/letsgo.btc.lz4" -start_level = $a000 - +start_level = $a001 diff --git a/games/lemm/level1.s b/games/lemm/level1.s index c4d10a5c..242e7b81 100644 --- a/games/lemm/level1.s +++ b/games/lemm/level1.s @@ -5,6 +5,9 @@ .include "lemm.inc" .include "lemming_status.inc" + +.byte 1 ; level 1 + do_level1: ;============== diff --git a/games/lemm/level2.s b/games/lemm/level2.s index 3059399b..9c971195 100644 --- a/games/lemm/level2.s +++ b/games/lemm/level2.s @@ -5,6 +5,8 @@ .include "lemm.inc" .include "lemming_status.inc" +.byte 2 ; level 2 + do_level2: diff --git a/games/lemm/level4.s b/games/lemm/level4.s new file mode 100644 index 00000000..e253bf04 --- /dev/null +++ b/games/lemm/level4.s @@ -0,0 +1,333 @@ + +.include "zp.inc" +.include "hardware.inc" +.include "qload.inc" +.include "lemm.inc" +.include "lemming_status.inc" + +.byte 4 ; level 4 + +do_level4: + + + ;====================== + ; 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 #level4_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 #level4_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #level4_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_level4.inc" + + +music8_parts_h: + .byte >lemm9_part1_lzsa,>lemm9_part2_lzsa,>lemm9_part3_lzsa + .byte >lemm9_part4_lzsa,>lemm9_part5_lzsa,>lemm9_part6_lzsa + .byte >lemm9_part7_lzsa + .byte $00 + +music8_parts_l: + .byte