diff --git a/background.chr b/background.chr index b585044..9c986c5 100644 Binary files a/background.chr and b/background.chr differ diff --git a/plat.nes b/plat.nes index 856d640..8535f8d 100644 Binary files a/plat.nes and b/plat.nes differ diff --git a/plat.s b/plat.s index dbe3be4..d7c7e5a 100644 --- a/plat.s +++ b/plat.s @@ -327,25 +327,40 @@ gamepad_poll: .segment "RODATA" level: -.byte 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 -.byte 0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1 -.byte 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 -.byte 0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1 -.byte 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +.byte 0,1,0,0,1,0,0,0,0,1,0,0,2,7,7,3 +.byte 0,0,0,0,0,0,0,0,0,1,0,0,6,0,0,9 +.byte 0,1,0,0,1,0,0,0,0,1,0,0,6,0,0,9 +.byte 0,0,1,1,0,0,0,0,0,1,0,0,4,8,8,5 +.byte 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0 +.byte 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0 +.byte 0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0 +.byte 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0 +.byte 0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0 +.byte 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -.byte 0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0 -.byte 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0 -.byte 0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0 -.byte 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0 -.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + +block_x: .res 1 +block_y: .res 1 +block_w: .res 1 +block_h: .res 1 metatiles: .byte 0,0,0,0,0 -.byte 3,4,5,6,1 +.byte $14,$15,$16,$17,1 ; Full block +.byte $14,$18,$1B,$0,1 ; up / left +.byte $18,$15,$0,$19,1 ; up / right +.byte $1B,$0,$16,$1A,1 ; down / left +.byte $0,$19,$1A,$17,1 ; down / right +.byte $1B,$0,$1B,$0,1 ; left +.byte $18,$18,$0,$0,1 ; up +.byte $0,$0,$1A,$1A,1 ; down +.byte $0,$19,$0,$19,1 ; right +.byte 3,3,3,3,0 +.byte 3,4,5,6,0 example_palette: .byte $0F,$00,$3D,$20 ; greyscale @@ -385,6 +400,7 @@ var_p: .res 1 jump_pressed_last_frame: .res 1 frame_counter: .res 1 +last_frame_jumped: .res 1 .segment "CODE" main: @@ -405,6 +421,7 @@ main: lda #0 sta frame_counter + sta last_frame_jumped jsr init_objects @loop: @@ -526,6 +543,14 @@ init_objects: sta player_vel_y sta player_status + lda #64 + sta block_x + sta block_y + + lda #16 + sta block_w + sta block_h + rts draw: @@ -554,7 +579,7 @@ movement: cmp #0 beq :+ ldx #1 - lda #3 + lda #2 sta player_vel_x lda player_status @@ -566,7 +591,7 @@ movement: cmp #0 beq :+ ldx #1 - lda #253 + lda #254 sta player_vel_x lda player_status @@ -607,9 +632,12 @@ movement: beq @fail_jump ; If jump last frame, forget it ; Jump newly pressed this frame - lda #250 + lda #249 sta player_vel_y + lda frame_counter + sta last_frame_jumped + @fail_jump: jsr btn_a @@ -618,7 +646,9 @@ movement: ; Gravity lda frame_counter - and #1 + sec + sbc last_frame_jumped + and #%00000001 cmp #0 bne :+ lda player_vel_y @@ -633,6 +663,31 @@ movement: adc player_vel_y sta player_pos_y + ; Apply X velocity + lda player_pos_x + clc + adc player_vel_x + sta player_pos_x + + ; load x pos, filter blocks, check up and down + + lda player_vel_y + cmp #0 + bmi :+ ; branch if moving up + jsr downward_collision_check + jsr left_collision_check + jsr right_collision_check + jsr upward_collision_check + jmp :++ + : + jsr upward_collision_check + jsr left_collision_check + jsr right_collision_check + jsr downward_collision_check + : + + rts + ; Keep grounded cmp #200 bcc :+ @@ -641,7 +696,6 @@ movement: lda #200 sta player_pos_y : - ; Bonk lda #8 cmp player_pos_y @@ -652,13 +706,6 @@ movement: sta player_pos_y : - ; Apply X velocity - lda player_pos_x - clc - adc player_vel_x - sta player_pos_x - - rts update_background: @@ -1012,3 +1059,281 @@ btn_a: lsr rts +downward_collision_check: + lda #0 + sta var_n + @begin_check: + lda player_pos_x + ldx var_n + cpx #0 + bne :+ + sec + sbc #6 + jmp :++ + : + clc + adc #5 + : + ; divide by 16 + clc + ror + clc + ror + clc + ror + clc + ror + sta temp_x + + lda player_pos_y + ; divide by 16 + clc + adc #8 + clc + ror + clc + ror + clc + ror + clc + ror + tay + + lda #16 + jsr mul_y + adc temp_x + tax + lda level, X + cmp #0 + beq :+ + tya + asl + asl + asl + asl + sec + sbc #8 + cmp player_pos_y + bcs :+ + sta player_pos_y + lda #0 + sta player_vel_y + : + + ldx var_n + inx + stx var_n + cpx #1 + beq @begin_check + + rts + +upward_collision_check: + lda #0 + sta var_n + @begin_check: + lda player_pos_x + ldx var_n + cpx #0 + bne :+ + sec + sbc #6 + jmp :++ + : + clc + adc #5 + : + ; divide by 16 + clc + ror + clc + ror + clc + ror + clc + ror + sta temp_x + + lda player_pos_y + ; divide by 16 + sec + sbc #8 + clc + ror + clc + ror + clc + ror + clc + ror + tay + + lda #16 + jsr mul_y + adc temp_x + tax + lda level, X + cmp #0 + beq :+ + iny + tya + asl + asl + asl + asl + clc + adc #8 + cmp player_pos_y + bcc :+ + sta player_pos_y + lda #0 + sta player_vel_y + : + + ldx var_n + inx + stx var_n + cpx #1 + beq @begin_check + + rts + +right_collision_check: + lda #0 + sta var_n + @begin_check: + lda player_pos_x + ; divide by 16 + clc + adc #8 + clc + ror + clc + ror + clc + ror + clc + ror + sta temp_x + + lda player_pos_y + ldx var_n + cpx #0 + bne :+ + sec + sbc #7 + jmp :++ + : + clc + adc #6 + : + ; divide by 16 + clc + ror + clc + ror + clc + ror + clc + ror + tay + + lda #16 + jsr mul_y + adc temp_x + tax + lda level, X + cmp #0 + beq :+ + lda temp_x + asl + asl + asl + asl + sec + sbc #8 + cmp player_pos_x + bcs :+ + sta player_pos_x + lda #0 + sta player_vel_x + : + + ldx var_n + inx + stx var_n + cpx #1 + beq @begin_check + + rts + +left_collision_check: + lda #0 + sta var_n + @begin_check: + lda player_pos_x + ; divide by 16 + sec + sbc #8 + clc + ror + clc + ror + clc + ror + clc + ror + sta temp_x + + lda player_pos_y + ldx var_n + cpx #0 + bne :+ + sec + sbc #7 + jmp :++ + : + clc + adc #6 + : + ; divide by 16 + clc + ror + clc + ror + clc + ror + clc + ror + tay + + lda #16 + jsr mul_y + adc temp_x + tax + lda level, X + cmp #0 + beq :+ + lda temp_x + clc + adc #1 + asl + asl + asl + asl + clc + adc #8 + cmp player_pos_x + bcc :+ + sta player_pos_x + lda #0 + sta player_vel_x + : + + ldx var_n + inx + stx var_n + cpx #1 + beq @begin_check + + rts