248 lines
No EOL
3.4 KiB
NASM
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 |