ReC98/th05/main/bullet/lasers_update_render.asm

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