mirror of https://github.com/nmlgc/ReC98.git
121 lines
2.7 KiB
NASM
121 lines
2.7 KiB
NASM
; [playfield_x], [playfield_y], and [distance] are given in units of 1/16th of
|
|
; a pixel.
|
|
; ----------------------------------------------------------------------------
|
|
|
|
; Adds [count] new spark sprites with the given [distance] in random
|
|
; directions away from ([playfield_x], [playfield_y]).
|
|
|
|
; int pascal sparks_add_random(unsigned int playfield_x, unsigned int playfield_y, int distance, int count);
|
|
public SPARKS_ADD_RANDOM
|
|
sparks_add_random proc far
|
|
|
|
@@count = word ptr 6
|
|
@@distance = word ptr 8
|
|
@@playfield_y = word ptr 0Ah
|
|
@@playfield_x = word ptr 0Ch
|
|
|
|
push bp
|
|
mov bp, sp
|
|
cmp [bp+@@playfield_x], (PLAYFIELD_W shl 4)
|
|
ja short @@ret
|
|
cmp [bp+@@playfield_y], (PLAYFIELD_H shl 4)
|
|
ja short @@ret
|
|
push si
|
|
push di
|
|
mov di, [bp+@@count]
|
|
|
|
@@loop:
|
|
mov si, _spark_next_free_offset
|
|
add si, offset _sparks
|
|
cmp [si+spark_t.flag], 0
|
|
jnz short @@wrap_offset?
|
|
mov word ptr [si+spark_t.flag], 1
|
|
mov ax, [bp+@@playfield_x]
|
|
mov [si+spark_t.pos.cur.x], ax
|
|
mov ax, [bp+@@playfield_y]
|
|
mov [si+spark_t.pos.cur.y], ax
|
|
call randring2_next16_and pascal, ((2 shl 4) - 1)
|
|
add ax, [bp+@@distance]
|
|
lea bx, [si+spark_t.pos.velocity]
|
|
call vector2_near pascal, bx, [si+spark_t.SPARK_ANGLE], ax
|
|
|
|
@@wrap_offset?:
|
|
add _spark_next_free_offset, size spark_t
|
|
cmp _spark_next_free_offset, SPARK_COUNT * size spark_t
|
|
jb short @@more?
|
|
mov _spark_next_free_offset, 0
|
|
|
|
@@more?:
|
|
dec di
|
|
jnz short @@loop
|
|
pop di
|
|
pop si
|
|
|
|
@@ret:
|
|
pop bp
|
|
retf 8
|
|
sparks_add_random endp
|
|
|
|
|
|
; Adds [count] new spark sprites along a circle with the given [distance] away
|
|
; from ([playfield_x], [playfield_y]). Obviously ignores the random angle set
|
|
; in sparks_init().
|
|
|
|
; int pascal sparks_add_circle(unsigned int playfield_x, unsigned int playfield_y, int distance, int count);
|
|
public SPARKS_ADD_CIRCLE
|
|
sparks_add_circle proc near
|
|
|
|
@@count = word ptr 4
|
|
@@distance = word ptr 6
|
|
@@playfield_y = word ptr 8
|
|
@@playfield_x = word ptr 0Ah
|
|
|
|
push bp
|
|
mov bp, sp
|
|
cmp [bp+@@playfield_x], (PLAYFIELD_W shl 4)
|
|
ja short @@ret
|
|
cmp [bp+@@playfield_y], (PLAYFIELD_H shl 4)
|
|
ja short @@ret
|
|
push si
|
|
push di
|
|
mov di, [bp+@@count]
|
|
shl di, 8
|
|
|
|
@@loop:
|
|
mov si, _spark_next_free_offset
|
|
add si, offset _sparks
|
|
cmp [si+spark_t.flag], 0
|
|
jnz short @@wrap_offset?
|
|
mov word ptr [si+spark_t.flag], 1
|
|
mov ax, [bp+@@playfield_x]
|
|
mov [si+spark_t.pos.cur.x], ax
|
|
mov ax, [bp+@@playfield_y]
|
|
mov [si+spark_t.pos.cur.y], ax
|
|
lea ax, [si+spark_t.pos.velocity]
|
|
push ax
|
|
xor dx, dx
|
|
mov ax, di
|
|
div [bp+@@count]
|
|
xor ah, ah
|
|
push ax
|
|
push [bp+@@distance]
|
|
call vector2_near
|
|
|
|
@@wrap_offset?:
|
|
add _spark_next_free_offset, size spark_t
|
|
cmp _spark_next_free_offset, SPARK_COUNT * size spark_t
|
|
jb short @more?
|
|
mov _spark_next_free_offset, 0
|
|
|
|
@more?:
|
|
sub di, 256
|
|
jnz short @@loop
|
|
pop di
|
|
pop si
|
|
|
|
@@ret:
|
|
pop bp
|
|
retn 8
|
|
sparks_add_circle endp
|
|
nop
|