From 16a5352f43c9f4454b2322efa802b1934de3d7c9 Mon Sep 17 00:00:00 2001 From: Pecusx Date: Mon, 12 Aug 2024 21:46:39 +0200 Subject: [PATCH] Almost finish --- artwork/shapes.asm | 2 +- dino.asm | 35 ++- dino.asm.bak | 748 --------------------------------------------- dino.xex | Bin 6862 -> 6919 bytes 4 files changed, 29 insertions(+), 756 deletions(-) delete mode 100644 dino.asm.bak diff --git a/artwork/shapes.asm b/artwork/shapes.asm index 097e427..1a981a2 100644 --- a/artwork/shapes.asm +++ b/artwork/shapes.asm @@ -142,7 +142,7 @@ ShapesTableH .by >ground_1 .by >ground_2 diff_object_gap ; min distance between obstacles by difficulty level - :DIFF_LEVELS .by 20-# + .by 18,17,15,13,11,9,8,7,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5 ;----------vars---------- diff_level .ds 1 DinoJumpTr .by 1,2,3,4,4,3,2,1 diff --git a/dino.asm b/dino.asm index 7de5bf3..49c2d5d 100644 --- a/dino.asm +++ b/dino.asm @@ -1,6 +1,6 @@ SCR_HEIGHT = 8 WORLD_LENGTH = 64 -DIFF_LEVELS = 16 +DIFF_LEVELS = 20 ; No internet ;--------------------------------------------------- @@ -17,6 +17,7 @@ swap_table=$0600 ; table for swap bytes in left characters :) .zpvar DinoState .byte ; 0/1 - walk, 2/3 - crouch, 4... - jump .zpvar JumpPhase .byte .zpvar Hit .byte + .zpvar Level .byte ;--------------------------------------------------- icl 'lib/ATARISYS.ASM' icl 'lib/MACRO.ASM' @@ -332,10 +333,19 @@ Shift lda WorldTable+1,y sta WorldTable,y iny - cpy #WORLD_LENGTH-1 + cpy #WORLD_LENGTH bne Shift lda #0 ;ground sta WorldTable,y + ; or sometimes mountain :) + lda RANDOM + and #%00011111 ; 32:1 + bne no_mountain + lda #13 + sta WorldTable-1,y + ora #$80 + sta WorldTable,y +no_mountain ; now we can insert random object to world end ; check if there is enough of the gap between obstacles @@ -359,14 +369,23 @@ insertObject lda RANDOM and #%00000001 ; insert 50/50 beq noInsert - randomize 8 13 ; cactuses and hole + lda diff_level + cmp #2 + bcs AddBirds +NoBirds + randomize 8 12 ; cactuses and hole + bne Drawn +AddBirds + randomize 7 12 ; cactuses and hole +Drawn + cmp #7 ; if bird then selec one shape from 3 + bne NoBird + randomize 2 7 + and #%11111110 +NoBird sta WorldTable+WORLD_LENGTH-2 ora #$80 sta WorldTable+WORLD_LENGTH-1 - inc diff_level - - - noInsert rts .endp @@ -384,6 +403,8 @@ noInsert bne ScoreReady lda #$10 ; 0 character code sta score+3 + ; if score gets next 100 - level up + inc diff_level inc score+2 lda score+2 cmp #$1a ; 9+1 character code diff --git a/dino.asm.bak b/dino.asm.bak deleted file mode 100644 index ab2dbc3..0000000 --- a/dino.asm.bak +++ /dev/null @@ -1,748 +0,0 @@ -SCR_HEIGHT = 8 -WORLD_LENGTH = 64 -DIFF_LEVELS = 16 - -; No internet -;--------------------------------------------------- - OPT r+ - -swap_table=$0600 ; table for swap bytes in left characters :) - -;--------------------------------------------------- -; Zpage variables - .zpvar temp_w .word = $80 - .zpvar temp_b .byte - .zpvar DinoWalkPhase .byte - .zpvar DinoState .byte ; 0/1 - walk, 2/3 - crouch, 4... - jump - .zpvar JumpPhase .byte - .zpvar Hit .byte -;--------------------------------------------------- - icl 'lib/ATARISYS.ASM' - icl 'lib/MACRO.ASM' -;--------------------------------------------------- - ; dark screean and BASIC off - ORG $2000 - mva #0 dmactls ; dark screen - mva #$ff portb - ; and wait one frame :) - waitRTC ; or waitRTC ? - mva #$ff portb ; BASIC off - rts - ini $2000 -;--------------------------------------------------- - - org $2000 -;--------------------------------------------------- -; 4 charsets for fine scroll -font1 - ins 'artwork/dino1.fnt' ; 1 charset -font2 = font1+$400 - ins 'artwork/dino2.fnt' ; 2 charset -font3 = font2+$400 - ins 'artwork/dino3.fnt' ; 3 charset -font4 = font3+$400 - ins 'artwork/dino4.fnt' ; 4 charset -; and 4 charsets for left game :) -font1l=font4+$400 -font2l=font1l+$400 -font3l=font2l+$400 -font4l=font3l+$400 - - org font4l+$400 -; screen data -; SCR_HEIGHT lines 256bytes each -screen - .ds $100*SCR_HEIGHT -; display list -GameDL - :13 .byte SKIP8 ; empty lines - - .byte MODE2+LMS ; gr.8+LMS - .word status_line - - .byte SKIP8 ; empty lines - - .rept SCR_HEIGHT, # - .byte MODE2+LMS+SCH ; gr.0+LMS+HSCRL -line:1_addr - .word screen+$100*# - .endr - .byte JVB - .word GameDL -status_line - dta d" l-hi 00000 r-hi 00000 00000 " -score=status_line+33 -rhiscore=status_line+19 -lhiscore=status_line+7 -;--------------------------------------------------- -; World table without dino -WorldTable - :WORLD_LENGTH .byte 0 ; ground -;--------------------------------------------------- -FirstSTART - jsr GenerateCharsets - jsr SetGameScreen - jsr FadeColors -NewGame - jsr SetStart -EndLoop - ;lda #$32 - ;sta COLBAK - jsr WorldToScreen - jsr ShowDino - lda Hit - bne EndGame - ;lda #$5f - ;sta COLBAK - jsr CheckJoy - mva #>font2 chbas - waitRTC ; or waitRTC ? - mva #3 hscrol - mva #>font3 chbas - waitRTC ; or waitRTC ? - mva #2 hscrol - jsr WorldShift ; better place (flickering) - mva #>font4 chbas - waitRTC ; or waitRTC ? - mva #1 hscrol - jsr Animate - mva #>font1 chbas - waitRTC ; or waitRTC ? - mva #4 hscrol - jmp EndLoop -EndGame - key - jsr HiScoreR - jmp NewGame - rts - -;----------------------------------------------- -; Generation of character sets 2,3 and 4 of 1 -; By copying and horizontal shift dino -;----------------------------------------------- -.proc GenerateCharsets - ; copy charset 1 to 2,3 and 4 (but not dino chars) - ldy #0 -CopyLoop - ; no dino characters - lda font1,y - sta font2,y - sta font3,y - sta font4,y - sta font1l,y - sta font2l,y - sta font3l,y - sta font4l,y - lda font1+$200,y - sta font2+$200,y - sta font3+$200,y - sta font4+$200,y - sta font1l+$200,y - sta font2l+$200,y - sta font3l+$200,y - sta font4l+$200,y - lda font1+$300,y - sta font2+$300,y - sta font3+$300,y - sta font4+$300,y - sta font1l+$300,y - sta font2l+$300,y - sta font3l+$300,y - sta font4l+$300,y - ; dino characters - only to 'left' charsets - lda font1+$100,y - sta font1l+$100,y - lda font2+$100,y - sta font2l+$100,y - lda font3+$100,y - sta font3l+$100,y - lda font4+$100,y - sta font4l+$100,y - iny - bne CopyLoop - ; create table for swapping - ldy #0 -@ sty temp_b - .REPT 8 - rol temp_b - ror @ - .ENDR - sta swap_table,y - iny - bne @- - ; swap bits in bharacters - ldy #0 -SwapLoop - lda font1+$100,y - tax - lda swap_table,x - sta font1l+$100,y - lda font2+$100,y - tax - lda swap_table,x - sta font2l+$100,y - lda font3+$100,y - tax - lda swap_table,x - sta font3l+$100,y - lda font4+$100,y - tax - lda swap_table,x - sta font4l+$100,y - lda font1+$200,y - tax - lda swap_table,x - sta font1l+$200,y - lda font2+$200,y - tax - lda swap_table,x - sta font2l+$200,y - lda font3+$200,y - tax - lda swap_table,x - sta font3l+$200,y - lda font4+$200,y - tax - lda swap_table,x - sta font4l+$200,y - iny - bne SwapLoop - rts -.endp -;----------------------------------------------- -.proc ClearWorld - ldy #WORLD_LENGTH-1 ; world size - lda #0 ; ground -@ sta WorldTable,y - dey - bpl @- - rts -.endp -.proc ClearScreen - ldy #44 ; visible screen len - lda #0 -ClearLoop - sta screen+$700,y - sta screen+$600,y - sta screen+$500,y - sta screen+$400,y - sta screen+$300,y - sta screen+$200,y - sta screen+$100,y - dey - bne ClearLoop - rts -.endp -;----------------------------------------------- -.proc WorldToScreen - jsr ClearScreen - ldx #0 ; start position - stx temp_b -ToScreenLoop - lda WorldTable,x - bmi NothingToDraw - tay - jsr ShowObject -NothingToDraw - inc temp_b - ldx temp_b - cpx #WORLD_LENGTH - bne ToScreenLoop - rts -.endp -;----------------------------------------------- -.proc WorldShift - jsr ScoreUp - ldy #0 -Shift - lda WorldTable+1,y - sta WorldTable,y - iny - cpy #WORLD_LENGTH-1 - bne Shift - lda #0 ;ground - sta WorldTable,y - ; now we can insert random object to world end - - ; check if there is enough of the gap between obstacles - - ; get the gap for the given difficulty level - ldx diff_level - lda #WORLD_LENGTH - sec - sbc diff_object_gap,x - tax - - ; is there a gap? -@ - lda WorldTable,x - bne noInsert - inx - cpx #WORLD_LENGTH - bne @- - ;all zeroes -insertObject - lda RANDOM - and #%00000001 ; insert 50/50 - beq noInsert - randomize 8 13 ; cactuses and hole - sta WorldTable+WORLD_LENGTH-2 - ora #$80 - sta WorldTable+WORLD_LENGTH-1 - inc diff_level - - - -noInsert - rts -.endp -;----------------------------------------------- -.proc ScoreUp - inc score+4 - lda score+4 - cmp #$1a ; 9+1 character code - bne ScoreReady - lda #$10 ; 0 character code - sta score+4 - inc score+3 - lda score+3 - cmp #$1a ; 9+1 character code - bne ScoreReady - lda #$10 ; 0 character code - sta score+3 - inc score+2 - lda score+2 - cmp #$1a ; 9+1 character code - bne ScoreReady - lda #$10 ; 0 character code - sta score+2 - inc score+1 - lda score+1 - cmp #$1a ; 9+1 character code - bne ScoreReady - lda #$10 ; 0 character code - sta score+1 - inc score -ScoreReady - rts -.endp -;----------------------------------------------- -.proc Animate - ldy #WORLD_LENGTH -@ lda WorldTable,y - tax - and #%01111111 - beq NoBird - cmp #8 ; first cactus - bcs NoBird - ; then animate bird - txa - eor #%0000001 - sta WorldTable,y -NoBird - dey - bpl @- - ; animate Dino - lda DinoWalkPhase - eor #%00000001 - sta DinoWalkPhase - ; jump - lda DinoState - cmp #4 ; jump state - bne NoJump - lda JumpPhase - cmp #JumpLen ; max jump phase - beq EndJump - inc JumpPhase - rts -EndJump - lda #0 - sta JumpPhase - sta DinoState -NoJump - rts -.endp -;----------------------------------------------- -; Show Object on screen -; X - y position -; Y - shape nr -;----------------------------------------------- -.proc ShowObject - lda ShapesTableL,y - sta temp_w - lda ShapesTableH,y - sta temp_w+1 - ldy #0 -ObjectLoop - lda (temp_w),y - bmi @+ - sta screen+$400,x -@ adw temp_w #2 - lda (temp_w),y - bmi @+ - sta screen+$500,x -@ adw temp_w #2 - lda (temp_w),y - bmi @+ - sta screen+$600,x -@ adw temp_w #2 - lda (temp_w),y - bmi @+ - sta screen+$700,x -@ sbw temp_w #6 - inx - iny - cpy #2 ; object width - bne ObjectLoop - rts -.endp -;----------------------------------------------- -; Show Dino on screen (test) -;----------------------------------------------- -.proc ShowDino - ldx #5 ; position - lda DinoState - ora DinoWalkPhase ; shape - tay - lda DinoShapesTableL,y - sta temp_w - lda DinoShapesTableH,y - sta temp_w+1 - cpy #4 ; jump - beq Jump - cpy #5 ; jump - beq Jump - ldy #0 -DinoLoop - lda (temp_w),y - bmi @+ - lda screen+$500,x - beq NotHit0b - lda #$5b ; hit mark - sta Hit - bne Hit0b -NotHit0b - lda (temp_w),y -Hit0b - sta screen+$500,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - lda screen+$600,x - beq NotHit0c - lda #$5b ; hit mark - sta Hit - bne Hit0c -NotHit0c - lda (temp_w),y -Hit0c - sta screen+$600,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - sta screen+$700,x -@ sbw temp_w #10 - inx - iny - cpy #5 ; dino width - bne DinoLoop - rts -Jump - ldy JumpPhase - lda DinoJumpTr,y - cmp #2 - jeq jPhase2 - cmp #3 - jeq jPhase3 - cmp #4 - jeq jPhase4 -jPhase1 - ldy #0 -DinoLoop1 - lda (temp_w),y - bmi @+ - lda screen+$400,x ; check obstacle - beq NotHit1a - lda #$5b ; make hit mark - sta Hit - bne Hit1a -NotHit1a - lda (temp_w),y -Hit1a - sta screen+$400,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - lda screen+$500,x ; check obstacle - beq NotHit1b - lda #$5b ; make hit mark - sta Hit - bne Hit1b -NotHit1b - lda (temp_w),y -Hit1b - sta screen+$500,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - lda screen+$600,x ; check obstacle - beq NotHit1c - lda #$5b ; make hit mark - sta Hit - bne Hit1c -NotHit1c - lda (temp_w),y -Hit1c - sta screen+$600,x -@ sbw temp_w #10 - inx - iny - cpy #5 ; dino width - bne DinoLoop1 - rts -jPhase2 - ldy #0 -DinoLoop2 - lda (temp_w),y - bmi @+ - sta screen+$300,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - lda screen+$400,x ; check obstacle - beq NotHit2a - lda #$5b ; make hit mark - sta Hit - bne Hit2a -NotHit2a - lda (temp_w),y -Hit2a - sta screen+$400,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - lda screen+$500,x ; check obstacle - beq NotHit2b - lda #$5b ; make hit mark - sta Hit - bne Hit2b -NotHit2b - lda (temp_w),y -Hit2b - sta screen+$500,x -@ sbw temp_w #10 - inx - iny - cpy #5 ; dino width - bne DinoLoop2 - rts -jPhase3 - ldy #0 -DinoLoop3 - lda (temp_w),y - bmi @+ - sta screen+$200,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - sta screen+$300,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - lda screen+$400,x ; check obstacle - beq NotHit3a - lda #$5b ; make hit mark - sta Hit - bne Hit3a -NotHit3a - lda (temp_w),y -Hit3a - sta screen+$400,x -@ sbw temp_w #10 - inx - iny - cpy #5 ; dino width - bne DinoLoop3 - rts -jPhase4 - ldy #0 -DinoLoop4 - lda (temp_w),y - bmi @+ - sta screen+$100,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - sta screen+$200,x -@ adw temp_w #5 - lda (temp_w),y - bmi @+ - sta screen+$300,x -@ sbw temp_w #10 - inx - iny - cpy #5 ; dino width - bne DinoLoop4 - rts -.endp -;----------------------------------------------- -.proc CheckJoy - lda DinoState - cmp #4 ; jump state - beq NoChange - lda STICK0 - and #%00000010 ; down - beq Down - lda STICK0 - and #%00000001 ; up - beq Up - ; check keyboard - lda SKSTAT - cmp #$f7 ; SHIFT - beq Down - cmp #$ff - beq Walk - lda kbcode - cmp #@kbcode._space - beq Up -Walk - lda #0 - sta DinoState -NoChange - rts -Up lda #4 - sta DinoState - lda #0 - sta JumpPhase - rts -Down - lda #2 - sta DinoState - rts -.endp -;----------------------------------------------- -.proc SetStart - jsr ClearWorld - lda #0 - sta DinoWalkPhase - sta DinoState - sta diff_level - sta Hit - ; clear score - lda #$10 - sta score - sta score+1 - sta score+2 - sta score+3 - sta score+4 - rts -.endp -;----------------------------------------------- -.proc HiScoreR - lda rhiscore - cmp score - bcc higher1 - bne lower - lda rhiscore+1 - cmp score+1 - bcc higher2 - bne lower - lda rhiscore+2 - cmp score+2 - bcc higher3 - bne lower - lda rhiscore+3 - cmp score+3 - bcc higher4 - bne lower - lda rhiscore+4 - cmp score+4 - bcc higher5 -lower - rts -higher1 - lda score - sta rhiscore -higher2 - lda score+1 - sta rhiscore+1 -higher3 - lda score+2 - sta rhiscore+2 -higher4 - lda score+3 - sta rhiscore+3 -higher5 - lda score+4 - sta rhiscore+4 - rts -.endp -;----------------------------------------------- -.proc HiScoreL - lda lhiscore - cmp score - bcc higher1 - bne lower - lda lhiscore+1 - cmp score+1 - bcc higher2 - bne lower - lda lhiscore+2 - cmp score+2 - bcc higher3 - bne lower - lda lhiscore+3 - cmp score+3 - bcc higher4 - bne lower - lda lhiscore+4 - cmp score+4 - bcc higher5 -lower - rts -higher1 - lda score - sta lhiscore -higher2 - lda score+1 - sta lhiscore+1 -higher3 - lda score+2 - sta lhiscore+2 -higher4 - lda score+3 - sta lhiscore+3 -higher5 - lda score+4 - sta lhiscore+4 - rts -.endp -;----------------------------------------------- -.proc FadeColors - ldy #0 - sty COLOR1 -FadeColor - sty COLOR2 - sty COLOR4 - waitRTC - iny - cpy #$10 - bne FadeColor - lda #$0f - sta COLOR2 - sta COLOR4 - rts -.endp -;----------------------------------------------- -.proc SetGameScreen - mwa #GameDL dlptrs - lda #%00111110 ; normal screen width, DL on, P/M on - sta dmactls - mva #>font1 chbas - rts -.endp -;-------------------------------------------------- - icl 'artwork/shapes.asm' -;-------------------------------------------------- - - run FirstSTART diff --git a/dino.xex b/dino.xex index 33aea41f45321975e6055a3686e45bdd107bb875..8f03d645d63045b7d3d93ce0a48198bcef5e0001 100644 GIT binary patch delta 498 zcmX?S+HST%LxAzrWKDsCYP$jz8Uq!Wd=#byC@^|@tmVI?$@1YRn7Z&YL*ZzE!gp_l zX_Ey6MTL|DeU5r0C>-@tIOwyq{eq7|>|}F6Q^q5ca|I!OV@wj030;u&HND<=)qqV1lPBLxa2J%j_ZuptWae))WWCJqU zPqJSCi-R~!n*Vxt0S)Wjt?ZHTF3@9bpvOt63l=K{dILS)1$e9t0C6>e+yIYvr-LT< z2v@O93u*h^KIez?OtXtV>&2TUP9p0x44nntVbeP52DZ zEgwowGGAc!;q*Jn0;EDWJBkJ~vcnY37E2KWD=Gpjy5kC2!LW2Cf+?*Wj bY^*5YOwi>ZMkZz!7G@^K2TTu{_ILmQuVBNL delta 452 zcmZoSJ7>B;V4jU zvVfqd(8mCuqaFzgN4*sKeU`Rg@KMm7Y%XZZIB9aOpd?31_HrkKdB;zFJJzMu*mSJ=$P2J_=Lm& rg@cfQh_H~L06!lu4>uPl2Rj?<