taytyypa-menna-nopeasti/level.asm
2026-07-12 22:16:25 +03:00

248 lines
No EOL
3.4 KiB
NASM

; Level data and drawing routines
; See main.asm for level state management
draw_level:
pusha
call get_backbuffer
call clear_screen
mov si, level_data
mov dx, 12
.rows:
mov cx, 20
.tiles:
lodsb
xor ah, ah
mov di, ax
mov ax, 20
sub ax, cx
shl ax, 4
mov bx, 12
sub bx, dx
shl bx, 4
cmp di, 'x'
jne .not_wall
call draw_box
.not_wall:
cmp di, '@'
jne .not_hazard
push ax
mov ah, 5
call set_ink
pop ax
call draw_hazard
push ax
mov ah, 7
call set_ink
pop ax
.not_hazard:
cmp di, 'W'
jne .not_goal
push ax
mov ah, 3
call set_ink
pop ax
call draw_goal
push ax
mov ah, 7
call set_ink
pop ax
.not_goal:
loop .tiles
dec dx
test dx, dx
jnz .rows
popa
ret
; ax = X
; bx = Y
draw_box:
pusha
mov dl, 1
; (0, 0) -> (1, 0)
mov si, ax
mov di, bx
add si, 15
call draw_line
; (0, 0) -> (1, 1)
add di, 15
call draw_line
; (0, 0) -> (0, 1)
sub si, 15
call draw_line
; (0, 1) -> (1, 1)
add bx, 15
add si, 15
call draw_line
; (1, 0) -> (1, 1)
add ax, 15
sub bx, 15
call draw_line
; (1, 0) -> (0, 1)
sub si, 15
call draw_line
popa
ret
; ax = X
; bx = Y
draw_hazard:
pusha
mov dl, 1
; (0, 15) -> (3, 0)
mov si, ax
mov di, bx
add bx, 15
add si, 3
call draw_line
; (8, 15) -> (11, 0)
add ax, 8
add si, 8
call draw_line
; (12, 0) -> (15, 15)
xchg ax, si
xchg bx, di
inc ax
add si, 7
call draw_line
; (4, 0) -> (7, 15)
sub ax, 8
sub si, 8
call draw_line
popa
ret
; ax = X
; bx = Y
draw_goal:
pusha
; (1,1) -> (1,14)
mov dl, 1
inc ax
inc bx
mov si, ax
mov di, bx
add di, 13
call draw_line
; (1,14) -> (14, 14)
add bx, 13
add si, 13
call draw_line
; (14, 14) -> (14, 1)
add ax, 13
sub di, 13
call draw_line
; (14, 1) -> (11, 10)
sub bx, 13
sub si, 3
add di, 9
call draw_line
; (11,10) -> (8,1)
xchg ax, si
xchg bx, di
sub si, 6
call draw_line
; (7,1) -> (4, 10)
xchg ax, si
xchg bx, di
dec ax
sub si, 7
call draw_line
; (4,10) -> (1,1)
xchg ax, si
xchg bx, di
sub si, 6
call draw_line
popa
ret
; ax = X
; bx = Y
; tile -> al
; ??? -> ah
get_tile_at:
cmp ax, 0
jl .oob
cmp bx, 0
jl .oob
cmp ax, SCREEN_WIDTH
jge .oob
cmp bx, PLAYFIELD_HEIGHT
jge .oob
push bx
shr ax, 4
shr bx, 4
shl bx, 2
add ax, bx
shl bx, 2
add bx, ax
mov al, [level_data + bx]
pop bx
ret
.oob:
mov al, '.'
ret
section data
LEVEL_WIDTH_TILES equ 20
LEVEL_HEIGHT_TILES equ 12
level_data resb LEVEL_WIDTH_TILES*LEVEL_HEIGHT_TILES
LEVELS equ 3
intro_messages:
dw .level0
dw .level1
dw .level2
.level0 db 'Nappaa kruunu.$'
.level1 db 'Varo piikkej', 132, '.$'
.level2 db 'T', 132, 'ytyyp', 132, ' menn', 132, ' nopeasti.$'
level_walls:
; Level 0
db 15,0,15, 8,0,1, 8,0,1, 8,0,1, 8,0,1, 8,0,1,
db 8,0,1, 8,0,1, 8,0,1, 8,0,1, 8,0,1, 15,0,15
; Level 1
db 0,6,0, 0,57,192, 0,192,48, 1,0,8, 2,0,4, 2,0,4
db 2,0,4, 1,0,8, 0,192,48, 0,57,192, 0,6,0, 0,0,0
; Level 2
db 14,0,1, 10,0,1, 10,0,15, 8,0,9, 8,0,8, 15,128,24
db 15,192,9, 1,0,9, 0,0,1, 0,0,1, 0,0,15, 15,255,0
; TODO
db 8,0,0, 1,0,0, 0,0,0, 13,0,0, 4,0,0, 1,0,0
db 4,0,0, 1,0,0, 4,0,0, 1,0,0, 4,0,0, 4,0,0
level_objects:
dw .level0
dw .level1
dw .level2
.level0 db 46, 255
.level1 db 93, 71, 91, 111, 72, 73, 74, 94, 114, 255
.level2 db 99, 87, 187, 233, 215, 255
; TODO
db 1, 20, 40, 2, 255
level_spawns:
dw 152, 90
dw 120, 90
dw 152, 10
level_timers:
dw 150
dw 200
dw 150
section code