From bee32d7ab16d4225b297421bd2a742dba6c2955e Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 14 Aug 2023 01:40:08 -0400 Subject: [PATCH] sb: work on cliff --- games/sb/Makefile | 23 +- games/sb/cliff.s | 74 ---- games/sb/cliff/Makefile | 30 ++ games/sb/cliff/cliff.s | 161 ++++++++ games/sb/cliff/cliff_graphics/Makefile | 51 +++ .../{ => cliff}/cliff_graphics/cliff_base.png | Bin .../cliff_graphics/cliff_base_priority.png | Bin 0 -> 973 bytes .../cliff/cliff_graphics/peasant_sprites.png | Bin 0 -> 19248 bytes games/sb/cliff/draw_peasant.s | 116 ++++++ games/sb/cliff/gr_copy.s | 39 ++ games/sb/cliff/gr_offsets.s | 5 + games/sb/cliff/hardware.inc | 105 ++++++ games/sb/cliff/hgr_1x28_sprite_mask.s | 309 ++++++++++++++++ games/sb/cliff/hgr_copy.s | 40 ++ games/sb/cliff/hgr_partial_save.s | 89 +++++ games/sb/cliff/keyboard.s | 152 ++++++++ games/sb/cliff/move_peasant.s | 253 +++++++++++++ games/sb/cliff/wait.s | 18 + games/sb/cliff/zp.inc | 348 ++++++++++++++++++ games/sb/cliff_graphics/Makefile | 27 -- 20 files changed, 1729 insertions(+), 111 deletions(-) delete mode 100644 games/sb/cliff.s create mode 100644 games/sb/cliff/Makefile create mode 100644 games/sb/cliff/cliff.s create mode 100644 games/sb/cliff/cliff_graphics/Makefile rename games/sb/{ => cliff}/cliff_graphics/cliff_base.png (100%) create mode 100644 games/sb/cliff/cliff_graphics/cliff_base_priority.png create mode 100644 games/sb/cliff/cliff_graphics/peasant_sprites.png create mode 100644 games/sb/cliff/draw_peasant.s create mode 100644 games/sb/cliff/gr_copy.s create mode 100644 games/sb/cliff/gr_offsets.s create mode 100644 games/sb/cliff/hardware.inc create mode 100644 games/sb/cliff/hgr_1x28_sprite_mask.s create mode 100644 games/sb/cliff/hgr_copy.s create mode 100644 games/sb/cliff/hgr_partial_save.s create mode 100644 games/sb/cliff/keyboard.s create mode 100644 games/sb/cliff/move_peasant.s create mode 100644 games/sb/cliff/wait.s create mode 100644 games/sb/cliff/zp.inc delete mode 100644 games/sb/cliff_graphics/Makefile diff --git a/games/sb/Makefile b/games/sb/Makefile index b2f7d6d3..ec925014 100644 --- a/games/sb/Makefile +++ b/games/sb/Makefile @@ -12,7 +12,7 @@ all: sb.dsk #### -sb.dsk: QBOOT QLOAD TITLE DUCK_POND ROOF ASPLODE BACK_OFF TARGET CLIFF RAT +sb.dsk: QBOOT QLOAD TITLE DUCK_POND ROOF ASPLODE BACK_OFF TARGET ./cliff/CLIFF RAT cp $(EMPTY_DISK) sb.dsk $(DOS33_RAW) sb.dsk 0 0 QBOOT 0 1 $(DOS33_RAW) sb.dsk 0 2 QBOOT 1 1 @@ -23,7 +23,7 @@ sb.dsk: QBOOT QLOAD TITLE DUCK_POND ROOF ASPLODE BACK_OFF TARGET CLIFF RAT $(DOS33_RAW) sb.dsk 10 0 ROOF 0 0 $(DOS33_RAW) sb.dsk 15 0 ASPLODE 0 0 $(DOS33_RAW) sb.dsk 20 0 TARGET 0 0 - $(DOS33_RAW) sb.dsk 25 0 CLIFF 0 0 + $(DOS33_RAW) sb.dsk 25 0 ./cliff/CLIFF 0 0 $(DOS33_RAW) sb.dsk 30 0 RAT 0 0 $(DOS33_RAW) sb.dsk 32 0 BACK_OFF 0 0 @@ -97,16 +97,19 @@ back_off.o: back_off.s zx02_optim.s \ #### -CLIFF: cliff.o - ld65 -o CLIFF cliff.o -C $(LINKER_SCRIPTS)/apple2_6000.inc +./cliff/CLIFF: + cd cliff && make -cliff.o: cliff.s zx02_optim.s \ - cliff_graphics/cliff_base.hgr.zx02 \ - zp.inc hardware.inc - ca65 -o cliff.o cliff.s -l cliff.lst +#CLIFF: cliff.o +# ld65 -o CLIFF cliff.o -C $(LINKER_SCRIPTS)/apple2_6000.inc -cliff_graphics/cliff_base.hgr.zx02: - cd cliff_graphics && make +#cliff.o: cliff.s zx02_optim.s \ +# cliff_graphics/cliff_base.hgr.zx02 \ +# zp.inc hardware.inc +# ca65 -o cliff.o cliff.s -l cliff.lst + +#cliff_graphics/cliff_base.hgr.zx02: +# cd cliff_graphics && make #### diff --git a/games/sb/cliff.s b/games/sb/cliff.s deleted file mode 100644 index 78330f69..00000000 --- a/games/sb/cliff.s +++ /dev/null @@ -1,74 +0,0 @@ -; Cliff climb minigame from Peasant's Quest -; -; Yet Another HR project -; -; by deater (Vince Weaver) - - -.include "zp.inc" -.include "hardware.inc" - - -hires_start: - - ;=================== - ; set graphics mode - ;=================== - jsr HOME - - bit HIRES - bit FULLGR - bit SET_GR - bit PAGE1 - - - ;=================== - ; Load graphics - ;=================== -load_loop: - - ;============================= - - - ;========================== - ; Load Image - ;=========================== - -load_image: - - ; size in ldsizeh:ldsizel (f1/f0) - - lda #comp_data - sta ZX0_src+1 - - - lda #$20 - - - jsr full_decomp - -; rts - - - -wait_until_keypress: - lda KEYPRESS ; 4 - bpl wait_until_keypress ; 3 - bit KEYRESET ; clear the keyboard buffer - -which_ok: - lda #0 - sta WHICH_LOAD - rts - - - - - - .include "zx02_optim.s" - - -comp_data: - .incbin "cliff_graphics/cliff_base.hgr.zx02" diff --git a/games/sb/cliff/Makefile b/games/sb/cliff/Makefile new file mode 100644 index 00000000..a976be59 --- /dev/null +++ b/games/sb/cliff/Makefile @@ -0,0 +1,30 @@ +include ../../../Makefile.inc + +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 +PNG_TO_HGR = ../../utils/hgr-utils/png2hgr +LINKER_SCRIPTS = ../../../linker_scripts +DOS33 = ../../utils/dos33fs-utils/dos33 +DOS33_RAW = ../../utils/dos33fs-utils/dos33_raw +EMPTY_DISK = ../../empty_disk/empty.dsk +TOKENIZE = ../../utils/asoft_basic-utils/tokenize_asoft + +all: CLIFF + +#### + +CLIFF: cliff.o + ld65 -o CLIFF cliff.o -C $(LINKER_SCRIPTS)/apple2_6000.inc + +cliff.o: cliff.s ../zx02_optim.s \ + cliff_graphics/cliff_base.hgr.zx02 \ + zp.inc hardware.inc + ca65 -o cliff.o cliff.s -l cliff.lst + +cliff_graphics/cliff_base.hgr.zx02: + cd cliff_graphics && make + +#### + +clean: + rm -f *.lst *.o CLIFF + cd cliff_graphics && make clean diff --git a/games/sb/cliff/cliff.s b/games/sb/cliff/cliff.s new file mode 100644 index 00000000..940ee6bf --- /dev/null +++ b/games/sb/cliff/cliff.s @@ -0,0 +1,161 @@ +; Cliff climb minigame from Peasant's Quest +; +; Yet Another HR project +; +; by deater (Vince Weaver) + + +.include "zp.inc" +.include "hardware.inc" + +;div7_table = $400 +;mod7_table = $500 +;hposn_high = $600 +;hposn_low = $700 + +div7_table = $b800 +mod7_table = $b900 +hposn_high = $ba00 +hposn_low = $bb00 + +cliff_base: + + ;=================== + ; set graphics mode + ;=================== + jsr HOME + + bit HIRES + bit FULLGR + bit SET_GR + bit PAGE1 + + lda #0 + sta LEVEL_OVER + sta FRAME + + lda #10 + sta PEASANT_X + lda #100 + sta PEASANT_Y + + jsr hgr_make_tables + + + ;=================== + ; Load graphics + ;=================== + + lda #priority_data + sta ZX0_src+1 + + lda #$20 ; temporarily load to $2000 + + jsr full_decomp + + ; copy to $400 + + jsr gr_copy_to_page1 + + + + ;============================= + + + ;========================== + ; Load Image + ;=========================== + +load_image: + + ; size in ldsizeh:ldsizel (f1/f0) + + lda #bg_data + sta ZX0_src+1 + + + lda #$20 + + jsr full_decomp + + jsr hgr_copy + + + + ;========================== + ;========================== + ; main loop + ;========================== + ;========================== +game_loop: + + ;===================== + ; move peasant + + jsr move_peasant + + ;===================== + ; draw peasant + + jsr draw_peasant + + ;===================== + ; increment frame + + inc FRAME + + ;===================== + ; check keyboard + + jsr check_keyboard + + lda LEVEL_OVER + bne done_cliff + + ; delay + + lda #200 + jsr wait + + jmp game_loop + + +done_cliff: + lda #0 + sta WHICH_LOAD + rts + + + .include "../hgr_tables.s" + + .include "../zx02_optim.s" + + .include "wait.s" + + .include "keyboard.s" + + .include "draw_peasant.s" + + .include "move_peasant.s" + + .include "hgr_partial_save.s" + + .include "hgr_1x28_sprite_mask.s" + + .include "gr_copy.s" + .include "hgr_copy.s" + + .include "cliff_graphics/peasant_robe_sprites.inc" + +bg_data: + .incbin "cliff_graphics/cliff_base.hgr.zx02" + +priority_data: + + .incbin "cliff_graphics/cliff_base_priority.zx02" + + diff --git a/games/sb/cliff/cliff_graphics/Makefile b/games/sb/cliff/cliff_graphics/Makefile new file mode 100644 index 00000000..edee7e70 --- /dev/null +++ b/games/sb/cliff/cliff_graphics/Makefile @@ -0,0 +1,51 @@ +include ../../../../Makefile.inc + +ZX02 = ~/research/6502_compression/zx02.git/build/zx02 -f +PNG_TO_HGR = ../../../../utils/hgr-utils/png2hgr +PNG2GR = ../../../../utils/gr-utils/png2gr +PNG2SPRITES = ../../../../utils/gr-utils/png2sprites +HGR_SPRITE = ../../../../utils/hgr-utils/hgr_make_sprite + +all: cliff_base.hgr.zx02 peasant_robe_sprites.inc \ + cliff_base_priority.zx02 + +#### + +peasant_robe_sprites.inc: peasant_sprites.png + $(HGR_SPRITE) -l peasant_right1_sprite peasant_sprites.png 133 1 133 29 > peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_right1_mask peasant_sprites.png 119 1 119 29 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_right2_sprite peasant_sprites.png 133 34 133 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_right2_mask peasant_sprites.png 119 34 119 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up1_sprite peasant_sprites.png 133 68 133 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up1_mask peasant_sprites.png 119 68 119 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up2_sprite peasant_sprites.png 133 102 133 130 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_up2_mask peasant_sprites.png 119 102 119 130 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left1_sprite peasant_sprites.png 182 1 188 29 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left1_mask peasant_sprites.png 168 1 174 29 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left2_sprite peasant_sprites.png 182 34 188 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_left2_mask peasant_sprites.png 168 34 174 62 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down1_sprite peasant_sprites.png 182 68 188 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down1_mask peasant_sprites.png 168 68 174 96 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down2_sprite peasant_sprites.png 182 102 188 130 >> peasant_robe_sprites.inc + $(HGR_SPRITE) -l peasant_down2_mask peasant_sprites.png 168 102 174 130 >> peasant_robe_sprites.inc + +#### + +cliff_base.hgr.zx02: cliff_base.hgr + $(ZX02) cliff_base.hgr cliff_base.hgr.zx02 + +cliff_base.hgr: cliff_base.png + $(PNG_TO_HGR) cliff_base.png > cliff_base.hgr + +#### + +cliff_base_priority.zx02: cliff_base_priority.gr + $(ZX02) -f cliff_base_priority.gr cliff_base_priority.zx02 + +cliff_base_priority.gr: cliff_base_priority.png + $(PNG2GR) cliff_base_priority.png cliff_base_priority.gr + +#### + +clean: + rm -f *~ *.o *.zx02 *.lst peasant_robe_sprites.inc diff --git a/games/sb/cliff_graphics/cliff_base.png b/games/sb/cliff/cliff_graphics/cliff_base.png similarity index 100% rename from games/sb/cliff_graphics/cliff_base.png rename to games/sb/cliff/cliff_graphics/cliff_base.png diff --git a/games/sb/cliff/cliff_graphics/cliff_base_priority.png b/games/sb/cliff/cliff_graphics/cliff_base_priority.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbd87f0ea697e815b95fd637f69a9ef37e0be3e GIT binary patch literal 973 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 + jmp done_pick_draw + +peasant_up1: + lda #peasant_up1_sprite + jmp done_pick_draw + + ;===================== + ; down down down +peasant_down: + + lda PEASANT_Y + and #4 + beq peasant_down1 + +peasant_down2: + lda #peasant_down2_sprite + jmp done_pick_draw + +peasant_down1: + lda #peasant_down1_sprite + jmp done_pick_draw + + ;===================== + ; left left left + +peasant_left: + lda CURSOR_X + and #1 + bne draw_left1 + +draw_left2: + lda #peasant_left2_sprite + jmp done_pick_draw + +draw_left1: + lda #peasant_left1_sprite + jmp done_pick_draw + + +peasant_right: + lda CURSOR_X + and #1 + bne draw_right1 + +draw_right2: + lda #peasant_right2_sprite + jmp done_pick_draw + +draw_right1: + lda #peasant_right1_sprite + +done_pick_draw: + sta INH + + jsr hgr_draw_sprite_1x28 + +done_draw_peasant: + + rts + + +;.include "sprites/peasant_sprites.inc" +;.include "sprites/peasant_robe_sprites.inc" diff --git a/games/sb/cliff/gr_copy.s b/games/sb/cliff/gr_copy.s new file mode 100644 index 00000000..ddb537f0 --- /dev/null +++ b/games/sb/cliff/gr_copy.s @@ -0,0 +1,39 @@ + ;========================================================= + ; gr_copy_to_page1, 40x48 version + ;========================================================= + ; copy $2000 to $400, careful to avoid screen holes + +gr_copy_to_page1: + + ldy #119 ; for early ones, copy 120 bytes ; 2 + +gr_copy_line: + lda $2000,Y ; load a byte (self modified) ; 4 + sta $400,Y ; store a byte (self modified) ; 5 + + lda $2080,Y ; load a byte (self modified) ; 4 + sta $480,Y ; store a byte (self modified) ; 5 + + lda $2100,Y ; load a byte (self modified) ; 4 + sta $500,Y ; store a byte (self modified) ; 5 + + lda $2180,Y ; load a byte (self modified) ; 4 + sta $580,Y ; store a byte (self modified) ; 5 + + lda $2200,Y ; load a byte (self modified) ; 4 + sta $600,Y ; store a byte (self modified) ; 5 + + lda $2280,Y ; load a byte (self modified) ; 4 + sta $680,Y ; store a byte (self modified) ; 5 + + lda $2300,Y ; load a byte (self modified) ; 4 + sta $700,Y ; store a byte (self modified) ; 5 + + lda $2380,Y ; load a byte (self modified) ; 4 + sta $780,Y ; store a byte (self modified) ; 5 + + dey ; decrement pointer ; 2 + bpl gr_copy_line ; ; 2nt/3 + + rts ; 6 + diff --git a/games/sb/cliff/gr_offsets.s b/games/sb/cliff/gr_offsets.s new file mode 100644 index 00000000..d3af91f7 --- /dev/null +++ b/games/sb/cliff/gr_offsets.s @@ -0,0 +1,5 @@ +gr_offsets: + .word $400,$480,$500,$580,$600,$680,$700,$780 + .word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8 + .word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0 + diff --git a/games/sb/cliff/hardware.inc b/games/sb/cliff/hardware.inc new file mode 100644 index 00000000..97d6d13b --- /dev/null +++ b/games/sb/cliff/hardware.inc @@ -0,0 +1,105 @@ +; HARDWARE LOCATIONS + +KEYPRESS = $C000 +KEYRESET = $C010 + +; SOFT SWITCHES +CLR80COL = $C000 ; PAGE1/PAGE1 normal +SET80COL = $C001 ; PAGE1/PAGE2 switches PAGE1 in Aux instead +EIGHTYCOLOFF = $C00C +EIGHTYCOLON = $C00D +TBCOLOR = $C022 ; IIgs text foreground / background colors +NEWVIDEO = $C029 ; IIgs graphics modes +SPEAKER = $C030 +CLOCKCTL = $C034 ; bits 0-3 are IIgs border color +SET_GR = $C050 +SET_TEXT = $C051 +FULLGR = $C052 +TEXTGR = $C053 +PAGE1 = $C054 +PAGE2 = $C055 +LORES = $C056 ; Enable LORES graphics +HIRES = $C057 ; Enable HIRES graphics +AN3 = $C05E ; Annunciator 3 + +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +LCBANK2 = $C083 +LCBANK1 = $C08B + +; APPLESOFT BASIC ROUTINES + +;NORMAL = $F273 +;HGR2 = $F3D8 +;HGR = $F3E2 +;BKGND0 = $F3F4 ; clear current page to A +;HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y) +HPLOT0 = $F457 ; plot at (Y,X), (A) +;COLOR_SHIFT = $F47E +;HLINRL = $F530 ; (X,A),(Y) +;HGLIN = $F53A ; line to (X,A),(Y) +;COLORTBL = $F6F6 + + +; MONITOR ROUTINES + +;HLINE = $F819 ; HLINE Y,$2C at A +;VLINE = $F828 ; VLINE A,$2D at Y +;CLRSCR = $F832 ; Clear low-res screen +;CLRTOP = $F836 ; clear only top of low-res screen +;SETCOL = $F864 ; COLOR=A +;ROM_TEXT2COPY = $F962 ; iigs +TEXT = $FB36 ; qboot +;TABV = $FB5B ; VTAB to A +ROM_MACHINEID = $FBB3 ; iigs +;BELL = $FBDD ; ring the bell +;BASCALC = $FBC1 ; +;VTAB = $FC22 ; VTAB to CV +HOME = $FC58 ; Clear the text screen ; qboot +;WAIT = $FCA8 ; delay 1/2(26+27A+5A^2) us +;CROUT1 = $FD8B +;SETINV = $FE80 ; INVERSE +;SETNORM = $FE84 ; NORMAL +COUT = $FDED ; output A to screen ; qboot +COUT1 = $FDF0 ; output A to screen ; qload + + + + + + + +COLOR_BLACK = 0 +COLOR_RED = 1 +COLOR_DARKBLUE = 2 +COLOR_PURPLE = 3 +COLOR_DARKGREEN = 4 +COLOR_GREY = 5 +COLOR_MEDIUMBLUE = 6 +COLOR_LIGHTBLUE = 7 +COLOR_BROWN = 8 +COLOR_ORANGE = 9 +COLOR_GREY2 = 10 +COLOR_PINK = 11 +COLOR_LIGHTGREEN = 12 +COLOR_YELLOW = 13 +COLOR_AQUA = 14 +COLOR_WHITE = 15 + +COLOR_BOTH_BLACK = $00 +COLOR_BOTH_RED = $11 +COLOR_BOTH_DARKBLUE = $22 +COLOR_BOTH_DARKGREEN = $44 +COLOR_BOTH_GREY = $55 +COLOR_BOTH_MEDIUMBLUE = $66 +COLOR_BOTH_LIGHTBLUE = $77 +COLOR_BOTH_BROWN = $88 +COLOR_BOTH_ORANGE = $99 +COLOR_BOTH_PINK = $BB +COLOR_BOTH_LIGHTGREEN = $CC +COLOR_BOTH_YELLOW = $DD +COLOR_BOTH_AQUA = $EE +COLOR_BOTH_WHITE = $FF + diff --git a/games/sb/cliff/hgr_1x28_sprite_mask.s b/games/sb/cliff/hgr_1x28_sprite_mask.s new file mode 100644 index 00000000..35312f6f --- /dev/null +++ b/games/sb/cliff/hgr_1x28_sprite_mask.s @@ -0,0 +1,309 @@ + ;=============================================== + ; hgr 1x28 draw sprite, with bg mask in GR $400 + ;=============================================== + ; used primarily to draw Rather Dashing + ;=============================================== + ; + ; SPRITE in INL/INH + ; Location at CURSOR_X CURSOR_Y + + ; for now, BG mask is only all or nothing + ; so we just skip drawing if behind + + ; sprite AT INL/INH + ; mask at INL/INH + 28 + +hgr_draw_sprite_1x28: + + lda #0 + sta MASK_COUNTDOWN + + ; calculate peasant priority + ; based on head + + lda PEASANT_Y + sec + sbc #48 ; Y=48 + lsr ; div by 8 + lsr + lsr + clc + adc #2 + sta PEASANT_PRIORITY + + ; set up sprite pointers + lda INL + sta h728_smc1+1 + lda INH + sta h728_smc1+2 + + ; set up mask pointers + clc + lda INL + adc #28 + sta h728_smc3+1 + lda INH + adc #0 + sta h728_smc3+2 + + ldx #0 ; X is row counter +hgr_1x28_sprite_yloop: + lda MASK_COUNTDOWN + and #$3 ; only update every 4th + bne mask_good + + txa + pha ; save X + + ; recalculate mask + txa + clc + adc CURSOR_Y + tax + ldy CURSOR_X + jsr update_bg_mask + + + pla ; restore X + tax + +mask_good: + lda MASK + bne draw_sprite_skip + + + txa ; X is current row + + clc + adc CURSOR_Y ; add in cursor_y + + ; calc GBASL/GBASH + + tay ; get output ROW into GBASL/H + lda hposn_low,Y + sta GBASL + lda hposn_high,Y + sta GBASH + + ldy CURSOR_X + + lda (GBASL),Y ; load background +h728_smc3: + and $d000,X ; mask with sprite mask +h728_smc1: + ora $d000,X ; or in sprite + sta (GBASL),Y ; store out + + +draw_sprite_skip: + + inc MASK_COUNTDOWN + + inx + cpx #28 + bne hgr_1x28_sprite_yloop + + rts + +.if 0 + ;====================== + ; save bg 1x28 + ;====================== + +bsave_bg_1x28: + + ldx #0 +save_yloop: + txa + pha + + clc + adc CURSOR_Y + + + ; calc GBASL/GBASH + + tax + lda hposn_low,X + sta GBASL + lda hposn_high,X + sta GBASH + + pla + tax + + ldy CURSOR_X + + lda (GBASL),Y + sta save_sprite_1x28,X + + inx + cpx #28 + bne save_yloop + + rts +.endif + + ;====================== + ; restore bg 1x28 + ;====================== + +restore_bg_1x28: + + ; restore bg behind peasant + + ; is this actually faster than using the generic version? + + ldy CURSOR_Y ; y start point + + ldx #27 ; height + +restore_yloop: + ; calc GBASL/GBASH using lookup table + + clc + lda hposn_low,Y + adc PEASANT_X + sta restore_page1_smc+1 + sta restore_page2_smc+1 + + ; $40 -> $20 0100 0000 -> 0010 0000 + ; $41 -> $21 0100 0001 -> 0010 0001 + ; $51 -> $31 0101 0011 -> 0101 0001 + + lda hposn_high,Y + sta restore_page2_smc+2 + eor #$60 + sta restore_page1_smc+2 + +restore_page1_smc: + lda $DDDD +restore_page2_smc: + sta $DDDD + + iny + + dex + bpl restore_yloop + + rts + + + ;=================== + ; update_bg_mask + ;=================== + ; newx/7 in Y + ; newy in X + ; updates MASK +update_bg_mask: + + ; rrrr rtii top 5 bits row, bit 2 top/bottom + + sty xsave +mask_try_again: + stx ysave + + txa + and #$04 ; see if odd/even + beq bg_mask_even + +bg_mask_odd: + lda #$f0 + bne bg_mask_mask ; bra + +bg_mask_even: + lda #$0f +bg_mask_mask: + + sta MASK + + txa + lsr + lsr ; need to divide by 8 then * 2 + lsr ; can't just div by 4 as we need to mask bottom bit + asl + tax + + lda gr_offsets,X + sta BASL + lda gr_offsets+1,X + sta BASH + + lda (BASL),Y + + ldy MASK + cpy #$f0 + bne mask_bottom +mask_top: + lsr + lsr + lsr + lsr + jmp mask_mask_mask +mask_bottom: + and #$0f +mask_mask_mask: + sta MASK + + cmp #$0 ; 0 means collision, find mask + bne mask_not_zero ; by iteratively going down till + ldx ysave ; non-zero + ldy xsave + inx + inx + inx + inx + jmp mask_try_again + +mask_not_zero: + cmp #$f ; priority F means always on top + beq mask_true + + cmp PEASANT_PRIORITY + beq mask_false ; branch less than equal + bcc mask_false ; blt + +mask_true: + lda #$ff + sta MASK + rts + +mask_false: + lda #$00 + sta MASK + rts + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; priorities +; 0 = collision +; 1 = bg = always draw ; Y-48 +; 2 0-55 +; 3 56-63 ; 8/8+2 = 3 +; 4 64-71 ; 16/8+2 = 4 +; 5 72-79 +; 6 80-87 ; 32/8+2 = 6 +; 7 88-95 +; 8 96-103 +; 9 104-111 +; 10 112-119 +; 11 120-127 +; 12 128-135 ; 8 +; 13 136-143 +; 14 144-151 +; 15 = fg = always hide +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;==================== +; save area +;==================== + +;save_sprite_1x28: +;.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 +;.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + +ysave: +.byte $00 +xsave: +.byte $00 diff --git a/games/sb/cliff/hgr_copy.s b/games/sb/cliff/hgr_copy.s new file mode 100644 index 00000000..c44c0d02 --- /dev/null +++ b/games/sb/cliff/hgr_copy.s @@ -0,0 +1,40 @@ + ;========================================================= + ; hgr copy from $2000 to $4000 + ;========================================================= + ; copy $2000 to $4000 + + ; intentionally slow for the miniblind effect + +hgr_copy: + lda #0 ; blurgh + sta INL + sta OUTL + + lda #$20 + sta INH + lda #$40 + sta OUTH + + + ldy #0 +hgr_copy_outer: + +hgr_copy_inner: + lda #1 + jsr wait + + lda (INL),Y + sta (OUTL),Y + iny + bne hgr_copy_inner + + inc INH + inc OUTH + lda OUTH + cmp #$60 + bne hgr_copy_outer + + rts + + + diff --git a/games/sb/cliff/hgr_partial_save.s b/games/sb/cliff/hgr_partial_save.s new file mode 100644 index 00000000..7c983c2d --- /dev/null +++ b/games/sb/cliff/hgr_partial_save.s @@ -0,0 +1,89 @@ + ;======================= + ; HGR Partial Save + ;======================= + ; loads from $40 + ; save to $20 + ; only save from row in P2 to P2+P4 +.if 0 +hgr_partial_save: + + clc + lda BOX_Y1 + sta SAVED_Y1 + + ldx BOX_Y2 + stx SAVED_Y2 + +partial_save_yloop: + + lda hposn_low,X + sta psx_smc1+1 + sta psx_smc2+1 + + lda hposn_high,X + sta psx_smc1+2 + sec + sbc #$20 + sta psx_smc2+2 + + ldy #$27 +partial_save_xloop: +psx_smc1: + lda $d000,Y +psx_smc2: + sta $d000,Y + dey + bpl partial_save_xloop + + dex + cpx BOX_Y1 + bcs partial_save_yloop + + rts +.endif + + + ;======================= + ; HGR Partial Restore + ;======================= + ; loads from $20 + ; save to $40 + + ; restores from X = A<=to<=X + ; Y = SAVED_Y1 to SAVED_Y2 + +hgr_partial_restore: + sta partial_restore_x1_smc+1 + stx partial_restore_x2_smc+1 + + ldx SAVED_Y2 + +partial_restore_yloop: + + lda hposn_low,X + sta prx_smc2+1 + sta prx_smc1+1 + + lda hposn_high,X + sta prx_smc2+2 + sec + sbc #$20 + sta prx_smc1+2 + +partial_restore_x2_smc: + ldy #$27 +partial_restore_xloop: +prx_smc1: + lda $d000,Y +prx_smc2: + sta $d000,Y + dey +partial_restore_x1_smc: + cpy #$00 + bpl partial_restore_xloop + + dex + cpx SAVED_Y1 + bcs partial_restore_yloop ; bge + + rts diff --git a/games/sb/cliff/keyboard.s b/games/sb/cliff/keyboard.s new file mode 100644 index 00000000..17337067 --- /dev/null +++ b/games/sb/cliff/keyboard.s @@ -0,0 +1,152 @@ + + ;========================== + ; check keyboard + ; for main game + ;========================== + + ; Movement + ; Note in the game, pressing a key starts walking + ; To stop you have to press the same direction again + + ; Text + ; We require ENTER/RETURN pressed before entering text + ; this is mildly annoying, but lets us use + ; WASD to walk. The Apple II+ doesn't have + ; up or down buttons + +check_keyboard: + + lda KEYPRESS + bmi key_was_pressed + rts + +key_was_pressed: + inc SEEDL + + and #$5f ; strip off high bit and make uppercase + + ;========================== + ; Left + ;========================== +check_left: + cmp #$8 + beq left_pressed + cmp #'A' + bne check_right +left_pressed: ; if peasant_moving_left, stop + ; otherwise clear all movement, move left + + ldx PEASANT_XADD + + jsr stop_peasant + + cpx #$FF ; if not left, start moving left + beq continue_left + + lda #$FF ; move left + sta PEASANT_XADD + +continue_left: + lda #PEASANT_DIR_LEFT + sta PEASANT_DIR + + jmp done_check_keyboard + +check_right: + cmp #$15 + beq right_pressed + cmp #'D' + bne check_up +right_pressed: + + ldx PEASANT_XADD + + jsr stop_peasant + + cpx #$1 ; if already right, stop + beq continue_right + + lda #$1 + sta PEASANT_XADD + +continue_right: + lda #PEASANT_DIR_RIGHT + sta PEASANT_DIR + + jmp done_check_keyboard + +check_up: + cmp #'W' + beq up_pressed + cmp #$0B + bne check_down + +up_pressed: + + ldx PEASANT_YADD + + jsr stop_peasant + + cpx #$FC ; if already up, stop + beq continue_up + + lda #$FC + sta PEASANT_YADD + +continue_up: + + lda #PEASANT_DIR_UP + sta PEASANT_DIR + + + jmp done_check_keyboard + +check_down: + cmp #'S' + beq down_pressed + cmp #$0A + bne check_enter + +down_pressed: + + ldx PEASANT_YADD + + jsr stop_peasant + + cpx #$04 ; if already down, stop + beq continue_down + + lda #$4 + sta PEASANT_YADD + +continue_down: + lda #PEASANT_DIR_DOWN + sta PEASANT_DIR + + jmp done_check_keyboard + +check_enter: + cmp #13 + beq enter_pressed + cmp #' ' + bne done_check_keyboard +enter_pressed: +; jsr clear_bottom +; jsr hgr_input + +; jsr parse_input + +; jsr clear_bottom + +done_check_keyboard: + + bit KEYRESET + + rts + +stop_peasant: + lda #0 + sta PEASANT_XADD + sta PEASANT_YADD + rts + diff --git a/games/sb/cliff/move_peasant.s b/games/sb/cliff/move_peasant.s new file mode 100644 index 00000000..2c09b7f0 --- /dev/null +++ b/games/sb/cliff/move_peasant.s @@ -0,0 +1,253 @@ +; Move that Peasant! + +move_peasant: + + ; redraw peasant if moved + + lda PEASANT_XADD + ora PEASANT_YADD + bne really_move_peasant + + jmp peasant_the_same + +really_move_peasant: + + ; restore bg behind peasant + + jsr erase_peasant + + ;========================= + ;========================= + ; move peasant + ;========================= + ;========================= + + + ;========================== + ; first move in X direction + + clc + lda PEASANT_X + adc PEASANT_XADD ; A = new X + + bmi peasant_x_negative ; if newx <0, handle + + cmp #40 + bcs peasant_x_toobig ; if newx>=40, hanfle (bge) + + + ;====================================== + ; not off screen, so check if collision + + pha + + tay + ; FIXME: should we add YADD first, like we do in peasant_move_tiny? + + ldx PEASANT_Y + jsr peasant_collide + + pla + + bcc do_move_peasant_y ; no X collide + + ;================================== + ; we collided in X, so stop moving + + jsr stop_peasant ; stop moving + + ; leave PEASANT_X same as was + lda PEASANT_X + jmp do_move_peasant_y + + ;============================ +peasant_x_toobig: + + jsr move_map_east + + lda #0 ; new X location + + jmp done_movex + + ;============================ +peasant_x_negative: + + jsr move_map_west + + lda #39 ; new X location + + jmp done_movex + + ; check edge of screen +done_movex: + ; if we get here we changed screens + sta PEASANT_X ; update new location + jmp peasant_the_same ; skip checking for Y collision + + + + ; Move Peasant Y +do_move_peasant_y: + sta PEASANT_X + clc + lda PEASANT_Y + adc PEASANT_YADD ; newy in A + + cmp #45 ; if <45 then off screen + bcc peasant_y_negative ; blt + + cmp #160 ; if >=150 then off screen + bcs peasant_y_toobig ; bge + + ; check collide + + pha + + ldy PEASANT_X + tax ; newy + jsr peasant_collide + + pla + + bcc done_movey ; no collide + + jsr stop_peasant ; stop moving + + lda PEASANT_Y ; leave same + + jmp done_movey + + + ;============================ +peasant_y_toobig: + + jsr move_map_south + + lda #45 ; new X location + + jmp done_movey + + + ;============================ +peasant_y_negative: + + jsr move_map_north + + lda #160 ; new X location + + jmp done_movey + + ; check edge of screen +done_movey: + sta PEASANT_Y + + ; if we moved off screen, don't re-draw peasant ? + +peasant_the_same: + + rts + + + ;=========================== + ; erase peasant + ;=========================== + + ; restore bg behind peasant +erase_peasant: + lda PEASANT_Y + sta SAVED_Y1 + clc + adc #28 + sta SAVED_Y2 + + ldx PEASANT_X + txa + inx + + jmp hgr_partial_restore ; tail call + + + + +; when peasants collide + + ;=================== + ; peasant_collide + ;=================== + ; newx/7 in Y + ; newy in X + ; returns C=0 if no collide + ; C=1 if collide +peasant_collide: + ; rrrr rtii top 5 bits row, bit 2 top/bottom + + ; add 28 to collide with feet + txa + clc + adc #28 + tax + + txa + and #$04 ; see if odd/even + beq peasant_collide_even + +peasant_collide_odd: + lda #$f0 + bne peasant_collide_mask ; bra + +peasant_collide_even: + lda #$0f +peasant_collide_mask: + + sta MASK + + txa + lsr + lsr ; need to divide by 8 then * 2 + lsr ; can't just div by 4 as we need to mask bottom bit + asl + tax + + lda gr_offsets,X + sta INL + lda gr_offsets+1,X + sta INH + + lda (INL),Y ; get value + + and MASK + +; ldy MASK +; cpy #$f0 +; beq in_top +;in_bottom: +; and #$0f +; jmp done_feet +;in_top: +; lsr +; lsr +; lsr +; lsr +;done_feet: + + beq collide_true ; true if color 0 + ;bne collide_false + +collide_false: + clc + rts + +collide_true: + sec + rts + + +move_map_east: +move_map_west: +move_map_north: +move_map_south: + rts + + +.include "gr_offsets.s" + diff --git a/games/sb/cliff/wait.s b/games/sb/cliff/wait.s new file mode 100644 index 00000000..12c4319c --- /dev/null +++ b/games/sb/cliff/wait.s @@ -0,0 +1,18 @@ +; copy of ROM wait +; because we might disable ROM + + +wait: + sec +wait2: + pha +wait3: + sbc #$01 + bne wait3 + pla + sbc #$01 + bne wait2 + rts +wait_end: + +.assert (>wait_end - >wait) < 1 , error, "wait crosses page boundary" diff --git a/games/sb/cliff/zp.inc b/games/sb/cliff/zp.inc new file mode 100644 index 00000000..c260e6da --- /dev/null +++ b/games/sb/cliff/zp.inc @@ -0,0 +1,348 @@ + +JS_BUTTON_STATE = $03 +JOYSTICK_ENABLED= $04 +SOUND_STATUS = $05 + SOUND_DISABLED = $80 + SOUND_IN_LC = $01 ; sound in language card + SOUND_MOCKINGBOARD = $02 ; mockingboard detected + SOUND_SSI263 = $04 ; SSI-263 speech chip detected +MOCKINGBOARD_SLOT = $06 +DISP_PAGE = $07 ; only in videlectrix intro? +DRAW_PAGE = $08 +NIBCOUNT = $09 +CURRENT_DRIVE = $0A +DRIVE1_DISK = $0B +DRIVE2_DISK = $0C +DRIVE1_TRACK = $0D +DRIVE2_TRACK = $0E + +TEMP0 = $10 +TEMP1 = $11 +TEMP2 = $12 +TEMP3 = $13 +TEMP4 = $14 +TEMP5 = $15 + +; zx02 code +offset = $10 +offseth = $11 +ZX0_src = $12 +ZX0_dst = $14 +ZX0_srch= $15 +bitr = $16 +pntr = $17 +pntrh = $18 +; electric duet +FREQ1 = $10 +FREQ2 = $11 +DURATION = $12 +INSTRUMENT1 = $13 +INSTRUMENT2 = $14 +MADDRL = $15 +MADDRH = $16 +LOC4E = $4E +COUNT256 = $4F + + +HGR_BITS = $1C + +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +MASK = $2E +MASK_COUNTDOWN = $2F +PEASANT_PRIORITY = $30 + +SEEDL = $4E +SEEDH = $4F + + +INVENTORY_MASK = $60 +INVENTORY_Y = $61 + +CURSOR_X = $63 +CURSOR_Y = $64 +FRAME = $65 +ALTFIRE = $66 +ALTL = $67 +ALTH = $68 +SAVED_X = $69 +PEASANT_XADD = $6A +PEASANT_YADD = $6B +LEVEL_OVER = $6C + NEW_LOCATION = $FF + NEW_FROM_DISK = $01 + NEW_FROM_LOAD = $02 ; loaded from load/save menu +KERREK_SPEED = $6D +KERREK_DIRECTION= $6E ; 0 = left, 1=right + KERREK_LEFT = 0 + KERREK_RIGHT = 1 + + +SPEECH_PTRL = $70 +SPEECH_PTRH = $71 + +; pt3 player registers +AY_REGISTERS = $70 +A_FINE_TONE = $70 +A_COARSE_TONE = $71 +B_FINE_TONE = $72 +B_COARSE_TONE = $73 +C_FINE_TONE = $74 +C_COARSE_TONE = $75 +NOISE = $76 +ENABLE = $77 +PT3_MIXER_VAL = $77 +A_VOLUME = $78 +B_VOLUME = $79 +C_VOLUME = $7A +ENVELOPE_FINE = $7B +ENVELOPE_COARSE = $7C +ENVELOPE_SHAPE = $7D +PATTERN_L = $7E +PATTERN_H = $7F + + +; rest of pt3_player +PT3_TEMP = $80 +ORNAMENT_L = $81 +ORNAMENT_H = $82 +SAMPLE_L = $83 +SAMPLE_H = $84 +LOOP = $85 +MB_VALUE = $86 +MB_ADDR_L = $87 +MB_ADDR_H = $88 +DONE_PLAYING = $89 +DONE_SONG = $8A +APPLEII_MODEL = $8B + +ESC_PRESSED = $8C +PREVIOUS_LOCATION= $8D + + + +;======================= +; savegame state +;======================= + +WHICH_LOAD = $90 +PEASANT_X = $91 +PEASANT_Y = $92 +PEASANT_DIR = $93 + PEASANT_DIR_UP = 0 + PEASANT_DIR_RIGHT = 1 + PEASANT_DIR_LEFT = 2 + PEASANT_DIR_DOWN = 3 + +GAME_STATE_3 = $94 +; SWORD_THROWN = $01 + +MAP_LOCATION = $96 + +GAME_STATE_0 = $97 + BABY_IN_WELL=$01 + BUCKET_DOWN_WELL=$02 + TALKED_TO_MENDELEV=$04 + HALDO_TO_DONGOLEV=$08 + ARROW_BEATEN=$10 + GARY_SCARED=$20 + LADY_GONE=$40 + TRINKET_GIVEN=$80 +GAME_STATE_1 = $98 + FISH_FED=$01 ; also implies man gone and inn open + PUDDLE_WET=$02 + IN_HAY_BALE=$04 + ALREADY_GOT_ROOM=$08 + RAINING=$10 + NIGHT=$20 + POT_ON_HEAD=$40 + WEARING_ROBE=$80 +GAME_STATE_2 = $99 + ON_FIRE = $01 + COTTAGE_ROCK_MOVED=$02 + KNUCKLES_BLEED=$04 + DRESSER_OPEN=$08 + TALKED_TO_KNIGHT = $10 + COVERED_IN_MUD = $20 + GOT_MUDDY_ALREADY = $40 + GREASE_ON_HEAD =$80 + +NED_STATUS = $9A + ; 0 = hiding (no increment) + ; 1..127 = count up to appearing + ; 126,255 = hands on tree + ; 127,254 = half out + ; 128 = out (no increment) + +BUSH_STATUS = $9B ; status of bush search + BUSH_1_SEARCHED = $01 + BUSH_2_SEARCHED = $02 + BUSH_3_SEARCHED = $04 + BUSH_4_SEARCHED = $08 + +KERREK_STATE = $9C + KERREK_ALIVE = $00 + KERREK_DEAD = $01 + KERREK_DECOMPOSING = $02 + KERREK_SKELETON = $03 + KERREK_ROW1 = $40 + KERREK_ONSCREEN = $80 + +ARROW_SCORE = $9D ; bottom=score, top=random num needed 3-5? + ARROW_DONE = $80 + +SCORE_HUNDREDS = $9E +SCORE_TENSONES = $9F + +INVENTORY_1 = $A0 + INV1_ARROW = $01 + INV1_BABY = $02 + INV1_KERREK_BELT = $04 + INV1_CHICKEN_FEED = $08 + INV1_BOW = $10 + INV1_MONSTER_MASK = $20 + INV1_PEBBLES = $40 + INV1_PILLS = $80 + +INVENTORY_2 = $A1 + INV2_RICHES = $01 + INV2_ROBE = $02 + INV2_SODA = $04 + INV2_MEATBALL_SUB = $08 + INV2_TRINKET = $10 + INV2_TROGHELM = $20 + INV2_TROGSHIELD = $40 + INV2_TROGSWORD = $80 + +INVENTORY_3 = $A2 + INV3_IMPOSSIBLE = $01 + INV3_SHIRT = $02 + INV3_MAP = $04 + +INVENTORY_1_GONE = $A3 ; had item, but now it's gone +INVENTORY_2_GONE = $A4 +INVENTORY_3_GONE = $A5 +KERREK_X = $A6 ; should be in save area, as we use +KERREK_Y = $A7 ; for skeleton location + +VISITED_0 = $A8 ; for MAP drawing purposes +VISITED_1 = $A9 +VISITED_2 = $AA +VISITED_3 = $AB + +END_OF_SAVE = $AC + +;============================================= + +CURRENT_VERB = $B0 ; parser +CURRENT_NOUN = $B1 +WORD_MATCH = $B2 + +INPUT_X = $C0 +BOX_X1L = $C1 +BOX_X1H = $C2 +BOX_Y1 = $C3 +BOX_X2L = $C4 +BOX_X2H = $C5 +BOX_Y2 = $C6 +SAVED_Y1 = $C7 +SAVED_Y2 = $C8 + +; temp for animations, etc +BABY_COUNT = $C9 +PREV_X = $CA +PREV_Y = $CB + +; D0-D? used by HGR? + +WHICH_SLOT = $DA +CURRENT_DISK = $DC +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +P0 = $F1 +P1 = $F2 +P2 = $F3 +P3 = $F4 +P4 = $F5 +P5 = $F6 + + +INL = $FC +INH = $FD +OUTL = $FE +OUTH = $FF + +; constants + +LOAD_VID_LOGO = 0 +LOAD_TITLE = 1 +LOAD_INTRO = 2 +LOAD_COPY_CHECK = 3 +LOAD_PEASANT1 = 4 +LOAD_PEASANT2 = 5 +LOAD_PEASANT3 = 6 +LOAD_PEASANT4 = 7 +LOAD_TROGDOR = 8 +LOAD_ENDING = 9 +LOAD_MUSIC = 10 +LOAD_CLIFF = 11 +LOAD_GAME_OVER = 12 +LOAD_INVENTORY = 13 +LOAD_PARSE_INPUT= 14 +LOAD_INN = 15 +LOAD_INSIDE = 16 +LOAD_ARCHERY = 17 +LOAD_MAP = 18 + +LOAD_SAVE1 = 19 +LOAD_SAVE2 = 20 +LOAD_SAVE3 = 21 + + +VGI_RCOLOR = P0 +VGI_RX1 = P1 +VGI_RY1 = P2 +VGI_RXRUN = P3 +VGI_RYRUN = P4 +VGI_RCOLOR2 = P5 ; only for dither +COUNT = TEMP5 + + +; LOCATIONS +LOCATION_POOR_GARY = 0 +LOCATION_KERREK_1 = 1 +LOCATION_OLD_WELL = 2 +LOCATION_YELLOW_TREE = 3 +LOCATION_WATERFALL = 4 +LOCATION_HAY_BALE = 5 +LOCATION_MUD_PUDDLE = 6 +LOCATION_ARCHERY = 7 +LOCATION_RIVER_STONE = 8 +LOCATION_MOUNTAIN_PASS = 9 +LOCATION_JHONKA_CAVE = 10 +LOCATION_YOUR_COTTAGE = 11 +LOCATION_LAKE_WEST = 12 +LOCATION_LAKE_EAST = 13 +LOCATION_OUTSIDE_INN = 14 +LOCATION_OUTSIDE_NN = 15 +LOCATION_WAVY_TREE = 16 +LOCATION_KERREK_2 = 17 +LOCATION_OUTSIDE_LADY = 18 +LOCATION_BURN_TREES = 19 +LOCATION_CLIFF_BASE = 20 +LOCATION_CLIFF_HEIGHTS = 21 +LOCATION_TROGDOR_OUTER = 22 +LOCATION_TROGDOR_LAIR = 23 +LOCATION_HIDDEN_GLEN = 24 +LOCATION_INSIDE_LADY = 25 +LOCATION_INSIDE_NN = 26 +LOCATION_INSIDE_INN = 27 +LOCATION_ARCHERY_GAME = 28 +LOCATION_MAP = 29 + +LOCATION_EMPTY = 30 diff --git a/games/sb/cliff_graphics/Makefile b/games/sb/cliff_graphics/Makefile deleted file mode 100644 index a1e21801..00000000 --- a/games/sb/cliff_graphics/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -include ../../../Makefile.inc - -ZX02 = ~/research/6502_compression/zx02.git/build/zx02 -f -PNG_TO_HGR = ../../../utils/hgr-utils/png2hgr -LINKER_SCRIPTS = ../../../linker_scripts -DOS33 = ../../../utils/dos33fs-utils/dos33 -EMPTY_DISK = ../../../empty_disk/empty.dsk -TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft -PNG2GR = ../../../utils/gr-utils/png2gr -PNG2SPRITES = ../../../utils/gr-utils/png2sprites -HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite - -all: cliff_base.hgr.zx02 - -#### - -cliff_base.hgr.zx02: cliff_base.hgr - $(ZX02) cliff_base.hgr cliff_base.hgr.zx02 - -cliff_base.hgr: cliff_base.png - $(PNG_TO_HGR) cliff_base.png > cliff_base.hgr - -#### - -clean: - rm -f *~ *.o *.lst -