mirror of https://github.com/nmlgc/ReC98.git
249 lines
5.4 KiB
NASM
249 lines
5.4 KiB
NASM
@LASER_RENDER_RAY$QRX14LASER_COORDS_T procdesc pascal near \
|
|
coords:word
|
|
|
|
public @lasers_render$qv
|
|
@lasers_render$qv proc near
|
|
|
|
@@radius = byte ptr -0Ah
|
|
@@width_orig = byte ptr -9
|
|
@@end_distance_orig = word ptr -8
|
|
@@draw_y = word ptr -6
|
|
@@draw_x = word ptr -4
|
|
@@i = word ptr -2
|
|
|
|
push bp
|
|
mov bp, sp
|
|
sub sp, 0Ah
|
|
push si
|
|
push di
|
|
mov si, offset _lasers
|
|
mov [bp+@@i], 0
|
|
jmp @@more_lasers?
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@laser_loop:
|
|
cmp [si+laser_t.flag], LF_FREE
|
|
jz @@next_laser
|
|
mov al, [si+laser_t.coords.LASER_width]
|
|
mov [bp+@@width_orig], al
|
|
mov [bp+@@radius], al
|
|
push offset _drawpoint
|
|
push [si+laser_t.coords.origin.x]
|
|
push [si+laser_t.coords.origin.y]
|
|
push (16 shl 4)
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
push ax
|
|
call vector2_at
|
|
mov ax, _drawpoint.x
|
|
sar ax, 4
|
|
add ax, 32
|
|
mov [bp+@@draw_x], ax
|
|
mov ax, _drawpoint.y
|
|
sar ax, 4
|
|
add ax, 16
|
|
mov [bp+@@draw_y], ax
|
|
cmp [si+laser_t.flag], LF_SHOOTOUT_DECAY
|
|
jz @@decay
|
|
cmp [bp+@@radius], 2
|
|
jnb short @@draw_outer_circle?
|
|
mov [bp+@@radius], 2
|
|
|
|
@@draw_outer_circle?:
|
|
cmp [si+laser_t.coords.LASER_width], 3
|
|
jb short @@draw_inner_circle?
|
|
mov ah, [si+laser_t.LASER_color]
|
|
call @grcg_setcolor_direct_raw$qv
|
|
cmp [si+laser_t.coords.starts_at_distance], (16 shl 4)
|
|
jg short @@draw_outer_ray?
|
|
push [bp+@@draw_x]
|
|
push [bp+@@draw_y]
|
|
mov al, [bp+@@radius]
|
|
mov ah, 0
|
|
push ax
|
|
call grcg_circlefill
|
|
mov al, [bp+@@radius]
|
|
add al, -2
|
|
mov [bp+@@radius], al
|
|
|
|
@@draw_outer_ray?:
|
|
cmp [si+laser_t.coords.ends_at_distance], (2 shl 4)
|
|
jle short @@draw_inner
|
|
mov ax, [si+laser_t.coords.ends_at_distance]
|
|
mov [bp+@@end_distance_orig], ax
|
|
sub [si+laser_t.coords.ends_at_distance], (2 shl 4)
|
|
lea ax, [si+laser_t.coords]
|
|
call @laser_render_ray$qrx14laser_coords_t pascal, ax
|
|
mov ax, [bp+@@end_distance_orig]
|
|
mov [si+laser_t.coords.ends_at_distance], ax
|
|
|
|
@@draw_inner:
|
|
cmp [si+laser_t.coords.LASER_width], 5
|
|
jb short @@sub_2
|
|
mov al, [si+laser_t.coords.LASER_width]
|
|
add al, -4
|
|
jmp short @@set_inner_width
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@sub_2:
|
|
mov al, [si+laser_t.coords.LASER_width]
|
|
add al, -2
|
|
|
|
@@set_inner_width:
|
|
mov [si+laser_t.coords.LASER_width], al
|
|
|
|
@@draw_inner_circle?:
|
|
mov ah, V_WHITE
|
|
call @grcg_setcolor_direct_raw$qv
|
|
cmp [si+laser_t.coords.starts_at_distance], (16 shl 4)
|
|
jg short @@draw_inner_ray_or_line?
|
|
push [bp+@@draw_x]
|
|
push [bp+@@draw_y]
|
|
mov al, [bp+@@radius]
|
|
mov ah, 0
|
|
push ax
|
|
call grcg_circlefill
|
|
|
|
@@draw_inner_ray_or_line?:
|
|
cmp [si+laser_t.coords.LASER_width], 1
|
|
ja short @@draw_inner_ray
|
|
push offset _drawpoint
|
|
push [si+laser_t.coords.origin.x]
|
|
push [si+laser_t.coords.origin.y]
|
|
push [si+laser_t.coords.starts_at_distance]
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
push ax
|
|
call vector2_at
|
|
push offset _laser_line_endpoint
|
|
push [si+laser_t.coords.origin.x]
|
|
push [si+laser_t.coords.origin.y]
|
|
push [si+laser_t.coords.ends_at_distance]
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
push ax
|
|
call vector2_at
|
|
mov ax, _drawpoint.x
|
|
sar ax, 4
|
|
add ax, 32
|
|
mov _drawpoint.x, ax
|
|
mov ax, _drawpoint.y
|
|
sar ax, 4
|
|
add ax, 16
|
|
mov _drawpoint.y, ax
|
|
mov ax, _laser_line_endpoint.x
|
|
sar ax, 4
|
|
add ax, 32
|
|
mov _laser_line_endpoint.x, ax
|
|
mov ax, _laser_line_endpoint.y
|
|
sar ax, 4
|
|
add ax, 16
|
|
mov _laser_line_endpoint.y, ax
|
|
push _drawpoint.x
|
|
push _drawpoint.y
|
|
push _laser_line_endpoint.x
|
|
push ax
|
|
call grcg_line
|
|
jmp @@width_reset
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@draw_inner_ray:
|
|
lea ax, [si+laser_t.coords]
|
|
call @laser_render_ray$qrx14laser_coords_t pascal, ax
|
|
or ax, ax
|
|
jz @@width_reset
|
|
mov [si+laser_t.flag], LF_FREE
|
|
jmp @@width_reset
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@decay:
|
|
mov ah, V_WHITE
|
|
call @grcg_setcolor_direct_raw$qv
|
|
shl [bp+@@radius], 3
|
|
push offset _drawpoint
|
|
push [si+laser_t.coords.origin.x]
|
|
push [si+laser_t.coords.origin.y]
|
|
mov al, [bp+@@radius]
|
|
mov ah, 0
|
|
push ax
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
add ax, 40h
|
|
push ax
|
|
call vector2_at
|
|
xor di, di
|
|
jmp @@more_decay_lines?
|
|
; ---------------------------------------------------------------------------
|
|
|
|
@@decay_line_draw:
|
|
push offset _laser_line_endpoint
|
|
push _drawpoint.x
|
|
push _drawpoint.y
|
|
push [si+laser_t.coords.ends_at_distance]
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
push ax
|
|
call vector2_at
|
|
push offset _drawpoint
|
|
push _drawpoint.x
|
|
push _drawpoint.y
|
|
push [si+laser_t.coords.starts_at_distance]
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
push ax
|
|
call vector2_at
|
|
mov ax, _drawpoint.x
|
|
sar ax, 4
|
|
add ax, 32
|
|
mov _drawpoint.x, ax
|
|
mov ax, _drawpoint.y
|
|
sar ax, 4
|
|
add ax, 16
|
|
mov _drawpoint.y, ax
|
|
mov ax, _laser_line_endpoint.x
|
|
sar ax, 4
|
|
add ax, 32
|
|
mov _laser_line_endpoint.x, ax
|
|
mov ax, _laser_line_endpoint.y
|
|
sar ax, 4
|
|
add ax, 16
|
|
mov _laser_line_endpoint.y, ax
|
|
push _drawpoint.x
|
|
push _drawpoint.y
|
|
push _laser_line_endpoint.x
|
|
push ax
|
|
call grcg_line
|
|
push offset _drawpoint
|
|
push [si+laser_t.coords.origin.x]
|
|
push [si+laser_t.coords.origin.y]
|
|
mov al, [bp+@@radius]
|
|
mov ah, 0
|
|
push ax
|
|
mov al, [si+laser_t.coords.angle]
|
|
mov ah, 0
|
|
add ax, (-4 shl 4)
|
|
push ax
|
|
call vector2_at
|
|
inc di
|
|
|
|
@@more_decay_lines?:
|
|
cmp di, 2
|
|
jl @@decay_line_draw
|
|
|
|
@@width_reset:
|
|
mov al, [bp+@@width_orig]
|
|
mov [si+laser_t.coords.LASER_width], al
|
|
|
|
@@next_laser:
|
|
inc [bp+@@i]
|
|
add si, size laser_t
|
|
|
|
@@more_lasers?:
|
|
cmp [bp+@@i], LASER_COUNT
|
|
jl @@laser_loop
|
|
pop di
|
|
pop si
|
|
leave
|
|
retn
|
|
@lasers_render$qv endp
|