; Mode-7 Flying code ;=========== ; CONSTANTS ;=========== CONST_SHIPX = 15 CONST_TILE_W = 16 CONST_TILE_H = 16 CONST_MAP_MASK_X = (CONST_TILE_W - 1) CONST_MAP_MASK_Y = (CONST_TILE_H - 1) CONST_LOWRES_W = 40 CONST_LOWRES_H = 40 CONST_BETA_I = $ff CONST_BETA_F = $80 CONST_SCALE_I = $14 CONST_SCALE_F = $00 CONST_LOWRES_HALF_I = $ec ; -(LOWRES_W/2) CONST_LOWRES_HALF_F = $00 mode7_flying: ;=================== ; Clear screen/pages ;=================== bit PAGE0 bit LORES ; Lo-res graphics bit TEXTGR ; mixed gr/text mode bit SET_GR ; set graphics jsr clear_screens lda #0 sta DISP_PAGE lda #4 sta DRAW_PAGE ;=============== ; Init texture ;=============== jsr wires_create_lookup ;=============== ; Init Variables ;=============== lda #20 sta SHIPY lda #0 sta TURNING sta SPACEX_I sta SPACEY_I sta CX_I sta CX_F sta CY_I sta CY_F sta DRAW_SPLASH sta SPEED sta SPLASH_COUNT sta KEY_COUNT sta KEY_OFFSET lda #0 ; slightly off North for better view of island sta ANGLE jsr draw_sky lda #4 ; starts out at 4.5 altitude sta SPACEZ_I lda #$80 sta SPACEZ_F jsr update_z_factor flying_loop: lda SPLASH_COUNT ; 3 beq flying_keyboard ; 2nt/3 dec SPLASH_COUNT ; decrement splash count ; 5 flying_keyboard: ; jsr get_keypress ; get keypress ; 6 lda KEY_COUNT bne done_key ldy KEY_OFFSET lda island_flying_directions,Y sta KEY_COUNT iny lda island_flying_directions,Y sta LASTKEY inc KEY_OFFSET inc KEY_OFFSET done_key: dec KEY_COUNT lda LASTKEY ; cmp #0 ; bne key_was_pressed ; ; jmp check_done ;key_was_pressed: ; lda LASTKEY ; 3 cmp #('Q') ; if quit, then return bne skipskip rts skipskip: cmp #'W' ; 2 bne flying_check_down ; 3/2nt ;=========== ; UP PRESSED ;=========== lda SHIPY cmp #17 bcc flying_check_down ; bgt, if shipy>16 dec SHIPY dec SHIPY ; move ship up inc SPACEZ_I ; incement height jsr update_z_factor lda #0 sta SPLASH_COUNT jmp check_done flying_check_down: cmp #'S' bne flying_check_left ;============= ; DOWN PRESSED ;============= lda SHIPY cmp #28 bcs splashy ; ble, if shipy < 28 inc SHIPY inc SHIPY ; move ship down dec SPACEZ_I ; decrement height jsr update_z_factor bcc done_flying_down splashy: lda #10 sta SPLASH_COUNT done_flying_down: jmp check_done flying_check_left: cmp #'A' bne flying_check_right ;============= ; LEFT PRESSED ;============= lda TURNING bmi turn_left beq turn_left lda #$0 sta TURNING jmp check_done turn_left: lda #253 ; -3 sta TURNING dec ANGLE jmp check_done flying_check_right: cmp #'D' bne check_speedup ;============== ; RIGHT PRESSED ;============== lda TURNING ;; FIXME: optimize me bpl turn_right lda #0 sta TURNING jmp check_done turn_right: lda #3 sta TURNING inc ANGLE jmp check_done check_speedup: cmp #'Z' bne check_speeddown ;========= ; SPEED UP ;========= lda #$8 cmp SPEED beq skip_speedup inc SPEED skip_speedup: jmp check_done check_speeddown: cmp #'X' bne check_brake ;=========== ; SPEED DOWN ;=========== lda SPEED beq skip_speeddown dec SPEED skip_speeddown: jmp check_done check_brake: cmp #' ' bne check_land ;============ ; BRAKE ;============ lda #$0 sta SPEED jmp check_done check_land: cmp #13 bne check_help .if 0 ;===== ; LAND ;===== ; finds value in space_x.i,space_y.i ; returns color in A lda CX_I sta SPACEX_I lda CY_I sta SPACEY_I jsr lookup_map cmp #COLOR_BOTH_LIGHTGREEN bne must_land_on_grass landing_loop: jsr draw_background_mode7 ; Draw Shadow lda #>shadow_forward sta INH lda #ship_forward sta INH lda #splash_forward ; 2 sta INH ; 3 lda #shadow_forward ; 2 sta INH ; 3 lda #ship_forward ; 2 sta INH ; 3 lda #splash_right ; 2 sta INH ; 3 lda #shadow_right ; 2 sta INH ; 3 lda #ship_right ; 2 sta INH ; 3 lda #splash_left ; 2 sta INH ; 3 lda #shadow_left ; 2 sta INH ; 3 lda #ship_left ; 2 sta INH ; 3 lda #