diff --git a/games/lemm/Makefile b/games/lemm/Makefile index 1cc0d374..97258ae4 100644 --- a/games/lemm/Makefile +++ b/games/lemm/Makefile @@ -9,7 +9,7 @@ TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft EMPTY_DISK = ../../empty_disk/empty.dsk LINKER_SCRIPTS = ../../linker_scripts -all: lemm.dsk +all: lemm.dsk hr_lemm.dsk #lemm.dsk: HELLO LEMM LEMM_TEST # cp $(EMPTY_DISK) lemm.dsk @@ -38,6 +38,28 @@ lemm.dsk: QBOOT QLOAD LEMM \ $(DOS33_RAW) lemm.dsk 33 0 LEVEL10 0 0 +hr_lemm.dsk: QBOOT QLOAD HR_LEMM \ + HR_LEVEL1 HR_LEVEL2 HR_LEVEL3 HR_LEVEL4 HR_LEVEL5 \ + LEVEL6 LEVEL7 LEVEL8 LEVEL9 LEVEL10 + cp $(EMPTY_DISK) hr_lemm.dsk + $(DOS33_RAW) hr_lemm.dsk 0 0 QBOOT 0 1 + $(DOS33_RAW) hr_lemm.dsk 0 2 QBOOT 1 1 + $(DOS33_RAW) hr_lemm.dsk 0 4 QBOOT 2 1 + $(DOS33_RAW) hr_lemm.dsk 1 0 QLOAD 0 0 + $(DOS33_RAW) hr_lemm.dsk 3 0 HR_LEMM 0 0 + $(DOS33_RAW) hr_lemm.dsk 6 0 HR_LEVEL1 0 0 + $(DOS33_RAW) hr_lemm.dsk 9 0 HR_LEVEL2 0 0 + $(DOS33_RAW) hr_lemm.dsk 12 0 HR_LEVEL3 0 0 + $(DOS33_RAW) hr_lemm.dsk 15 0 HR_LEVEL4 0 0 + $(DOS33_RAW) hr_lemm.dsk 18 0 HR_LEVEL5 0 0 + $(DOS33_RAW) hr_lemm.dsk 21 0 LEVEL6 0 0 + $(DOS33_RAW) hr_lemm.dsk 24 0 LEVEL7 0 0 + $(DOS33_RAW) hr_lemm.dsk 27 0 LEVEL8 0 0 + $(DOS33_RAW) hr_lemm.dsk 30 0 LEVEL9 0 0 + $(DOS33_RAW) hr_lemm.dsk 33 0 LEVEL10 0 0 + + + ### @@ -135,7 +157,23 @@ lemm.o: lemm.s zp.inc hardware.inc qload.inc hgr.inc \ interrupt_handler.s keyboard.s \ pointer_sprites.inc particle_hgr.s release_lemming.s \ title.s audio.s letsgo.s load_music.s - ca65 -o lemm.o lemm.s -l lemm.lst + ca65 -DHR_VERSION=0 -o lemm.o lemm.s -l lemm.lst + +#### + +HR_LEMM: hr_lemm.o + ld65 -o HR_LEMM hr_lemm.o -C ../../linker_scripts/apple2_6000.inc + +hr_lemm.o: lemm.s zp.inc hardware.inc qload.inc hgr.inc \ + graphics/sprites.inc \ + intro_level.s update_time.s draw_flames.s \ + draw_door.s move_lemming.s draw_lemming.s \ + update_menu.s init_level.s \ + interrupt_handler.s keyboard.s \ + pointer_sprites.inc particle_hgr.s release_lemming.s \ + title.s audio.s letsgo.s load_music.s + ca65 -DHR_VERSION=1 -o hr_lemm.o lemm.s -l hr_lemm.lst + ### @@ -312,11 +350,67 @@ generate_common.o: generate_common.c graphics/graphics_test.inc: cd graphics && make +#### + +HR_LEVEL1: hr_level1.o + ld65 -o HR_LEVEL1 hr_level1.o -C ../../linker_scripts/apple2_9000.inc + +hr_level1.o: hr_level1.s zp.inc hardware.inc qload.inc lemm.inc \ + release_lemming.s \ + hr_graphics/graphics_hr_level1.inc + ca65 -o hr_level1.o hr_level1.s -l hr_level1.lst + +#### + +HR_LEVEL2: hr_level2.o + ld65 -o HR_LEVEL2 hr_level2.o -C ../../linker_scripts/apple2_9000.inc + +hr_level2.o: hr_level2.s zp.inc hardware.inc qload.inc lemm.inc \ + release_lemming.s \ + hr_graphics/graphics_hr_level2.inc + ca65 -o hr_level2.o hr_level2.s -l hr_level2.lst + +#### + +HR_LEVEL3: hr_level3.o + ld65 -o HR_LEVEL3 hr_level3.o -C ../../linker_scripts/apple2_9000.inc + +hr_level3.o: hr_level3.s zp.inc hardware.inc qload.inc lemm.inc \ + release_lemming.s \ + hr_graphics/graphics_hr_level3.inc + ca65 -o hr_level3.o hr_level3.s -l hr_level3.lst + +#### + +HR_LEVEL4: hr_level4.o + ld65 -o HR_LEVEL4 hr_level4.o -C ../../linker_scripts/apple2_9000.inc + +hr_level4.o: hr_level4.s zp.inc hardware.inc qload.inc lemm.inc \ + release_lemming.s \ + hr_graphics/graphics_hr_level4.inc + ca65 -o hr_level4.o hr_level4.s -l hr_level4.lst + +#### + +HR_LEVEL5: hr_level5.o + ld65 -o HR_LEVEL5 hr_level5.o -C ../../linker_scripts/apple2_9000.inc + +hr_level5.o: hr_level5.s zp.inc hardware.inc qload.inc lemm.inc \ + release_lemming.s \ + hr_graphics/graphics_hr_level5.inc + ca65 -o hr_level5.o hr_level5.s -l hr_level5.lst + + + + + + #### clean: rm -f *~ *.o *.lst HELLO LEMM LEMM_TEST generate_common \ LEVEL1 LEVEL2 LEVEL3 LEVEL4 LEVEL5 \ LEVEL6 LEVEL7 LEVEL8 LEVEL9 LEVEL10 \ + HR_LEMM \ + HR_LEVEL1 HR_LEVEL2 HR_LEVEL3 HR_LEVEL4 HR_LEVEL5 \ lemm.inc qload.inc - diff --git a/games/lemm/hr_graphics/Makefile b/games/lemm/hr_graphics/Makefile new file mode 100644 index 00000000..634ac19c --- /dev/null +++ b/games/lemm/hr_graphics/Makefile @@ -0,0 +1,139 @@ +PNG2RLE = ../../../utils/gr-utils/png2rle +PNG2GR = ../../../utils/gr-utils/png2gr +PNG2HGR = ../../../utils/hgr-utils/png2hgr +LZSA = ~/research/lzsa/lzsa/lzsa +B2D = ../../../utils/bmp2dhr/b2d +HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite + +all: graphics_hr_level1.inc \ + graphics_hr_level2.inc \ + graphics_hr_level3.inc \ + graphics_hr_level4.inc \ + graphics_hr_level5.inc + + +#### + +graphics_hr_level1.inc: \ + hr_level1.lzsa \ + hr_level1_preview.lzsa + echo "hr_level1_lzsa: .incbin \"hr_level1.lzsa\"" > graphics_hr_level1.inc + echo "hr_level1_preview_lzsa: .incbin \"hr_level1_preview.lzsa\"" >> graphics_hr_level1.inc + +graphics_hr_level2.inc: \ + hr_level2.lzsa \ + hr_level2_preview.lzsa + echo "hr_level2_lzsa: .incbin \"hr_level2.lzsa\"" > graphics_hr_level2.inc + echo "hr_level2_preview_lzsa: .incbin \"hr_level2_preview.lzsa\"" >> graphics_hr_level2.inc + +graphics_hr_level3.inc: \ + hr_level3.lzsa \ + hr_level3_preview.lzsa + echo "hr_level3_lzsa: .incbin \"hr_level3.lzsa\"" > graphics_hr_level3.inc + echo "hr_level3_preview_lzsa: .incbin \"hr_level3_preview.lzsa\"" >> graphics_hr_level3.inc + +graphics_hr_level4.inc: \ + hr_level4.lzsa \ + hr_level4_preview.lzsa + echo "hr_level4_lzsa: .incbin \"hr_level4.lzsa\"" > graphics_hr_level4.inc + echo "hr_level4_preview_lzsa: .incbin \"hr_level4_preview.lzsa\"" >> graphics_hr_level4.inc + +graphics_hr_level5.inc: \ + hr_level5.lzsa \ + hr_level5_preview.lzsa + echo "hr_level5_lzsa: .incbin \"hr_level5.lzsa\"" > graphics_hr_level5.inc + echo "hr_level5_preview_lzsa: .incbin \"hr_level5_preview.lzsa\"" >> graphics_hr_level5.inc + + + + + +### + +hr_level1.lzsa: hr_level1.hgr + $(LZSA) -r -f2 hr_level1.hgr hr_level1.lzsa + +hr_level1.hgr: l1_sb.png + $(PNG2HGR) l1_sb.png > hr_level1.hgr + +### + +hr_level1_preview.lzsa: hr_level1_preview.hgr + $(LZSA) -r -f2 hr_level1_preview.hgr hr_level1_preview.lzsa + +hr_level1_preview.hgr: l1_preview.png + $(PNG2HGR) l1_preview.png > hr_level1_preview.hgr + + +### + +hr_level2.lzsa: hr_level2.hgr + $(LZSA) -r -f2 hr_level2.hgr hr_level2.lzsa + +hr_level2.hgr: l2_taran.png + $(PNG2HGR) l2_taran.png > hr_level2.hgr + +### + +hr_level2_preview.lzsa: hr_level2_preview.hgr + $(LZSA) -r -f2 hr_level2_preview.hgr hr_level2_preview.lzsa + +hr_level2_preview.hgr: l2_preview.png + $(PNG2HGR) l2_preview.png > hr_level2_preview.hgr + + +### + +hr_level3.lzsa: hr_level3.hgr + $(LZSA) -r -f2 hr_level3.hgr hr_level3.lzsa + +hr_level3.hgr: l3_hstarmy.png + $(PNG2HGR) l3_hstarmy.png > hr_level3.hgr + +### + +hr_level3_preview.lzsa: hr_level3_preview.hgr + $(LZSA) -r -f2 hr_level3_preview.hgr hr_level3_preview.lzsa + +hr_level3_preview.hgr: l3_preview.png + $(PNG2HGR) l3_preview.png > hr_level3_preview.hgr + +### + +hr_level4.lzsa: hr_level4.hgr + $(LZSA) -r -f2 hr_level4.hgr hr_level4.lzsa + +hr_level4.hgr: l4_bubs.png + $(PNG2HGR) l4_bubs.png > hr_level4.hgr + +### + +hr_level4_preview.lzsa: hr_level4_preview.hgr + $(LZSA) -r -f2 hr_level4_preview.hgr hr_level4_preview.lzsa + +hr_level4_preview.hgr: l4_preview.png + $(PNG2HGR) l4_preview.png > hr_level4_preview.hgr + +### + +hr_level5.lzsa: hr_level5.hgr + $(LZSA) -r -f2 hr_level5.hgr hr_level5.lzsa + +hr_level5.hgr: l5_trog.png + $(PNG2HGR) l5_trog.png > hr_level5.hgr + +### + +hr_level5_preview.lzsa: hr_level5_preview.hgr + $(LZSA) -r -f2 hr_level5_preview.hgr hr_level5_preview.lzsa + +hr_level5_preview.hgr: l5_preview.png + $(PNG2HGR) l5_preview.png > hr_level5_preview.hgr + + + +### + +clean: + rm -f *~ *.lzsa *.gr *.hgr + diff --git a/games/lemm/hr_graphics/l1_preview.png b/games/lemm/hr_graphics/l1_preview.png new file mode 100644 index 00000000..f43bd8fa Binary files /dev/null and b/games/lemm/hr_graphics/l1_preview.png differ diff --git a/games/lemm/hr_graphics/l1_sb.png b/games/lemm/hr_graphics/l1_sb.png new file mode 100644 index 00000000..5c820899 Binary files /dev/null and b/games/lemm/hr_graphics/l1_sb.png differ diff --git a/games/lemm/hr_graphics/l2_preview.png b/games/lemm/hr_graphics/l2_preview.png new file mode 100644 index 00000000..ea0d06f4 Binary files /dev/null and b/games/lemm/hr_graphics/l2_preview.png differ diff --git a/games/lemm/hr_graphics/l2_taran.png b/games/lemm/hr_graphics/l2_taran.png new file mode 100644 index 00000000..0a3b2e65 Binary files /dev/null and b/games/lemm/hr_graphics/l2_taran.png differ diff --git a/games/lemm/hr_graphics/l3_hstarmy.png b/games/lemm/hr_graphics/l3_hstarmy.png new file mode 100644 index 00000000..207e8478 Binary files /dev/null and b/games/lemm/hr_graphics/l3_hstarmy.png differ diff --git a/games/lemm/hr_graphics/l3_preview.png b/games/lemm/hr_graphics/l3_preview.png new file mode 100644 index 00000000..33f0a57e Binary files /dev/null and b/games/lemm/hr_graphics/l3_preview.png differ diff --git a/games/lemm/hr_graphics/l4_bubs.png b/games/lemm/hr_graphics/l4_bubs.png new file mode 100644 index 00000000..9158e34d Binary files /dev/null and b/games/lemm/hr_graphics/l4_bubs.png differ diff --git a/games/lemm/hr_graphics/l4_preview.png b/games/lemm/hr_graphics/l4_preview.png new file mode 100644 index 00000000..4ae35f19 Binary files /dev/null and b/games/lemm/hr_graphics/l4_preview.png differ diff --git a/games/lemm/hr_graphics/l5_preview.png b/games/lemm/hr_graphics/l5_preview.png new file mode 100644 index 00000000..43c968aa Binary files /dev/null and b/games/lemm/hr_graphics/l5_preview.png differ diff --git a/games/lemm/hr_graphics/l5_trog.png b/games/lemm/hr_graphics/l5_trog.png new file mode 100644 index 00000000..a1e17ead Binary files /dev/null and b/games/lemm/hr_graphics/l5_trog.png differ diff --git a/games/lemm/hr_level1.s b/games/lemm/hr_level1.s new file mode 100644 index 00000000..061eb3cf --- /dev/null +++ b/games/lemm/hr_level1.s @@ -0,0 +1,298 @@ +; Homestar Runner Expansion Level 1 + +.include "zp.inc" +.include "hardware.inc" +.include "qload.inc" +.include "lemm.inc" +.include "lemming_status.inc" + + +.byte 1 ; level 1 + +do_level1: + + ;============== + ; set up stuff + ;============== + + lda #20 + sta CLIMBER_COUNT + sta FLOATER_COUNT + sta EXPLODER_COUNT + sta STOPPER_COUNT + sta BUILDER_COUNT + sta BASHER_COUNT + sta MINER_COUNT + sta DIGGER_COUNT + + lda #3 + sta DOOR_X + lda #2 + sta DOOR_Y + + lda #6 + sta INIT_X + lda #12 + sta INIT_Y + + ; flame locations + + lda #18 + sta l_flame_x_smc+1 + lda #108 + sta l_flame_y_smc+1 + sta r_flame_y_smc+1 + + lda #21 + sta r_flame_x_smc+1 + + ; door exit location + + lda #17 ; + sta exit_x1_smc+1 + lda #21 + sta exit_x2_smc+1 + + lda #97 + sta exit_y1_smc+1 + lda #130 + sta exit_y2_smc+1 + + lda #$10 ; BCD + sta PERCENT_NEEDED + sta PERCENT_ADD + + ;============== + ; set up intro + ;============== + + lda #hr_level1_preview_lzsa + sta level_preview_h_smc+1 + + lda #level1_intro_text + sta intro_text_smc_h+1 + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + ; set up first song + + lda #music5_parts_l + sta chunk_l_smc+2 + + lda #music5_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 #hr_level1_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #hr_level1_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$40 + + jsr decompress_lzsa2_fast + + + ;======================= + ; Setup cursor + ;======================= + + lda #$FF + sta OVER_LEMMING + lda #10 + sta CURSOR_X + lda #100 + sta CURSOR_Y + + ;======================= + ; init vars + ;======================= + + lda #10 + sta LEMMINGS_TO_RELEASE + + ; set up time + + lda #$5 + sta TIME_MINUTES + lda #$00 + sta TIME_SECONDS + + sta TIMER_COUNT ; ?? + + jsr init_level + + jsr update_remaining_all + + + ;======================= + ; Play "Let's Go" + ;======================= + + jsr play_letsgo + + + + ;=================== + ;=================== + ; Main Loop + ;=================== + ;=================== +l1_main_loop: + + ;========================= + ; load next chunk of music + ; if necessary + ;========================= + + jsr load_music + + + ;========================= + ; open door + ;========================= + + lda DOOR_OPEN + bne l1_door_is_open + + jsr draw_door + +l1_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + jsr release_lemming + + ;===================== + ; animate flames + ;===================== + + jsr draw_flames + + jsr update_timer + + + ; main drawing loop + + jsr erase_lemming + + jsr erase_pointer + + jsr move_lemmings + + jsr draw_lemming + + jsr handle_keypress + + jsr draw_pointer + + lda #$f0 + jsr wait + + inc FRAMEL + + lda LEVEL_OVER + bne l1_level_over + + jmp l1_main_loop + + +l1_level_over: + + rts + + +.include "update_timer.s" + +.include "hr_graphics/graphics_hr_level1.inc" + + +music5_parts_h: + .byte >lemm5_part1_lzsa,>lemm5_part2_lzsa,>lemm5_part3_lzsa + .byte >lemm5_part4_lzsa,>lemm5_part5_lzsa,$00 + +music5_parts_l: + .byte hr_level2_preview_lzsa + sta level_preview_h_smc+1 + + lda #level2_intro_text + sta intro_text_smc_h+1 + + lda #$20 ; BCD + sta PERCENT_NEEDED + lda #$10 + sta PERCENT_ADD + + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + ; set up first song + + lda #music2_parts_l + sta chunk_l_smc+2 + + lda #music2_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 #hr_level2_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #hr_level2_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$40 + + jsr decompress_lzsa2_fast + + + ;======================= + ; Setup cursor + ;======================= + + lda #$FF + sta OVER_LEMMING + lda #10 + sta CURSOR_X + lda #100 + sta CURSOR_Y + + + ;======================= + ; init vars + ;======================= + + lda #10 + sta LEMMINGS_TO_RELEASE + + ; set up time + + lda #$5 + sta TIME_MINUTES + lda #$00 + sta TIME_SECONDS + sta TIMER_COUNT ; 1/50 + + jsr init_level + + jsr update_remaining_all + + ;======================= + ; Play "Let's Go" + ;======================= + + jsr play_letsgo + + + ;=================== + ;=================== + ; Main Loop + ;=================== + ;=================== +l2_main_loop: + + ;========================= + ; load next chunk of music + ; if necessary + ;========================= + + jsr load_music + + + +l2_no_load_chunk: + + + lda DOOR_OPEN + bne l2_door_is_open + + jsr draw_door + +l2_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + jsr release_lemming + + ;===================== + ; animate flames + ;===================== + + jsr draw_flames + + ;===================== + ; draw level animation + ;===================== + + jsr flame_thrower + + ;==================== + ; update timer + ;==================== + + jsr update_timer + + ;==================== + ; 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: + + rts + +.include "update_timer.s" + +.include "hr_graphics/graphics_hr_level2.inc" + + +music2_parts_h: + .byte >lemm2_part1_lzsa,>lemm2_part2_lzsa,>lemm2_part3_lzsa + .byte >lemm2_part4_lzsa,>lemm2_part5_lzsa,>lemm2_part6_lzsa + .byte >lemm2_part7_lzsa,>lemm2_part8_lzsa,>lemm2_part9_lzsa + .byte >lemm2_part10_lzsa,>lemm2_part11_lzsa,>lemm2_part12_lzsa + .byte >lemm2_part13_lzsa,>lemm2_part14_lzsa,>lemm2_part15_lzsa + .byte >lemm2_part16_lzsa; ,>lemm2_part17_lzsa,>lemm2_part18_lzsa + .byte $00 + +music2_parts_l: + .byte x, savey1->savey2 + + lda #65 + sta SAVED_Y1 + lda #81 + sta SAVED_Y2 + + lda #24 + ldx #33 + + jsr hgr_partial_restore + + ; draw new + + lda FRAMEL + and #$7 + tay + + lda flame_sprites_l,Y + sta INL + lda flame_sprites_h,Y + sta INH + + lda flame_sprites_x,Y + sta XPOS + + lda flame_sprites_y,Y + sta YPOS + + jsr hgr_draw_sprite + + rts + +flame_sprites_l: + .byte flame0_sprite,>flame1_sprite + .byte >flame2_sprite,>flame3_sprite + .byte >flame4_sprite,>flame5_sprite + .byte >flame6_sprite,>flame7_sprite + +flame_sprites_x: + .byte 28,26 + .byte 25,25 + .byte 24,24 + .byte 22,24 +; .byte 38,36 +; .byte 35,35 +; .byte 34,34 +; .byte 32,34 + +flame_sprites_y: + .byte 72,71 + .byte 68,69 + .byte 70,67 + .byte 65,65 + + diff --git a/games/lemm/hr_level3.s b/games/lemm/hr_level3.s new file mode 100644 index 00000000..a7698698 --- /dev/null +++ b/games/lemm/hr_level3.s @@ -0,0 +1,304 @@ +; Homestar Runner Expansion L3 + +.include "zp.inc" +.include "hardware.inc" +.include "qload.inc" +.include "lemm.inc" +.include "lemming_status.inc" + +.byte 3 ; level 3 + +do_level3: + + ;====================== + ; set up initial stuff + ;====================== + + lda #10 + sta CLIMBER_COUNT + sta FLOATER_COUNT + sta EXPLODER_COUNT + sta BUILDER_COUNT + sta BASHER_COUNT + sta MINER_COUNT + sta DIGGER_COUNT + sta STOPPER_COUNT + + lda #7 + sta DOOR_X + lda #1 + sta DOOR_Y + + lda #9 + sta INIT_X + lda #12 + sta INIT_Y + + ; flame location + + lda #34 ; + sta l_flame_x_smc+1 + lda #102 + sta l_flame_y_smc+1 + sta r_flame_y_smc+1 + + lda #38 ; + sta r_flame_x_smc+1 + + ; door exit location + + lda #33 ; + sta exit_x1_smc+1 + lda #38 + sta exit_x2_smc+1 + + lda #96 + sta exit_y1_smc+1 + lda #140 + sta exit_y2_smc+1 + + lda #$10 ; BCD + sta PERCENT_NEEDED + + lda #$10 + sta PERCENT_ADD + + ;============== + ; set up intro + ;============== + + lda #hr_level3_preview_lzsa + sta level_preview_h_smc+1 + + lda #level3_intro_text + sta intro_text_smc_h+1 + + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + ; set up first song + + lda #music11_parts_l + sta chunk_l_smc+2 + + lda #music11_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 #hr_level3_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #hr_level3_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$40 + + jsr decompress_lzsa2_fast + + + ;======================= + ; Setup cursor + ;======================= + + lda #$FF + sta OVER_LEMMING + lda #10 + sta CURSOR_X + lda #100 + sta CURSOR_Y + + ;======================= + ; init vars + ;======================= + + lda #10 + sta LEMMINGS_TO_RELEASE + + ; set up time + + lda #$5 + sta TIME_MINUTES + lda #$00 + sta TIME_SECONDS + sta TIMER_COUNT ; 1/50 + + jsr init_level + + jsr update_remaining_all + + ;======================= + ; Play "Let's Go" + ;======================= + + jsr play_letsgo + + + ;=================== + ;=================== + ; Main Loop + ;=================== + ;=================== +l3_main_loop: + + ;========================= + ; load next chunk of music + ; if necessary + ;========================= + + jsr load_music + + + ;========================= + ; open door + ;========================= + + lda DOOR_OPEN + bne l3_door_is_open + + jsr draw_door + +l3_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + jsr release_lemming + + ;====================== + ; animate flames + ;====================== + + jsr draw_flames + + jsr update_timer + + ; 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 l3_level_over + + jmp l3_main_loop + + +l3_level_over: + + rts + +.include "update_timer.s" + +.include "hr_graphics/graphics_hr_level3.inc" + + +music11_parts_h: + .byte >lemm11_part1_lzsa,>lemm11_part2_lzsa,>lemm11_part3_lzsa + .byte >lemm11_part4_lzsa,>lemm11_part5_lzsa,>lemm11_part6_lzsa + .byte >lemm11_part7_lzsa + .byte $00 + +music11_parts_l: + .byte hr_level4_preview_lzsa + sta level_preview_h_smc+1 + + lda #level4_intro_text + sta intro_text_smc_h+1 + + lda #$50 ; BCD + sta PERCENT_NEEDED + lda #$10 + sta PERCENT_ADD + + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + ; set up first song + + lda #music17_parts_l + sta chunk_l_smc+2 + + lda #music17_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 #hr_level4_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #hr_level4_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$40 + + jsr decompress_lzsa2_fast + + + ;======================= + ; Setup cursor + ;======================= + + lda #$FF + sta OVER_LEMMING + lda #10 + sta CURSOR_X + lda #100 + sta CURSOR_Y + + + ;======================= + ; init vars + ;======================= + + lda #10 + sta LEMMINGS_TO_RELEASE + + ; set up time + + lda #$5 + sta TIME_MINUTES + lda #$00 + sta TIME_SECONDS + sta TIMER_COUNT ; 1/50 + + jsr init_level + + jsr update_remaining_all + + ;======================= + ; Play "Let's Go" + ;======================= + + jsr play_letsgo + + + ;=================== + ;=================== + ; Main Loop + ;=================== + ;=================== +l4_main_loop: + + ;========================= + ; load next chunk of music + ; if necessary + ;========================= + + jsr load_music + + + +l4_no_load_chunk: + + + lda DOOR_OPEN + bne l4_door_is_open + + jsr draw_door + +l4_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + jsr release_lemming + + ;===================== + ; animate flames + ;===================== + + jsr draw_flames + + jsr update_timer + + ; 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 l4_level_over + + jmp l4_main_loop + + +l4_level_over: + + rts + +.include "update_timer.s" + +.include "hr_graphics/graphics_hr_level4.inc" + + +music17_parts_h: + .byte >lemm17_part1_lzsa,>lemm17_part2_lzsa,>lemm17_part3_lzsa + .byte >lemm17_part4_lzsa,>lemm17_part5_lzsa,>lemm17_part6_lzsa + .byte >lemm17_part7_lzsa,>lemm17_part8_lzsa + .byte $00 + +music17_parts_l: + .byte hr_level5_preview_lzsa + sta level_preview_h_smc+1 + + lda #level5_intro_text + sta intro_text_smc_h+1 + + lda #$20 ; BCD + sta PERCENT_NEEDED + lda #$10 + sta PERCENT_ADD + + + ;============== + ; set up music + ;============== + + lda #0 + sta CURRENT_CHUNK + sta DONE_PLAYING + sta BASE_FRAME_L + sta BUTTON_LOCATION + + ; set up first song + + lda #music5_parts_l + sta chunk_l_smc+2 + + lda #music5_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 #hr_level5_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$20 + + jsr decompress_lzsa2_fast + + lda #hr_level5_lzsa + sta getsrc_smc+2 ; LZSA_SRC_HI + + lda #$40 + + jsr decompress_lzsa2_fast + + + ;======================= + ; Setup cursor + ;======================= + + lda #$FF + sta OVER_LEMMING + lda #20 + sta CURSOR_X + lda #50 + sta CURSOR_Y + + + ;======================= + ; init vars + ;======================= + + lda #10 + sta LEMMINGS_TO_RELEASE + + ; set up time + + lda #$5 + sta TIME_MINUTES + lda #$00 + sta TIME_SECONDS + sta TIMER_COUNT ; 1/50 + + jsr init_level + + jsr update_remaining_all + + ;======================= + ; Play "Let's Go" + ;======================= + + jsr play_letsgo + + + ;=================== + ;=================== + ; Main Loop + ;=================== + ;=================== +l5_main_loop: + + ;========================= + ; load next chunk of music + ; if necessary + ;========================= + + jsr load_music + + + +l5_no_load_chunk: + + + lda DOOR_OPEN + bne l5_door_is_open + + jsr draw_door + +l5_door_is_open: + + ;====================== + ; release lemmings + ;====================== + + jsr release_lemming + + ;===================== + ; animate flames + ;===================== + + jsr draw_flames + + ;===================== + ; draw level animation + ;===================== + + jsr flame_thrower + + ;==================== + ; update timer + ;==================== + + jsr update_timer + + ;==================== + ; 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: + + rts + +.include "update_timer.s" + +.include "hr_graphics/graphics_hr_level5.inc" + + +music5_parts_h: + .byte >lemm5_part1_lzsa,>lemm5_part2_lzsa,>lemm5_part3_lzsa + .byte $00 + +music5_parts_l: + .byte x, savey1->savey2 + + lda #51 + sta SAVED_Y1 + lda #66 + sta SAVED_Y2 + + lda #7 + ldx #15 + + jsr hgr_partial_restore + + ; draw new + + lda FRAMEL + and #$7 + tay + + lda flame_sprites_l,Y + sta INL + lda flame_sprites_h,Y + sta INH + + lda flame_sprites_x,Y + sta XPOS + + lda flame_sprites_y,Y + sta YPOS + + jsr hgr_draw_sprite + + rts + +flame_sprites_l: + .byte flame0_sprite,>flame1_sprite + .byte >flame2_sprite,>flame3_sprite + .byte >flame4_sprite,>flame5_sprite + .byte >flame6_sprite,>flame7_sprite + +flame_sprites_x: +; .byte 16,14 +; .byte 13,13 +; .byte 12,12 +; .byte 10,12 + .byte 12,10 + .byte 9,9 + .byte 8,8 + .byte 6,8 + + +; 15x56 +flame_sprites_y: +; .byte 27,26 +; .byte 24,25 +; .byte 26,23 +; .byte 21,21 + .byte 57,56 + .byte 54,55 + .byte 56,53 + .byte 51,51 + + + diff --git a/games/lemm/hr_music/Makefile b/games/lemm/hr_music/Makefile new file mode 100644 index 00000000..6239b651 --- /dev/null +++ b/games/lemm/hr_music/Makefile @@ -0,0 +1,107 @@ +LZSA = ~/research/lzsa/lzsa/lzsa +YM5_TO_RAW = ~/research/vmw-meter.git/ay-3-8910/conversion_tools/ym5_to_raw +YM_TO_YM5 = ~/research/vmw-meter.git/ay-3-8910/conversion_tools/ym_to_ym5 +RAW_INTERLEAVE = ~/research/vmw-meter.git/ay-3-8910/conversion_tools/raw_interleave + +all: lemm5.part1.lzsa lemm5.part2.lzsa lemm5.part3.lzsa \ + lemm2.part1.lzsa lemm2.part2.lzsa lemm2.part3.lzsa \ + lemm2.part4.lzsa lemm2.part5.lzsa lemm2.part6.lzsa \ + lemm2.part7.lzsa lemm2.part8.lzsa lemm2.part9.lzsa \ + lemm2.part10.lzsa lemm2.part11.lzsa lemm2.part12.lzsa \ + lemm2.part13.lzsa lemm2.part14.lzsa lemm2.part15.lzsa \ + lemm2.part16.lzsa lemm2.part17.lzsa lemm2.part18.lzsa + +lemm5.raw: lemm5.ym + $(YM5_TO_RAW) ./lemm5.ym > lemm5.raw + +lemm2.raw: intro2.ym + $(YM5_TO_RAW) ./intro2.ym > lemm2.raw + +#### + +lemm5.part1: lemm5.raw + $(RAW_INTERLEAVE) -m 11 -c 512 ./lemm5 + +lemm5.part1.lzsa: lemm5.part1 + $(LZSA) -r -f2 lemm5.part1 lemm5.part1.lzsa + +lemm5.part2.lzsa: lemm5.part2 + $(LZSA) -r -f2 lemm5.part2 lemm5.part2.lzsa + +lemm5.part3.lzsa: lemm5.part3 + $(LZSA) -r -f2 lemm5.part3 lemm5.part3.lzsa + +lemm5.part4.lzsa: lemm5.part4 + $(LZSA) -r -f2 lemm5.part4 lemm5.part4.lzsa + +lemm5.part5.lzsa: lemm5.part5 + $(LZSA) -r -f2 lemm5.part5 lemm5.part5.lzsa + +#### + +lemm2.part1: lemm2.raw + $(RAW_INTERLEAVE) -m 11 -c 512 ./lemm2 + +lemm2.part1.lzsa: lemm2.part1 + $(LZSA) -r -f2 lemm2.part1 lemm2.part1.lzsa + +lemm2.part2.lzsa: lemm2.part2 + $(LZSA) -r -f2 lemm2.part2 lemm2.part2.lzsa + +lemm2.part3.lzsa: lemm2.part3 + $(LZSA) -r -f2 lemm2.part3 lemm2.part3.lzsa + +lemm2.part4.lzsa: lemm2.part4 + $(LZSA) -r -f2 lemm2.part4 lemm2.part4.lzsa + +lemm2.part5.lzsa: lemm2.part5 + $(LZSA) -r -f2 lemm2.part5 lemm2.part5.lzsa + +lemm2.part6.lzsa: lemm2.part6 + $(LZSA) -r -f2 lemm2.part6 lemm2.part6.lzsa + +lemm2.part7.lzsa: lemm2.part7 + $(LZSA) -r -f2 lemm2.part7 lemm2.part7.lzsa + +lemm2.part8.lzsa: lemm2.part8 + $(LZSA) -r -f2 lemm2.part8 lemm2.part8.lzsa + +lemm2.part9.lzsa: lemm2.part9 + $(LZSA) -r -f2 lemm2.part9 lemm2.part9.lzsa + +lemm2.part10.lzsa: lemm2.part10 + $(LZSA) -r -f2 lemm2.part10 lemm2.part10.lzsa + +lemm2.part11.lzsa: lemm2.part11 + $(LZSA) -r -f2 lemm2.part11 lemm2.part11.lzsa + +lemm2.part12.lzsa: lemm2.part12 + $(LZSA) -r -f2 lemm2.part12 lemm2.part12.lzsa + +lemm2.part13.lzsa: lemm2.part13 + $(LZSA) -r -f2 lemm2.part13 lemm2.part13.lzsa + +lemm2.part14.lzsa: lemm2.part14 + $(LZSA) -r -f2 lemm2.part14 lemm2.part14.lzsa + +lemm2.part15.lzsa: lemm2.part15 + $(LZSA) -r -f2 lemm2.part15 lemm2.part15.lzsa + +lemm2.part16.lzsa: lemm2.part16 + $(LZSA) -r -f2 lemm2.part16 lemm2.part16.lzsa + +lemm2.part17.lzsa: lemm2.part17 + $(LZSA) -r -f2 lemm2.part17 lemm2.part17.lzsa + +lemm2.part18.lzsa: lemm2.part18 + $(LZSA) -r -f2 lemm2.part18 lemm2.part18.lzsa + + + + + +#### + + +clean: + rm -f *.lzsa *.part1 *.part2 *.part3 *.part4 *.part5 *.part6 *.part7 *.part8 *.part9 *.part10 diff --git a/games/lemm/hr_music/intro2.ym b/games/lemm/hr_music/intro2.ym new file mode 100644 index 00000000..1279d603 Binary files /dev/null and b/games/lemm/hr_music/intro2.ym differ diff --git a/games/lemm/hr_music/lemm5.ym b/games/lemm/hr_music/lemm5.ym new file mode 100644 index 00000000..c230b7d0 Binary files /dev/null and b/games/lemm/hr_music/lemm5.ym differ diff --git a/games/lemm/level2.s b/games/lemm/level2.s index cb67c889..dd98d378 100644 --- a/games/lemm/level2.s +++ b/games/lemm/level2.s @@ -28,7 +28,7 @@ do_level2: lda #3 sta DOOR_X - lda #5 + lda #4 sta DOOR_Y lda #7 diff --git a/games/lemm/particle_hgr.s b/games/lemm/particle_hgr.s index 685279fc..7f4eff85 100644 --- a/games/lemm/particle_hgr.s +++ b/games/lemm/particle_hgr.s @@ -140,7 +140,7 @@ y_good: HPLOT0: ; line from (x,a) to (x+y,a) - ldy #2 + ldy #4 jsr hgr_hlin rts diff --git a/games/lemm/title.s b/games/lemm/title.s index 2625f567..2e6cb9e5 100644 --- a/games/lemm/title.s +++ b/games/lemm/title.s @@ -32,6 +32,30 @@ title_loop: rts +;HR_VERSION = 0 + +; HUGE HACK! THE TITLE TEXTS NEED TO BE IDENTICAL LENGTH +; OR BAD THINGS HAPPEN (offsets wrong) + +.if HR_VERSION = 1 +title_text: +.byte 0, 0,"LOADING LEMM V1.01 (17 APR 2022)",0 +.byte 0, 1," HOMESTAR RUNNER LEVEL PACK ",0 +.byte 0, 3,"BASED ON LEMMINGS BY DMA DESIGN",0 +.byte 0, 5," APPLE II PORT: VINCE WEAVER",0 +.byte 0, 6," DISK : QKUMBA ",0 +.byte 0, 7," LZSA : E. MARTY AUDIO: O. SCHMIDT",0 +.byte 0, 8," ",0 +.byte 0,10,"DIRECTIONS:",0 +.byte 0,11," WASD/ARROWS : MOVE POINTER",0 +.byte 0,12," ENTER/SPACE : ACTION",0 +.byte 0,13," 1...8 : FAST JOB SELECT",0 +.byte 0,14," J,! : ENABLE JOYSTICK,CHEAT",0 +.byte 0,16," ______",0 +.byte 0,17," A \/\/\/ SOFTWARE PRODUCTION",0 +.byte 0,19," HTTP://WWW.DEATER.NET/WEAVE/VMWPROD",0 +.byte 4,21,"PRESS 1-9 TO CHOOSE START LEVEL",0 +.else title_text: .byte 0, 0,"LOADING LEMM V1.01 (13 APR 2022)",0 @@ -50,4 +74,4 @@ title_text: .byte 0,17," A \/\/\/ SOFTWARE PRODUCTION",0 .byte 0,19," HTTP://WWW.DEATER.NET/WEAVE/VMWPROD",0 .byte 4,21,"PRESS 1-9 TO CHOOSE START LEVEL",0 - +.endif