From c5abc3e845eead462884d318b81dceae20eb8627 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Wed, 31 Jul 2019 14:38:15 -0400 Subject: [PATCH] ootw: initial level 4 support, because why not --- ootw/Makefile | 19 ++- ootw/ootw_c4.s | 109 +++++++++++++ ootw/ootw_c4_city.s | 386 ++++++++++++++++++++++++++++++++++++++++++++ ootw/zp.inc | 1 + 4 files changed, 513 insertions(+), 2 deletions(-) create mode 100644 ootw/ootw_c4.s create mode 100644 ootw/ootw_c4_city.s diff --git a/ootw/Makefile b/ootw/Makefile index d9d2a341..aeee40c2 100644 --- a/ootw/Makefile +++ b/ootw/Makefile @@ -7,14 +7,15 @@ PNG2LZ4 = ../gr-utils/png2lz4 all: ootw.dsk -ootw.dsk: HELLO LOADER INTRO OOTW OOTW_C2 OOTW_C3 AUDIO_TEST +ootw.dsk: HELLO LOADER INTRO OOTW OOTW_C2 OOTW_C3 OOTW_C4 $(DOS33) -y ootw.dsk SAVE A HELLO $(DOS33) -y ootw.dsk BSAVE -a 0x1400 LOADER $(DOS33) -y ootw.dsk BSAVE -a 0x1700 INTRO $(DOS33) -y ootw.dsk BSAVE -a 0x1700 OOTW $(DOS33) -y ootw.dsk BSAVE -a 0x1700 OOTW_C2 $(DOS33) -y ootw.dsk BSAVE -a 0x1700 OOTW_C3 - $(DOS33) -y ootw.dsk BSAVE -a 0x1700 AUDIO_TEST + $(DOS33) -y ootw.dsk BSAVE -a 0x1700 OOTW_C4 +# $(DOS33) -y ootw.dsk BSAVE -a 0x1700 AUDIO_TEST # $(DOS33) -y ootw.dsk BSAVE -a 0x2000 COMPRESS-TEST @@ -82,6 +83,20 @@ ootw_c3.o: ootw_c3.s \ ootw_graphics/l3vent/ootw_c3_vent.inc ca65 -o ootw_c3.o ootw_c3.s -l ootw_c3.lst +### + +OOTW_C4: ootw_c4.o + ld65 -o OOTW_C4 ootw_c4.o -C ../linker_scripts/apple2_1700.inc + +ootw_c4.o: ootw_c4.s \ + gr_copy.s gr_copy_offset.s gr_fast_clear.s gr_pageflip.s gr_unrle.s \ + gr_putsprite.s gr_putsprite_flipped.s gr_putsprite_crop.s \ + keyboard.s gr_run_sequence.s physicist.s \ + ootw_graphics/sprites/physicist.inc \ + ootw_graphics/l4city/ootw_c4_city.inc + ca65 -o ootw_c4.o ootw_c4.s -l ootw_c4.lst + + #### AUDIO_TEST: audio.o diff --git a/ootw/ootw_c4.s b/ootw/ootw_c4.s new file mode 100644 index 00000000..a91aa7fa --- /dev/null +++ b/ootw/ootw_c4.s @@ -0,0 +1,109 @@ +; Ootw for Apple II Lores -- Checkpoint4 (the City) + +; by Vince "Deater" Weaver + +.include "zp.inc" +.include "hardware.inc" + + + +ootw_c4: + + ; Initialize some variables + + ;======================= + ; Run the "intro" + ;======================= + ; just us falling? + +ootw_c4_restart: +; jsr ootw_c2_intro + + + jsr ootw_city_init + + ;========================= + ; c4_new_room + ;========================= + ; enter new room on level4 + +c4_new_room: + lda #0 + sta GAME_OVER + + jsr ootw_city + +c4_check_done: + lda GAME_OVER + cmp #$ff + beq quit_level + + ; only exit if done level + ; FIXME: or quit pressed? + + lda WHICH_JAIL + cmp #11 + bne c4_new_room + + +;=========================== +; quit_level +;=========================== + +quit_level: + jsr TEXT + jsr HOME + lda KEYRESET ; clear strobe + + lda #0 + sta DRAW_PAGE + + lda #end_message + sta OUTH + + jsr move_and_print + jsr move_and_print + +wait_loop: + lda KEYPRESS + bpl wait_loop + + lda KEYRESET ; clear strobe + + lda #0 + sta GAME_OVER + + jmp ootw_c4_restart + + +end_message: +.byte 8,10,"PRESS RETURN TO CONTINUE",0 +.byte 11,20,"ACCESS CODE: RCHG",0 + +.include "ootw_c4_city.s" +.include "text_print.s" +.include "gr_pageflip.s" +.include "gr_unrle.s" +.include "gr_fast_clear.s" +.include "gr_copy.s" +.include "gr_copy_offset.s" +.include "gr_putsprite.s" +.include "gr_putsprite_flipped.s" +.include "gr_putsprite_crop.s" +.include "gr_offsets.s" +.include "gr_offsets_hl.s" +.include "random16.s" +.include "keyboard.s" + +.include "physicist.s" +.include "alien.s" + +; room backgrounds +.include "ootw_graphics/l4city/ootw_c4_city.inc" +; sprites +.include "ootw_graphics/sprites/physicist.inc" +.include "ootw_graphics/sprites/alien.inc" + + diff --git a/ootw/ootw_c4_city.s b/ootw/ootw_c4_city.s new file mode 100644 index 00000000..1e5933bb --- /dev/null +++ b/ootw/ootw_c4_city.s @@ -0,0 +1,386 @@ +; Ootw Checkpoint4 -- Running around the City + + + ; call once before entering city for first time +ootw_city_init: + lda #0 + sta PHYSICIST_STATE + sta WHICH_ROOM + sta DIRECTION ; left + + lda #1 + sta HAVE_GUN + + lda #28 + sta PHYSICIST_X + lda #30 + sta PHYSICIST_Y + + rts + + + ;=========================== + ; enter new room in jail + ;=========================== + +ootw_city: + + ;============================== + ; each room init + +; lda #0 +; sta ON_ELEVATOR +; sta TELEPORTING + + ;============================== + ; setup per-room variables + + lda WHICH_ROOM + bne room1 + + ; Room0 with recharger +room0: + lda #(24+128) + sta LEFT_LIMIT + lda #(39+128) + sta RIGHT_LIMIT + + ; set right exit + lda #1 + sta cer_smc+1 + + ; set left exit + lda #0 + sta cel_smc+1 + + lda #30 + sta PHYSICIST_Y + + ; load background + lda #>(recharge_rle) + sta GBASH + lda #<(recharge_rle) + + jmp room_setup_done + + ; hallway with weird ceiling +room1: + cmp #1 + bne room2 + + lda #(-4+128) + sta LEFT_LIMIT + lda #(39+128) + sta RIGHT_LIMIT + + ; set right exit + lda #2 + sta cer_smc+1 + + ; set left exit + lda #0 + sta cel_smc+1 + + lda #30 + sta PHYSICIST_Y + + ; load background + lda #>(hallway_rle) + sta GBASH + lda #<(hallway_rle) + + jmp room_setup_done + + ; causeway part 1 +room2: + cmp #2 + bne room3 + + lda #(-4+128) + sta LEFT_LIMIT + lda #(39+128) + sta RIGHT_LIMIT + + ; set right exit + lda #3 + sta cer_smc+1 + + ; set left exit + lda #1 + sta cel_smc+1 + + ; load background + lda #>(causeway1_rle) + sta GBASH + lda #<(causeway1_rle) + + jmp room_setup_done + + ; causeway part 2 +room3: + cmp #3 + bne room4 + + lda #(-4+128) + sta LEFT_LIMIT + lda #(39+128) + sta RIGHT_LIMIT + + ; set right exit + lda #7 + sta cer_smc+1 + + ; set left exit + lda #2 + sta cel_smc+1 + + lda #30 + sta PHYSICIST_Y + +; ; load background +; lda #>(jail4_rle) +; sta GBASH +; lda #<(jail4_rle) + + jmp room_setup_done + + ; down at the bottom +room4: +; cmp #4 +; bne jail5 + + + lda #(17+128) + sta LEFT_LIMIT + lda #(39+128) + sta RIGHT_LIMIT + + ; set right exit + lda #9 + sta cer_smc+1 + + lda #20 + sta PHYSICIST_Y + + ; load background +; lda #>(room_b2_rle) +; sta GBASH +; lda #<(room_b2_rle) + + jmp room_setup_done + + +room_setup_done: + + sta GBASL + lda #$c ; load to page $c00 + jsr load_rle_gr ; tail call + + +ootw_room_already_set: + ;=========================== + ; Enable graphics + + bit LORES + bit SET_GR + bit FULLGR + + ;=========================== + ; Setup pages (is this necessary?) + + lda #0 + sta DRAW_PAGE + lda #1 + sta DISP_PAGE + + ;================================= + ; setup vars + + lda #0 + sta GAIT + sta GAME_OVER + + ;============================ + ;============================ + ; City Loop + ;============================ + ;============================ +city_loop: + + ;================================ + ; copy background to current page + + jsr gr_copy_to_current + + ;================================== + ; draw background action + + lda WHICH_JAIL + +bg_room0: + ; Room #0, draw pulsing recharger + +; cmp #0 +; bne bg_jail6 +; jsr ootw_draw_miners + +c4_no_bg_action: + + ;=============================== + ; check keyboard + + jsr handle_keypress + + ;=============================== + ; move physicist + ;=============================== + + jsr move_physicist + + ;=============================== + ; move friend + ;=============================== + +; jsr move_friend + + + ;=============== + ; check room limits + + jsr check_screen_limit + + + ;=============== + ; draw physicist + + jsr draw_physicist + + ;=============== + ; draw friend + +; jsr draw_friend + +c4_done_draw_friend: + + + ;======================== + ; draw foreground action + + lda WHICH_ROOM + cmp #2 + bne c4_no_fg_action + +;c2_draw_cart: +; +; lda CART_X +; sta XPOS +; lda #36 +; sta YPOS +; lda #cart_sprite +; sta INH +; jsr put_sprite_crop +; jmp c2_no_fg_action + +c4_no_fg_action: + + ;==================== + ; activate fg objects + ;==================== +;c2_fg_check_jail1: +; lda WHICH_JAIL +; cmp #1 +; bne c2_fg_check_jail2 +; +; lda CART_OUT +; bne c2_fg_check_jail2 +; +; inc CART_OUT + + + ;================ + ; move fg objects + ;================ +c4_move_fg_objects: + +; lda CART_OUT +; cmp #1 +; bne cart_not_out + + ; move cart + +; lda FRAMEL +; and #$3 +; bne cart_not_out +; +; inc CART_X +; lda CART_X +; cmp #39 +; bne cart_not_out +; inc CART_OUT + + + ;=============== + ; page flip + + jsr page_flip + + ;================ + ; inc frame count + + inc FRAMEL + bne city_frame_no_oflo + inc FRAMEH +city_frame_no_oflo: + + ;========================== + ; check if done this level + ;========================== + + lda GAME_OVER + beq still_in_city + + cmp #$ff ; if $ff, we died + beq done_city + + ;=============================== + ; check if exited room to right + cmp #1 + beq city_exit_left + + ;================= + ; exit to right + +city_right_yes_exit: + + lda #0 + sta PHYSICIST_X +cer_smc: + lda #$0 ; smc+1 = exit location + sta WHICH_CAVE + jmp done_city + + ;===================== + ; exit to left + +city_exit_left: + + lda #37 + sta PHYSICIST_X +cel_smc: + lda #0 ; smc+1 + sta WHICH_CAVE + jmp done_city + + ; loop forever +still_in_city: + lda #0 + sta GAME_OVER + + jmp city_loop + +done_city: + rts + + diff --git a/ootw/zp.inc b/ootw/zp.inc index 5c570e97..bb3a1cd4 100644 --- a/ootw/zp.inc +++ b/ootw/zp.inc @@ -135,6 +135,7 @@ TELEPORTING = $E2 ; C2 jail WHICH_CAVE = $E3 ; C1 WHICH_JAIL = $E3 ; C2 +WHICH_ROOM = $E3 ; C4 MONSTER_GRAB = $E4 ; C1 underwater BEAST_OUT = $E4 ; C1